6

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

原网:

数据->conv1->conv2->fc1->fc2->softmax;

新网:

数据 -> conv1_1 -> conv1_2 -> conv2_1 -> conv2_2 -> fc1 -> fc2 -> softmax

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

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

4

1 回答 1

11

我没有看到如何使用 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))

另请参阅此处作为 python 中协议缓冲区的指南,并在此处查看当前的 caffe 消息格式。

于 2016-02-17T23:23:18.610 回答