我在用Matconvnet上的Matconvnet对CNN进行二进制分类。现在,我正试图通过Python上的Keras实现它。网络一点也不复杂,我在Matconvnet上实现了96%的准确率。然而,对于Keras,即使我尽力确保每一个设置都与以前完全相同,我也无法得到相同的结果。或者更糟的是,这个模型根本不起作用。在
这里有一些关于设置的细节。任何想法或帮助都是感激的!在输入
图像大小为20*20。培训规模为400,测试规模为100,验证规模为132。在Matconvnet:20*20*sample_-size方法存储的图像
Keras:图像存储在sample_size*20*20*1方法中
CNN结构
(3*3)*3转换-(2*2)最大池-完全连接-softmax-loglossMatconvnet:使用卷积层而不是完全连接层。代码如下:function net = initializeCNNA()
f=1/100 ;
net.layers = {} ;
net.layers{end+1} = struct('type', 'conv', ...
'weights', {{f*randn(3,3,1,3, 'single'), zeros(1, 3, 'single')}}, ...
'stride', 1, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'pool', ...
'method', 'max', ...
'pool', [2 2], ...
'stride', 2, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'conv', ...
'weights', {{f*randn(9,9,3,2, 'single'), zeros(1,2,'single')}}, ...
'stride', 1, ...
'pad', 0) ;
net.layers{end+1} = 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.compile(loss='binary_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
初始化:过滤器:N(0,0.1),偏差:0
标准化:当输入图像的平均值为0且标准偏差为1时,除标准化外,无批次标准化。在
以上是我回顾的方面,以确保我做了正确的复制。但我不明白为什么它在Keras上不起作用。以下是一些猜测:Matconvnet使用卷积层而不是完全连接层,这可能意味着一些更新参数的奇特方法。在
它们使用不同的算法来应用参数具有不同含义的SGD。在
我也做了其他尝试:将Keras中的优化器更改为Adadelta()。没有改善。在
改变网络结构,使之更深层次。它起作用了!在
但是仍然想知道Matconvnet为什么能用一个简单得多的方法来实现这个好结果。