我想修改ImageNet caffe模型,如下所述:
由于时间网络的输入通道编号不同 对于空间网(20比3),我们对ImageNet模型滤波器进行了平均 跨越通道的第一层,然后复制平均结果20 时间作为时间网络的初始化。
我的问题是如何才能实现上述结果?如何打开caffe模型才能对其进行更改?
我阅读了网络手术教程,但它没有涵盖所需的程序。
感谢您的协助!
AMayer
答案 0 :(得分:6)
Net Surgery tutorial应该为您提供解决此问题所需的基础知识。但是,让我更详细地解释您需要做的步骤:
准备.prototxt
网络架构:您需要两个文件:现有的ImageNet .prototxt
文件和新的时态网络架构。您应该使所有图层除两个网络中的第一个卷积层相同,包括图层的名称。这样,您就可以使用ImageNet .caffemodel
文件自动初始化权重。
由于第一个转化层具有不同的大小,因此您必须在.prototxt
文件中为其指定与ImageNet文件中不同的名称。否则,Caffe将尝试使用现有权重初始化此图层,由于它们具有不同的形状,因此会失败。 (这是在你的问题的编辑中发生的事情。)只需命名它,例如conv1b
并相应地更改对该图层的所有引用。
加载ImageNet网络进行测试,以便从模型文件中提取参数:
net = caffe.Net('imagenet.prototxt', 'imagenet.caffemodel', caffe.TEST)
从此加载的模型中提取权重。
conv_1_weights = old_net.params['conv1'][0].data
conv_1_biases = old_net.params['conv1'][1].data
平均渠道的权重:
conv_av_weights = np.mean(conv_1_weights, axis=1, keepdims=True)
将新网络与旧.caffemodel
文件一起加载,因为除第一层以外的所有图层都直接使用ImageNet中的权重:
new_net = caffe.Net('new_network.prototxt', 'imagenet.caffemodel', caffe.TEST)
将计算出的平均权重分配给新网络
new_net.params['conv1b'][0].data[...] = conv_av_weights
new_net.params['conv1b'][1].data[...] = conv_1_biases
将权重保存到新的.caffemodel
文件中:
new_net.save('new_weights.caffemodel')