Python CNN在Keras:小批量产品的准确度意外下降
我对一个简单的CNN(基于Python CNN在Keras:小批量产品的准确度意外下降,python,machine-learning,neural-network,keras,conv-neural-network,Python,Machine Learning,Neural Network,Keras,Conv Neural Network,我对一个简单的CNN(基于KerasGithub repo的一个样本脚本)有一个问题,我试图(与Keras一起)复制迈克尔·尼尔森(Michael Nielsen)关于深度学习的在线书籍第6章中的一个实验(他在这本书中使用了plain Theano)。我使用了他的超参数,即batch\u size=10和nb\u epoch=60,但用relu代替sigmoid作为激活函数。他的实现达到了99.06%的准确率。令我惊讶的是,我的程序的准确率低于10%,更让我惊讶的是,当我使用batch_size
Keras
Github repo的一个样本脚本)有一个问题,我试图(与Keras一起)复制迈克尔·尼尔森(Michael Nielsen)关于深度学习的在线书籍第6章中的一个实验(他在这本书中使用了plain Theano)。我使用了他的超参数,即batch\u size=10
和nb\u epoch=60
,但用relu代替sigmoid作为激活函数。他的实现达到了99.06%的准确率。令我惊讶的是,我的程序的准确率低于10%,更让我惊讶的是,当我使用batch_size=15
或更大时,准确率合理地>98%(我尝试了Tensorflow
和Theano
)。有关Python代码,请参见以下内容。
我的代码有问题吗?或者这是
Keras的“功能”
您使用的批量大小非常小。此外,您没有使用任何额外的优化器功能(例如,momentum
),在这种情况下,这可能会损害您的培训。要了解最可能发生的情况,请尝试了解在您的培训中实际发生的情况:
每个训练过程都希望减少训练集上的错误X为了做到这一点,您需要计算数据集上的错误梯度w.r.t.到参数,然后-在使错误更小的方向上更改它们
计算整个数据集上的梯度可能非常昂贵-因此,优化器会计算数据集部分(称为batch
,大小为batch\u size
)上此梯度的近似值,并使用此值更改参数
现在试着想象一下,你的样本中有一小部分被错误分类了,或者是非常奇怪的情况,这使得梯度指向与大多数样本不同的方向。在这种情况下,当批处理规模较小时,这可能会使异常值对您的培训产生更大的影响。如果批量较大,则正常样品可消除这种影响李>
您的网络相对较浅-这是可信的,并且经验证明-这样的网络可能会遇到所谓的“差极小值”,即您的网络卡在某个区域-在该区域中,每次更改都会增加错误(这种情况下反向传播不起作用)-甚至随机化也无法将您的参数从该区域移动。如果你的训练更混乱的话,你最终达到最低限度的可能性会更大
增加批量大小
使您的网络变得更好,这并不奇怪。为了防止你的人际网络在小批量的情况下出现普通的梯度下降,你也可以尝试momentum
(使用nesterov
)或者将您的网络深度增加到大小>>5
,因为人们认为这样的网络受最低值影响较小。可能是一个有趣的阅读。我理解批量大小可能太小的观点。但是,我不理解分别使用Keras
和纯Theano
实现的结果之间的区别。您可以尝试重新启动几次培训。也许这是因为keras
在训练期间正在洗牌数据集。