gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:18:15 27 4
gpt4 key购买 nike

我正在使用 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 部署架构的原型(prototype)文件。请注意,他们的 prototxt 中的 "fc6" 与我的相同(除了学习率,但那是无关紧要的)。还值得注意的是,我的模型中的输入也都是相同的大小:3 channel 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)

第一行加载我的求解器 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。但我不知道如何更改它?

我找到了 this answer在 Users Google 组中指示我进行网络手术以在复制之前 reshape 预训练模型,但为了做到这一点,我需要来自原始体系结构数据层的 lmdb 文件,我不需要没有(当我尝试运行 net surgery 脚本时它会抛出错误)。

最佳答案

问题不在于 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

关于python - 使用预训练 VGG-16 模型的 Caffe 形状不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com