2016-12-08 50 views
4

我想修改ImageNet朱古力模型描述如下:如何修改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.

我的问题是我怎么能achive上面的结果?我怎样才能打开咖啡模型,以便能够对其进行更改?

我看了网络手术教程,但没有包括所需的程序。

谢谢您的协助!

AMayer

回答

3

Net Surgery tutorial应该给你你需要覆盖这个基础。我来解释一下,你需要更详细地做的步骤:

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

    由于第一个conv层的大小不同,因此您必须在文件中为其指定一个与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') 
    
+0

谢谢你分享你的知识。我正在测试它。我会尽快告诉你它是如何发展的。我很感激帮助。 – AMayer

+0

我发现了一个错误。我已根据您的建议更新了主要帖子,并提供了用于更好地查看问题的代码。稍后我会删除代码,以免混淆新读者。我在那里做错了什么?谢谢! – AMayer

+0

我已经设法通过了这个错误,但是又遇到了另一个错误。我更新了主帖。谢谢! – AMayer