将CNN模型从Matlab(Matconvnet)导入Python(Keras)
我正在使用Matconvnet上的Matconvnet对CNN进行二元分类。现在,我正试图通过Python上的Keras实现这一点。网络一点也不复杂,我在Matconvnet上实现了96%的准确率。然而,对于Keras,即使我尽了最大努力确保每个设置都与以前完全相同,我也无法得到相同的结果。或者更糟糕的是,模型根本不起作用 以下是有关设置的一些详细信息。任何想法或帮助都将不胜感激将CNN模型从Matlab(Matconvnet)导入Python(Keras),python,matlab,keras,conv-neural-network,matconvnet,Python,Matlab,Keras,Conv Neural Network,Matconvnet,我正在使用Matconvnet上的Matconvnet对CNN进行二元分类。现在,我正试图通过Python上的Keras实现这一点。网络一点也不复杂,我在Matconvnet上实现了96%的准确率。然而,对于Keras,即使我尽了最大努力确保每个设置都与以前完全相同,我也无法得到相同的结果。或者更糟糕的是,模型根本不起作用 以下是有关设置的一些详细信息。任何想法或帮助都将不胜感激 输入 图像大小为20*20。培训规模为400,测试规模为100,验证规模为132 Matconvnet:以20*
- 输入
图像大小为20*20。培训规模为400,测试规模为100,验证规模为132
- Matconvnet:以20*20*样本大小方法存储的图像
- Keras:以样本大小*20*20*1方法存储的图像
- CNN结构
(3*3)*3 conv-(2*2)maxpooling-完全连接-softmax-logloss
- Matconvnet:使用卷积层而不是完全连接层。代码如下:
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) ;
- 凯拉斯:
- Matconvnet:使用卷积层而不是完全连接层。代码如下:
model=Sequential()
add(Conv2D(3,(3,3),kernel\u初始值设定项=\
keras.initializers.RandomNormal(平均值=0.0,标准差=0.1,种子值=None),输入形状=输入形状)
add(MaxPooling2D(池大小=(2,2),跨步=(2,2)))
model.add(展平())
模型添加(密集(2,激活='softmax'\
kernel_initializer=keras.initializers.RandomNormal(平均值=0.0,stddev=0.1,seed=None)))
- 损失函数
- Matconvnet:
softmaxloss
- Keras:
二进制交叉熵
- Matconvnet:
- 优化器
- Matconvnet:SGD
trainOpts.batchSize = 50; trainOpts.numEpochs = 20 ; trainOpts.learningRate = 0.001 ; trainOpts.weightDecay = 0.0005 ; trainOpts.momentum = 0.9 ;
- 克拉斯:新加坡元
sgd = optimizers.SGD(lr=0.001, momentum=0.9, decay=0.0005) model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
- Matconvnet:SGD
- 初始化:过滤器:N(0,0.1),偏差:0
- 标准化:除了标准化之外,没有批量标准化,而输入图像的平均值为0,标准值为1
- Matconvnet使用卷积层而不是完全连接层,这可能意味着某种更新参数的奇特方法
- 他们使用不同的算法来应用参数含义不同的SGD
- 将Keras中的优化器更改为
。没有改善Adadelta()
- 改变网络结构,使之更深入。它起作用了 但我仍然想知道为什么Matconvnet可以用一个简单得多的方法获得这样好的结果