我是Caffe的新手,我想使用已经训练好的caffeNet模型来处理ImageNet数据。我通过移除中间的卷积层conv4进行了网络手术。
'layer { name: "relu3" type: "ReLU" bottom: "conv3" top: "conv3" } layer { name: "relu5-new" type: "ReLU" bottom: "conv5-new" top: "conv5-new" } layer { name: "pool5-new" type: "Pooling" bottom: "conv5-new" top: "pool5-new" pooling_param { pool: MAX kernel_size: 3 stride: 2 } } layer { name: "fc6" type: "InnerProduct" bottom: "pool5-new" top: "fc6" inner_product_param { num_output: 4096 } }'
保存这个新网络后,准确率变为0。我应该在ImageNet验证集上进行微调,还是我的新prototxt文件有问题?
任何帮助都将不胜感激!
回答:
你最初使用的网络在conv3
和conv5
之间有conv4
层:这意味着conv5
的滤波器(权重)期望接收特定数量的输入以及输入的特定“顺序”或“含义”。一旦你移除了conv4
,你就必须调整conv5
以接受不同数量的输入。因此,新的conv5
层必须经过训练以适应它接收到的新输入。
在这种情况下,当你引入新的conv5
层时,你应该在prototxt中定义weight_filler
来指导Caffe如何初始化新的权重。否则,Caffe会将权重设置为零,在这种情况下几乎不可能进行微调。