如何修改Imagenet Caffe模型?

时间:2016-12-08 17:26:51

标签: deep-learning caffe pycaffe

我想修改ImageNet caffe模型,如下所述:

  

由于时间网络的输入通道编号不同   对于空间网(20比3),我们对ImageNet模型滤波器进行了平均   跨越通道的第一层,然后复制平均结果20   时间作为时间网络的初始化。

我的问题是如何才能实现上述结果?如何打开caffe模型才能对其进行更改?

我阅读了网络手术教程,但它没有涵盖所需的程序。

感谢您的协助!

AMayer

1 个答案:

答案 0 :(得分:6)

Net Surgery tutorial应该为您提供解决此问题所需的基础知识。但是,让我更详细地解释您需要做的步骤:

  1. 准备.prototxt网络架构:您需要两个文件:现有的ImageNet .prototxt文件和新的时态网络架构。您应该使所有图层两个网络中的第一个卷积层相同,包括图层的名称。这样,您就可以使用ImageNet .caffemodel文件自动初始化权重。

    由于第一个转化层具有不同的大小,因此您必须在.prototxt文件中为其指定与ImageNet文件中不同的名称。否则,Caffe将尝试使用现有权重初始化此图层,由于它们具有不同的形状,因此会失败。 (这是在你的问题的编辑中发生的事情。)只需命名它,例如conv1b并相应地更改对该图层的所有引用。

  2. 加载ImageNet网络进行测试,以便从模型文件中提取参数:

    net = caffe.Net('imagenet.prototxt', 'imagenet.caffemodel', caffe.TEST)
    
  3. 从此加载的模型中提取权重。

    conv_1_weights = old_net.params['conv1'][0].data
    conv_1_biases = old_net.params['conv1'][1].data
    
  4. 平均渠道的权重:

    conv_av_weights = np.mean(conv_1_weights, axis=1, keepdims=True)
    
  5. 将新网络与旧.caffemodel文件一起加载,因为除第一层以外的所有图层都直接使用ImageNet中的权重:

    new_net = caffe.Net('new_network.prototxt', 'imagenet.caffemodel', caffe.TEST)
    
  6. 将计算出的平均权重分配给新网络

    new_net.params['conv1b'][0].data[...] = conv_av_weights
    new_net.params['conv1b'][1].data[...] = conv_1_biases
    
  7. 将权重保存到新的.caffemodel文件中:

    new_net.save('new_weights.caffemodel')