我正在使用 PyCaffe 来实现一个受 VGG 16 层网络启发的神经网络。我想使用他们的GitHub 页面上提供的预训练模型。通常,这通过匹配层名称来工作。
对于我的"fc6"
层,我的 train.prototxt 文件中有以下定义:
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
inner_product_param {
num_output: 4096
}
}
这是 VGG-16 部署架构的 prototxt 文件。请注意,"fc6"
他们的 prototxt 中的 与我的相同(除了学习率,但这无关紧要)。还值得注意的是,在我的模型中,输入的大小也都相同:3 通道 224x224px 图像。
我一直在密切关注本教程,给我带来问题的代码块如下:
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)
第一行加载我的求解器 prototxt,然后第二行从预训练模型 ( 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。但我不明白如何改变这个?
我在用户谷歌组中找到了这个答案,指示我在复制之前进行网络手术以重塑预训练模型,但为了做到这一点,我需要lmdb
原始架构数据层中的文件,而我没有(它当我尝试运行网络手术脚本时抛出错误)。