我用Matconvnet上的Matconvnet对CNN进行二进制分类。 现在我想用Python的Keras做到这一点。 互联网一点也不复杂。 我在Matconvnet上实现了96%的精度。 但是,对于Keras,即使尽最大努力确保所有设置都与以前完全相同,也无法获得相同的结果。 更糟的是,这个模型根本不起作用。 在
这里有设定的详细内容。 感谢任何想法和帮助! 输入
图像大小为20*20。 培训规模为400,测试规模为100,验证规模为132。 使用mat convnet :20 * 20 * sample _-size方法保存的图像
Keras :图像存储在sample_size*20*20*1方法中
CNN结构
(3)3)转换)2)最大池(完全连接)-softmax-loglossMatconvnet )使用卷积层而不是完全连接层。 代码如下。 function net=initializeCNNA (
f=1/100;
net.layers={};
net.Layers{end1}=struct('type ',' conv ',
' weights ',{ f * randn (3,3,1,3,' single ',zeros ) 1,3,' single ' ) },
' stride ',1,
' pad ',0;
net.Layers{end1}=struct('type )、' pool ),
' method ',' max ',
' pool ',[2 2],
' stride ',2,
' pad ',0;
net.Layers{end1}=struct('type ',' conv ',
' weights ',{ f * randn (9,9,3,2,' single ',zeros ) 1,2,' single'},
' stride ',1,
' pad ',0;
net.Layers{end1}=struct('type ',' softmaxloss );
net=VL_simplenn_tidy(net );
Keras:
^{pr2}$
损耗函数Matconvnet:softmaxloss
Keras:binary_crossentropy
优化程序Matconvnet :来自新加坡的trainOpts.batchSize=50;
trainOpts.numEpochs=20;
trainOpts.learningRate=0.001;
trainOpts.weightDecay=0.0005;
trainOpts.momentum=0.9;
Keras :新加坡元SGD=optimizers.SGD(lr=0.001,momentum=0.9,decay=0.0005 ) ) ) ) ) )。
model.com pile (loss=' binary _ cross entropy ',
optimizer=sgd
测量结果=[ ' accuracy ' ] )
初始化:过滤器: n (0,0.1 ),偏差: 0
标准化:输入图像的平均值为0,标准偏差为1时,除标准化外没有批次标准化。 在
以上是我回顾的一面,以确认我复制正确。 但是我不知道为什么在Keras上不起作用。 以下是Matconvnet使用卷积层而不是完全连接层的推测: 这可能意味着更新参数的奇怪方法。 在
它们使用不同的算法应用具有不同参数意义的SGD。 在
也做了其他的尝试。 已将Keras优化程序更改为Adadelta ()。 没有改善。 在
改变网络结构,使之达到更深层次。 它在起作用! 在
但是我想知道Matconvnet为什么能用更简单的方法实现这个好结果。