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