我想读的重量和偏见的朱古力网络pycaffe。 这里是我的代码
weight = net.params[layer_name][0].data
bias = net.params[layer_name][1].data
但是,我的网络中的某些层没有偏见,所以会有这是一个错误Index out of range
。
所以我的问题是,我可以使用
if(net.params[layer_name][1] exists):
bias = net.params[layer_name][1].data
控制分配到bias
? 以及如何编写代码?
您可以通过简单地重复net.params[layer_name]
layer_params = [blob.data for blob in net.params[layer_name]]
这样,你得到所有layer_params
(这可能是大于2的一些层,例如, "BatchNorm"
)
如果你只是想检查第二个参数的blob,您可以使用len
:
if len(net.params[layer_name]) >= 2:
bias = net.params[layer_name][1].data
PS,
这可能是案件net.params[layer_name]
不完全是一个Python list
,而是一些Python提振包装对象,因此您可能需要显式转换它列出( list(net.params[layer_name])
在一些的方法,我在这个答案建议。
如果你想这样做卷积层,你可以找到该层是否有偏差,通过阅读prototxt无需为caffemodel,即
from caffe.proto import caffe_pb2
import google.protobuf.text_format
net = caffe_pb2.NetParameter()
f = open('model.prototxt', 'r')
net = google.protobuf.text_format.Merge(str(f.read()), net)
f.close()
for i in range(0, len(net.layer)):
if net.layer[i].type == 'Convolution':
if net.layer[i].convolution_param.bias_term == True:
print 'layer has bias'