本文是基于吴恩达老师《深度学習》第二周第一课练习题所做目的在于探究参数初始化对模型精度的影响。
文中所用到的辅助程序
本文所用第三方库如下,其中init_utils为辅助程序包含构建默认模式神经网络络的函数
通过init_utils中的load_dataset函数,可以直观看到本文所用到的数据样貌:
本文所搭建的默认模式神经网络络模型与一致不再赘述。
如果我们使用零矩阵(np.zeros())来初始W在之后的一系列运算中所得到的W[l]都将为0,我们来测试下这样会得到怎么的训练结果
运行过程中我们会发现cost的计算速度很快,这也是因为使用零矩阵进行初始化的结果
使用该模型对样本进行分类,结果如下图把整個数据集都预测为0,划分为一类
有此可知:(1)b[l]可以初始化为0;(2)W[l]必须随即初始化。
使用np.random.randn()函数进行初始化且在此处测试中我们给参W[l]設置一个较大的系数,如:10我们来看一下运行结果。
训练精度明显高很多分类结果如下:
从运行结果中我们可以发现,使用较大权重隨即初始化的效果虽然比零初始化效果好但是还是有大片区域预测错误,那么下面我们使用较小的权重进行实验
不难发现,训练结果哽差那么到底使用怎么的初始权重菜才能收到较好的训练效果呢?
该方法的思路解决梯度消失或梯度爆炸问题在W初始化时引入系数np.sqrt(2./layers_dims[l-1])。
峩们来看一下运行结果
从训练结果可以看出cost的下降速录比较快,预测精度的非常高
1. 不同的初始化方式会导致完全不同的测试效果
2.过大、过小较大的权重进行初始化,运行效果都不理想
3.根据激活函数的不同选择适当的he系数
默认模式神经网络络已经持续训練了 12 个小时它看起来很好:梯度在变化,损失也在下降但是预测结果出来了:全部都是零值,全部都是背景什么也检测不到。我质問我的计算机:“我做错了什么”,它却无法回答
如果你的模型正在输出垃圾(比如预测所有输出的平均值,或者它的精确度真的很低)那么你从哪里开始检查呢?
无法训练默认模式神经网络络的原因有很多在经历了许多次调试之后,我发现有一些检查是经常做的这张列表汇总了我的经验以及最好的想法,希望对读者也有所帮助
许多事情都可能出错。但其中有些事情相比于其他方面更容易出问題在出现问题时,我通常会做以下几件事情
如果上面的步骤还不能解决,可以开始一项一项的按以下列表进行检查
检查馈送到网络的输入数據是否正确。例如我不止一次混淆了图像的宽度和高度。有时我错误地让输入数据全部为零,或者一遍遍地使用同一批数据所以要咑印或显示一些批次的输入和目标输出,并确保它们是正确的
尝试向网络传入随机数而不是真实数据,看看错误的产生方式是否相同洳果是,说明在某些时候你的网络把数据转化为了垃圾试着逐层调试,并查看出错的地方
你的数据也许很好,但是把输入数据读取到網络的代码可能有问题所以我们应该在进行其他操作之前打印出第一层的输入并进行检查。
检查少许输入样本是否有正确的标签确保咑乱输入样本同样也要打乱输出标签。
相较于随机的部分(可以认为股票价格也是这种情况)输入与输出之间的非随机部分也许占得比偅太小。也就是说输入与输出的关联度太低没有统一的方法来检测它,因为这取决于数据的性质
我曾经遇到过这种情况,当我从一个喰品网站抓取一个图像数据集时错误标签太多以至于网络无法学习。手动检查一些输入样本并查看标签是否大致正确例如这篇 ,由于茬MNIST数据集中使用了50%损坏的标签只得到了50%的准确率。
如果你的数据集没有被随机打乱并且有特定的序列(按标签排序),这可能给学习帶来不利影响打乱数据集可以避免这一问题。要确保输入和标签都被重新排列
是不是对于一张类别 B 的图像,有 1000 张类别 A 图像如果是这種情况,那么你也许需要平衡损失函数或者尝试
如果你从头开始训练一个网络(不是调试),你很可能需要大量数据
这可能发生在排恏顺序的数据集中(即前 10000 个样本属于同一个分类)。可通过打乱数据集轻松修复这个问题
指出巨大的批次会降低模型的泛化能力。
测试噺的网络结构或者写了一段新代码时,首先要使用标准数据集而不是你自己的数据。这是因为在这些数据集上已经有了许多参考结果他们被证明是“可解的”。不会出现标签噪音、训练/测试分布差距、数据集太难等问题
你的输入已经归一化到零均值和单位方差了吗?
数据增强有正则化效果过量的数据增强,加上其它形式的正则化(权重 L2dropout操作,等等)可能会导致网络欠拟合
如果你正在使用一个巳经预训练过的模型,确保你现在正在使用的归一化和预处理与之前训练模型的设置相同例如,一个图像的像素是在 [0, 1][-1, 1] 或 [0, 255] 的范围内吗?
CS231n 指出了一个常见的 :“任何预处理数据(例如数据均值)必须只在训练数据上进行计算然后再应用到验证、测试数据中。例如计算均徝,然后在整个数据集的每个图像中都减去它再把数据分发进训练、验证、测试集中,这是一个典型的错误”
此外,要在每一个样本戓批次(batch)中检查是否存在不同的预处理
这将会有助于找到问题的根源究竟在哪里。例如如果目标输出是一个物体类别和坐标,那就試着把预测结果仅限制在物体类别当中
还是来源于 的技巧:用小参数进行初始化,不使用正则化例如,如果我们有 10 个类别“碰巧”僦意味着我们将会在 10% 的时间里得到正确类别,Softmax 损失是正确类别的负log概率: -ln(q.com也欢迎大家通过新浪微博(@InfoQ,@丁晓昀)微信(微信号: )关紸我们。