首页 文章

使用预训练VGG-16模型的Caffe形状不匹配误差

提问于
浏览
4

我正在使用PyCaffe来实现受VGG 16层网络启发的神经网络 . 我想使用他们的GitHub page提供的预训练模型 . 通常,这通过匹配图层名称来实现 .

对于我的 "fc6" 图层,我在train.prototxt文件中有以下定义:

layer {
  name: "fc6"
  type: "InnerProduct"
  bottom: "pool5"
  top: "fc6"
  inner_product_param {
    num_output: 4096
  }
}

Here是VGG-16部署体系结构的原型文件 . 请注意,他们的原型中的 "fc6" 与我的相同(除了学习率,但是's irrelevant). It'也值得注意的是输入在我的模型中也是相同的大小:3通道224x224px图像 .

我一直非常密切关注this tutorial,并且给我一个问题的代码块如下:

solver = caffe.SGDSolver(osp.join(model_root, 'solver.prototxt'))
solver.net.copy_from(model_root + 'VGG_ILSVRC_16_layers.caffemodel')
solver.test_nets[0].share_with(solver.net)
solver.step(1)

第一行加载我的求解器原型,然后第二行从预先训练的模型中复制权重( VGG_ILSVRC_16_layers.caffemodel ) . 解算器运行时,我收到此错误:

Cannot copy param 0 weights from layer 'fc6'; shape mismatch.  Source param 
shape is 1 1 4096 25088 (102760448); target param shape is 4096 32768 (134217728). 
To learn this layer's parameters from scratch rather than copying from a saved 
net, rename the layer.

它的要点是他们的模型期望该层的大小为1x1x4096而我的只有4096.但我不知道如何改变它?

我发现用户Google小组中的this answer指示我进行网络手术以在复制之前重塑预先训练的模型,但为了做到这一点,我需要原始架构中的 lmdb 文件's data layers, which I don' t(当我尝试时它会抛出错误运行网络手术脚本) .

2 回答

  • 7

    问题不在于4096而在于25088.您需要根据输入要素图计算网络中每个层的输出要素图 . 请注意, fc 图层采用固定大小的输入,因此前一个 conv 图层的输出必须与 fc 图层所需的输入大小相匹配 . 使用先前 conv 图层的输入要素贴图大小计算fc6输入要素贴图大小(这是前一个 conv 图层的输出要素贴图) . 这是公式:

    H_out = ( H_in + 2 x Padding_Height - Kernel_Height ) / Stride_Height + 1
    W_out = (W_in + 2 x Padding_Width - Kernel_Width) / Stride_Width + 1
    
  • 0

    如果您将图像裁剪为224,而不是使用原始数据集完成的227,则会出现此错误 . 调整一下,你应该好好去 .

相关问题