前言
今天提一个比较轻松的话题,简单探讨数据集大小对深度学习训练的影响。
不知道大家有没有看过这篇文章:Don't use deep learning your data isn't that big
是的,有人对深度学习的局限性提供了一个证据:那就是当你数据比较少的时候,深度学习的作用相比较于其他传统的方法并没有什么优势,相反效果还不如传统的方法。
提出这个说法的作者利用两种方法进行了测试,测试的数据集是MNIST,测试计算机是否能正确识别0和1,采用的方法分别是:
5层的深度神经网络,活函数是双曲正切函数;
另一种方法使用的是李加索变量选择方法,这种方法思想就是挑选10个边际p值最小的像素来进行(用这些值做回归就可以了);
然后得出一个结论:
unnamed-chunk-7-1
那就是使用李加索方法的表现要优于神经网络。What?
正文
那么回到正题,上面的说法到底对不对,我们在数据比较小的时候能否正确地进行深度学习的训练从而达到比较满意的效果?
我们都知道,神经网络相当于一个无限深的万能函数,我们输入变量x然后得到结果y,中间经历了很多复杂的计算过程。理论上,通过传统算法可以解决的问题通过深度学习都可以解决,但是如果神经网络足够深的时候,虽然这个网络的功能很强大,但是如果数据不够,很容易达到过拟合的现象,从而达不到我们要求的效果。
那么数据集过小是否可以通过深度学习来做,我们来测试一下。
一维信号
我们测试数据很简单,不是我们平常使用的三通道RGB图(3 x 256 x 256),而是普通的一通道一维信号(1 x 168)。
signal
上面的文件中,train数据集是161 x 168,第一行是x轴的坐标我们不用理会只需要y轴的数据,然后每40个数据组是一类也就是 2-41、42-81、82-121、122-161,一共四类。而test数据集是81x168,第一行同样是x坐标我们不管,每20个数据组是一类(和train数据组顺序上类别是一样的)。也就是说我们一共有四类信号要进行分类。
label分别为:
我们的训练数据量只有160组,而测试数据量也只有80组。
数据读取
我们采用的深度学习库是,利用的上的库,是一个线性函数处理库,当然我们只是使用它对mat文件的读取功能。
创建一个文件读取,引入以下头文件。
然后我们编写文件读取类:
编写神经网络
写好文件读取代码后,我们来设计一下神经网络,因为数据量很少,所以我们的神经网络的层数也应该下降。否则很容易出现过拟合的现象。
我们首先设计5层的神经网络,两个卷积层,一个池化层,两个线性层,激活函数使用Relu:
训练以及测试
设计好神经网络后,我们来进行训练吧!
首先编写训练块的代码,我们使用的优化策略是SGD随机下降法(带有动能),默认的学习率设置为,验证方式采用经典的分类常用的验证法。
我们首先进行训练然后进行验证准确率,准确率就是每次测试这四种信号正确次数和总次数的比。
好了,开始训练,由于数据量很少,所以在CPU上训练即可。
第一次训练,epoch为1,lr为0.001:
结果看起来很不好嘛…准确率25%,看起来是猜的,损失波动很剧烈,应该是我们学习率调的太高了,接下来调整一下学习率。
第二次训练,epoch为1,lr为0.0001:
loss下降很平缓,但是epoch看起来不够导致loss下降没有彻底,准确率依然很低,让我们来调整一下epoch。
第三次训练,epoch为5,lr为0.0001:
loss下降到一定级别没有再下降,而准确率依然很迷,有可能还是因为学习率过高而导致loss一直卡在一个范围无法彻底下降,我们再试着尝试下降一下学习率。
第四次训练,epoch为2,lr为0.00001:
完美,看来我们摸索出了合适的学习率(),经过10次测试,准确率分别为:100%、100%、100%、100%、100%、100%、100%、100%、100%、98%。
如果我将epoch从2换成1,则是100%、77%、100%、100%、100%、86%、100%、100%、100%、100%。
epoch从1换成3则是:100%、100%、100%、100%、100%、100%、100%、100%、100%、100%。
我们如果修改一下神经网络层为3层全连接层,lr为效果会很差,即使训练10个以上的epochy也不会达到100%的准确率,但是如果将lr下降到,准确率则就会达到100%了:
结论
通过上面的测试,看起来200数量以内的数据集,只要设计层合理,学习率合适,那么准确率也是可以达到比较好的效果。
其实所说的过拟合常常是因为我们设计的神经网络层数过深,但是数据没有那么多,神经网络就会充分“榨干”那些训练数据,过度吸收那些训练集的信息,导致在测试的时候没有那么准确,说以如果数据集过少,可以通过减少层数的方法来减轻错误。
但是如果数据包含的信息很丰富,但是数据量很少,这时候光调整层数就不够了,我们需要一些数据增强的技术扩充数据集,从而“喂饱”神经网络,不至于让神经网络出现异常。当然,数据集扩充是针对含信息量很丰富的信息来实现的,如果信息都像我们之前使用的一维信号一样,一般就没有必要扩充了。
关注Oldpan博客,同步更新博客最新消息,持续酝酿深度学习质量文。
领取专属 10元无门槛券
私享最新 技术干货