脚本宝典收集整理的这篇文章主要介绍了神经网络开发食谱,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
新年新气象:鸽了漫长时间的公众号终于重新开张了,这次公众号的写作主题将围绕深度学习,参考了Andrej教授和一些大佬的开发经验,首先对神经网络的整体架构进行理论和技术探讨。本节将描述神经网络模型构建的开发体系进行学习。
训练神经网络时会出现很多漏洞,并非我们认知上简单的调包,调参即可使用。很多情况,尽管构建了错误的网络模型(训练图像忘记检测反转图像,自回归模型将它预测的数据作为输入,或者权重,正则化等等配置);大多数情况它仍在训练,我们无法检测出它出现了什么问题。所以,成功开发神经网络最需要的就是有一套完整的体系,耐心,以及对细节的关注。
your_data = #导入你的数据集
model = SuperCrossValidator(SuoerDuper.fit, your_data, ResNet50, SGDOptimizer) #设置你的网络
开始训练神经网络我们会觉得很容易。因为许多库和框架可以让我们在短短二三十行的代码来解决我们的数据问题。这会造成一种错误的印象,很多东西是即插即用的。事实上神经网络并非如此,当我们偏离训练ImageNet 分类器时,它并非现成的技术。如果不了解该技术的工作原理,将会出现很多意想不到的失败。。。
当我们错误配置代码时,通常会遇到某些异常。You plugged in an integer where something expected a string. The function only expected 3 arguments. This import failed. That key does not exist. The number of elements in the two lists isn’t equal.之类的问题。这只是训练神经网络的开始,一些代码可能在语法上正确,但是在整个网络中并不正确,这些问题很难发现。例如反向传播是一种有漏洞的抽象,试图忽略它的工作原理将无法应对它带来的问题,构建和调试的神经网络模型效果也会低得多。
例如:
ReLU:非线性ReLU它将神经元阈值设置为0。使用ReLU的全连接层的前向和后向传递的核心包括:
z = np.maximum(0, np.dot(W, x)) #前向传递
dW = np.outer(z > 0, x) #后向传递:W 的局部梯度
如果观察它的一个神经元在前向传递中被设置为0(即z = 0 ,它将不会触发),那么它的权重将为零梯度。这就是所谓的Dying ReLUs问题,如果一个ReLU神经元不幸被初始化他将永远不会出发,或者一个神经元的权重在训练到这个机制的过程中将被一个大的更新淘汰,这个神经元将“永久性死亡“。这就像一个永久性,不可恢复的脑损伤。这些神经元在我们的整个训练集中永远不会为任何实例打开,并且将永远保持死亡状态。
RNN中的梯度爆炸:参考CS231n中的一个例子如下图所示:
这个RNN展开了T个时间布。当我们观察反向传播的作用时,我们会看到通过所有隐藏状态和反向传播的梯度信号总时乘以相同矩阵(递归Whh)并穿插非线性反向传播。当我们取一个属a开始乘以另一个数b(i.e. a * b * b * b * b * b * b…)。如果|b| < 1,那么这个序列要么变成0,或者|b| > 1时爆炸到无穷大。同样的事情发生在RNN的反向传播中(除了b是一个矩阵而不是一个数字以外)。
一切在语法上可能正确的,构建的神经网络效果却很差。这种问题非常苦恼,也许时因为在数据增强部分左右翻转图像时忘记翻转标签。此时我们搭建的网络仍然可以很好的工作,因为我们的网络可以在内部学习检测翻转的图像,然后它将预测值左右翻转。或者在自回归模型中将预测的事物作为输入。或者,当我们尝试剪裁梯度,却剪裁了损失导致训练期间忽略异常值等等问题,如果我们构建的模型报错了,反而是很幸运的,因为大部分时候它会训练,只不过效果很糟糕而已。。。
鉴于以上发生的问题,如果我们想使用神经网络应用到一个新的问题时,我们应该构建一个流程体系。重视它的规则,从简单到复杂构建,在外面对将要发生的事情做出具体假设,通过实验验证他们或者可视化展示,知道我们发现了一些问题。如果我们直接一股脑的对未经验证的模型进行检测,势必需要很久才能找到问题所在。多说无益,开始描述整个开发过程。
训练神经网络的第一步时,无需接触任何神经网络代码,而是从彻底检查数据开始。这一步是非常关键的一步,往往我们在数据处理的某一个步骤会一定程度上的影响实验结果。检查数据重复性问题,损坏的图像标签,数据的不平衡性问题,考虑如何定义分类过程。需要了解样本的局部特征还是全局特征,是否可以预处理,平均化。图像的噪声问题。当我们对数据有了一定的掌握,可以通过一些方法搜索/过滤/排序我们需要的数据(标签类型)并可视化他们的分布观察各轴的异常值,他们会影响数据的质量或预处理中的一些错误。
当处理好数据后,下一阶段是构建完整的训练—评估框架,通过一系列实验验证它的可靠性。我们可以先使用一些简单模型,或非常小的网络(不容易出错的模型)训练,可视化损失,正确率,模型预测,并在此过程使用明确假设进行消融实验。
此阶段的提示和技巧:
-log(1/n_classes)
在初始化时测量softmax。可以为 L2 回归、Huber 损失等导出相同的默认值。 在这个阶段,我们已经充分的掌握了整个数据集,并且有了完整的训练+评估模型,对于任何给定的模型,我们可以重复地训练。在充分认识该问题的基础上,可以很好的将结果与预测结果进行比对。此时我们可以准备更新下一个模型了。寻找一个好的模型通常有两阶段:首先得到一个足够大的模型,它可以过拟合(专注于训练损失),然后对其进行适当的正则化(放弃训练损失用以改善验证损失)。
此阶段的提示和技巧:
到了这一阶段,需要通过放弃一些训练集的准确性进行正则化,获得一些验证准确性。
此阶段的提示和技巧:
最后,为了确保我们的模型是有效的,可以将网络的第一层权重可视化,确保模型获得有意义的良好边缘。如果第一层看起来像噪音,那么可能有问题。同样,隐藏层出现噪音问题也可能存在问题。
此步骤处于网络训练循环中,为了我们的模型实现低验证损失。
此阶段的提示和技巧:
当我们找到了最佳参数和最好的模型架构,仍然可以通过一些方法来提高正确率
此阶段的提示和技巧:
参考了Andrej教授和一些大佬的调参经验,总结了搭建神经网络的所有成功要素。相信这对于我们进一步探索复杂模型,模型改进,论文复现有很大帮助。掌握好整个理论体系,有助于我们进一步的发展,在"搭积木"的道路上越走越远哈.
以上是脚本宝典为你收集整理的神经网络开发食谱全部内容,希望文章能够帮你解决神经网络开发食谱所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。