我怎么知道层中是否存在 "bias"?
How can i know whether "bias" exists in a layer?
我正在尝试使用 pycaffe 读取 caffe 网络中的权重和偏差。
这是我的代码
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 boost 包装器对象,因此您可能需要将其显式转换为列表 (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'
我正在尝试使用 pycaffe 读取 caffe 网络中的权重和偏差。 这是我的代码
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 boost 包装器对象,因此您可能需要将其显式转换为列表 (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'