其他
【他山之石】深度学习调参经验总结
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
地址:https://zhuanlan.zhihu.com/p/345964709
01
1.1 模型拟合能力不够导致模型震荡
"""增加了一层全连接层,之后效果显著,模型虽然也存在loss和acc会有极小幅度的震荡,但是趋向于收敛"""
input(30,300,3) ==> ful_collected_layer(30,300,64) ==> lstm ==> ful_collected_layer ==> ful_collected_layer ==> output
1.3 输入模型的数据没有shuffle导致模型震荡
np.random.seed(110) # 设定种子数,不然下面shuffle之后的y无法与X对应上
np.random.shuffle(X)
np.random.seed(110)
np.random.shuffle(y)
02
2.1 增大学习率
learning_rate = 0.1 ==> learning_rate = 0.01 ==> learning_rate = 0.001
2.2 优化器的选择
tf.train.AdadeltaOptimizer(learning_rate=0.001, rho=0.95, epsilon=1e-08, use_locking=False, name=’Adadelta’)
tf.train.MomentumOptimizer(learning_rate, momentum, use_locking=False, name=’Momentum’, use_nesterov=False)
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name=’Adam’)
tf.train.GradientDescentOptimizer(learning_rate, use_locking=False,name=’GradientDescent’)
03
3.1 查看输入数据中是否存在nan值
"""检验下input_data中是否存在nan值"""
input_data = np.array(input_data).reshape([-1,n_input])
# 这里的input_data 是三维数组必须转成2d
input_data_pd = pd.DataFrame(input_data)
if np.any(input_data_pd.isnull()) == True:
print("input data has nan value!")
list_nan = list(map(tuple, np.argwhere(np.isnan(input_data_pd.values))))
print(list_nan)
3.2 梯度爆炸或者是梯度消失
(1)预训练+微调 (2)梯度剪切 + 权重正则 (3)使用不同的激活函数,比如之前用relu,可以换成tanh或者是elu (4)使用batchnorm (5)使用LSTM网络(如果之前用的是RNN结构) (6)使用残差结构
"""权重L2正则化"""
cross_entropy = -tf.reduce_sum(ys * tf.log(tf.clip_by_value(tf.nn.softmax(prediction), 1e-10, 1.0)))
weights_lossL2 = tf.add(tf.nn.l2_loss(weights_in),tf.nn.l2_loss(weights_out)) * 0.01
regularzation_loss = cross_entropy + weights_lossL2
cost = tf.reduce_mean(regularzation_loss)
"""梯度剪裁"""
opt = tf.train.MomentumOptimizer(learning_rate=0.001, momentum=0.5)
# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(cross_entropy, tf.trainable_variables())
# grads_and_vars is a list of tuples (gradient, variable). Do whatever you
# need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(tf.clip_by_value(gv[0], 0.1, 5.), gv[1]) for gv in grads_and_vars]
# Ask the optimizer to apply the capped gradients.
optimizer = opt.apply_gradients(capped_grads_and_vars)
3.4 这里必须要修改模型结构
04
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“他山之石”历史文章
PyTorch实现断点继续训练
Pytorch/Tensorflow-gpu训练并行加速trick(含代码)
从NumPy开始实现一个支持Auto-grad的CNN框架
pytorch_lightning 全程笔记
深度学习中的那些Trade-off
PyTorch 手把手搭建神经网络 (MNIST)
autograd源码剖析
怎样才能让你的模型更加高效运行?
来自日本程序员的纯C++深度学习库tiny-dnn
MMTracking: OpenMMLab 一体化视频目标感知平台
深度学习和机器视觉top组都在研究什么
pytorch常见的坑汇总
pytorch 中张量基本操作
pytorch计算模型FLOPs和Params
保姆级教程:个人深度学习工作站配置指南
更多他山之石专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!