将CNN模型从Matlab(Matconvnet)导入Python(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*

我正在使用Matconvnet上的Matconvnet对CNN进行二元分类。现在,我正试图通过Python上的Keras实现这一点。网络一点也不复杂,我在Matconvnet上实现了96%的准确率。然而,对于Keras,即使我尽了最大努力确保每个设置都与以前完全相同,我也无法得到相同的结果。或者更糟糕的是,模型根本不起作用

以下是有关设置的一些详细信息。任何想法或帮助都将不胜感激

  • 输入

    图像大小为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) ;
      
    • 凯拉斯:

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: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'])
      
  • 初始化:过滤器:N(0,0.1),偏差:0
  • 标准化:除了标准化之外,没有批量标准化,而输入图像的平均值为0,标准值为1
以上是我为确保正确复制而检查的方面。但我不明白为什么它对Keras不起作用。以下是一些猜测:

  • Matconvnet使用卷积层而不是完全连接层,这可能意味着某种更新参数的奇特方法
  • 他们使用不同的算法来应用参数含义不同的SGD
我还做了其他尝试:

  • 将Keras中的优化器更改为
    Adadelta()
    。没有改善
  • 改变网络结构,使之更深入。它起作用了

    但我仍然想知道为什么Matconvnet可以用一个简单得多的方法获得这样好的结果

“Matconvnet使用卷积层而不是完全连接层,这可能意味着某种更新参数的奇特方式。”

不。从技术上讲,卷积层和完全连接层之间应该没有区别。我很确定没有什么新奇的方法来更新参数

更多评论即将发布

本文中的一些讨论可能有助于: “Matconvnet使用卷积层而不是完全连接层,这可能意味着采用某种奇特的方法来更新参数。”

不。从技术上讲,卷积层和完全连接层之间应该没有区别。我很确定没有什么新奇的方法来更新参数

更多评论即将发布

本文中的一些讨论可能有助于: