挑衅cnn

完成深度学习算法时要遵循的实践原则:
1.使用适当的日志和有意义的变量名。
在TensorFlow中,你可以通过名称来跟踪不同的变量,并在TensorBoard中可视化图形。最重要的是,在每个训练步骤中,你都能记录相关的值,比如:step_number、accuracy、loss、learning_rate,甚至有时候还包括一些更具体的值,比如mean_intersection_over_union。之后,就可以画出每一步的损失曲线。
2.确保网络连接正确。
使用TensorBoard或其他debug技术确保图中的每个操作的输入和输出都准确无误,还要确保在将数据和标签送入网络之前对其进行适当的预处理和配对。
3.实施数据增强技术。
虽然这一点并不是对所有情况都适用,不过如果你在搞图像相关的神经网络,用简单的数据增强技术处理一下图像,例如镜像、旋转、随机裁剪和重新缩放、添加噪声、弹性变形等,大部分时候出来的效果都有巨大提升。
4.对所有层使用权重初始化和正则化。
不要把权重初始化为相同的值,当然你要是把它们都初始化成0……那就更糟了,这可能会引入对称性,并且导致梯度消失,大多数时候都会导致糟糕的结果。
一般情况下,如果你在权重初始化时遇到问题,你可以考虑在神经网络中添加批量标准化层(Batch Normalization Layer)。关于批量标准化层,可以看这篇名为《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》的论文,链接:arxiv.org/abs/1502.03167
5.确保正则化条款不会压倒损失函数中的其他项。
关闭正则化,找出损失的数量级,然后适当调整正则化权重。确保在增加正则化强度时,损失也在增加。
6.尝试过拟合一个小数据集。
关闭正则化/丢失/数据增强,拿出训练集的一小部分,让神经网络练它几个世纪,确保可以实现零损失,不然就很可能是错误的。
在某些情况下,将损失驱动为零非常具有挑战性,例如,如果您的损失涉及每个像素的softmax-ed logits和ground truth labels之间的交叉熵,那么在语义分割中可能真的难以将其降低到0。相反,你应该争取达到接近100%的准确度。
可以在tf.metrics.accuracy这里了解如何通过获取softmax-ed logits的argmax并将其与ground truth labels进行比较来计算。
7.在过拟合上述小数据集的同时,找到合理的学习率。
从较大的学习率开始,如果训练标准发散,就用最大学习率除以3再试试,直到观察不到发散为止。
8.梯度检查。
如果您在图表中使用自定义操作,则梯度检查尤其重要。
改进损失:
1.确认用的损失函数是合适的,优化的张量也是对的。
2.用个好点的优化器。
3.确认变量真的在训练。
要检查这个,就得看张量板的直方图。或者写个脚本,在几个不同的训练实例 (training instances) 中,算出每个张量的范数。
4.调整初始学习率,实施适当的学习率计划。
如果损失越来越大,可能是初始学习率太大;如果损失几乎不变,可能是初始学习率太小。不管怎样,一旦找到好用的初始学习率,就要进行学习率衰减计划。像AMA这样的优化器,内部就有学习率衰减机制。但它可能衰减得不够激烈,还是自己做一个比较好。确认没有过拟合。做个学习率 vs 训练步数的曲线,如果像是抛物线可能就过拟合了。
变量训练:
1.确认TF把它看做可训练 (trainable) 的变量。
2.确认没发生梯度消失。如果下游变量 (更靠近output的变量) 训练正常,而上游变量不训练,大概就是梯度消失了。
3.确认ReLU (线性整流函数) 还在放电。
如果大部分神经元电压都保持在零了,可能就要改变一下权重初始化策略了:尝试用一个不那么激烈的学习率衰减,并且减少权重衰减正则化。
梯度消失(爆炸):
1.考虑用个好点的权重初始化策略。尤其是在,训练之初梯度就不怎么更新的情况下,这一步尤为重要。
2.考虑换一下激活函数。比如ReLU,就可以拿Leaky ReLU或者MaxOut激活函数来代替。
3.如果是RNN (递归神经网络) 的话,就可以用LSTM block。
过拟合:
1.做个数据扩增。
2.做个Dropout。在训练的每一步,都抛弃一些神经元。
3.增加正则化。
4.做个批量归一化。
5.做个提前终止 (early stopping) 。
6.还不行的话,就用个小一点的网络吧。不过,没到万不得已,还是别这样。
见异思迁:
1.考虑用个带权重的损失函数。
比如,在图像的语义分割中,神经网络要给每一个像素归类。其中一些类别,可能很少有像素属于它。如果,给这些不常被光顾的类别,加个权重,mean_iou这项指标就会好一些。
2.改变网络架构。之前的网络,可能太深,可能太浅了。
3.考虑把几个模型集成起来用。
4.用跨步卷积 (strided convolution) 来代替最大池化/平均池化。
5.做个完整的超参数搜索。
6.改变随机种子 (random seeds) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值