如何修改Imagenet Caffe模型?

How to modify the Imagenet Caffe Model?

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

As the input channel number for temporal nets is different from that of spatial nets (20 vs. 3), we average the ImageNet model filters of first layer across the channel, and then copy the average results 20 times as the initialization of temporal nets.

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

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

感谢您的协助!

阿迈耶

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')