gpt4 book ai didi

python - 如何使用pycaffe重构caffe net

转载 作者:太空狗 更新时间:2023-10-29 22:15:24 26 4
gpt4 key购买 nike

我想要的是,加载网络后,我将分解某些特定层并保存新网络。例如

原网:

data -> conv1 -> conv2 -> fc1 -> fc2 -> softmax;

新网:

data -> conv1_1 -> conv1_2 -> conv2_1 -> conv2_2 -> fc1 -> fc2 -> softmax

因此,在这个过程中,我卡在了如下情况:
1、如何在pycaffe中新建指定层参数的某一层?
2. 如何从现有层(如上面的fc1fc2)复制层参数?

我知道通过使用 caffe::net_spec,我们可以手动定义一个新网络。但是 caffe::net_spec 不能从现有的层中指定一个层(例如:fc1)。

最佳答案

我没有看到如何使用 net_spec 在以前的网络中加载,但您始终可以直接使用 protobuf 对象。(我以你的网络结构为例)

import caffe.proto.caffe_pb2 as caffe_pb2
import google.protobuf as pb
from caffe import layers as L

net = caffe_pb2.NetParameter()
with open('net.prototxt', 'r') as f:
pb.text_format.Merge(f.read(), net)

#example of modifing the network:
net.layer[1].name = 'conv1_1'
net.layer[1].top[0] = 'conv1_1'
net.layer[2].name = 'conv1_2'
net.layer[2].top[0] = 'conv1_2'
net.layer[2].bottom[0] = 'conv1_1'

net.layer[3].bottom[0] = 'conv2_2'

#example of adding new layers (using net_spec):
conv2_1 = net.layer.add()
conv2_1.CopyFrom(L.Convolution(kernel_size=7, stride=1, num_output=48, pad=0).to_proto().layer[0])
conv2_1.name = 'conv2_1'
conv2_1.top[0] = 'conv2_1'
conv2_1.bottom.add('conv1_2')

conv2_2 = net.layer.add()
conv2_2.CopyFrom(L.Convolution(kernel_size=7, stride=1, num_output=48, pad=0).to_proto().layer[0])
conv2_2.name = 'conv2_2'
conv2_2.top[0] = 'conv2_2'
conv2_2.bottom.add('conv2_1')

# then write back out:
with open('net2.prototxt, 'w') as f:
f.write(pb.text_format.MessageToString(net))

另见 here作为 python 和 here 中 Protocol Buffer 的指南对于当前的 caffe 消息格式。

关于python - 如何使用pycaffe重构caffe net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35423309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com