目录
简介
本文简单介绍深度学习过程中的一些经验和技巧,希望能对从事深度学习的工作人员和研究人员有所帮助。
参数部分
初始化
不同的激活函数需要搭配不同的初始化方法才能有效提高模型效果。
一般情况下可以使用He Initialization 和 xavier就可以拿到较好效果。
n_inputs = 28 * 28 # MNIST
n_hidden1 = 300
X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")
# 这里只考虑了输入的方差,如果需要同时考虑输出的方差,则需要在he_init的构造函数中加入参数mode="FAN_AVG"
he_init = tf.contrib.layers.variance_scaling_initializer( )
hidden1 = tf.contrib.layers.fully_connected( X, n_hidden1, weights_initializer=he_init, scope="h1" )
结构部分
activation
尝试使用leaky_relu或者prelu等激活函数。
不考虑计算性能的前提下,激活函数的选择优先级一般为:ELU>leakyReLU>ReLU>tanh>logisticELU>leakyReLU>ReLU>tanh>logistic,如果考虑性能的话,可以优先考虑leakyReLU。
normalization
使用Batch Normalization。
Regularization
drop out、l1、l2
最大范数正则化(Max-Norm Regularization) Max-Norm是对每个神经元节点的权值范数进行限制,‖w‖2<r‖w‖2<r。其中rr是超参数 对于一个网络层,其每个节点的参数就是w参数矩阵中每一行的数据,所以在下面的使用过程中,设置axes=1 参考链接:https://www.tensorflow.org/api_docs/python/tf/clip_by_norm 一般会在每次训练结束之后,对w进行限幅。 rr越小,正则化作用越明显,过拟合现象越少。在未使用BN的情况下,这种方法也可以减少梯度弥散或者梯度爆炸的概率
样本部分
数据增强
- 采用数据增强的方法去提高样本规模
训练部分
learning rate
学习率随迭代过程变化
optimizer
Adam
梯度裁剪
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(loss)
capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var)
for grad, var in grads_and_vars]
training_op = optimizer.apply_gradients(capped_gvs)
load preTrain
首先需要定义需要一些tensor(之后需要使用),或者加载meta数据(meta文件中)从其中获得;然后restore模型,加载当前的网络层。
使用辅助任务进行预训练
如果直接获得跟任务相关的labeled数据比较困难,可以先找到一个比较容易获得labeled数据的辅助任务,然后先用这个训练神经网络,再在该任务中使用辅助任务中浅层神经网络的训练好的参数
early stopping
当模型的性能在验证集上开始下降时,停止训练。 可以每个N个step就将当前的模型与最好的模型的性能进行比较,保存更好地模型作为最优模型,一直到迭代次数达到最大迭代次数 可以将early stopping方法与其他正则化方法结合,获得更好的性能。
参考
- https://blog.csdn.net/u012526003/article/details/79164554