使用 NetParameter 构造 caffe.Net 对象

Construct caffe.Net object using NetParameter

documentation 我认为有一个构造函数接受一个 NetParameter 参数,

explicit Net(const NetParameter& param);

但是当我尝试这样使用它时:

    import caffe
    from caffe import layers as L
    from google.protobuf import text_format

def logreg(hdf5, batch_size):
    # logistic regression: data, matrix multiplication, and 2-class softmax loss
    n = caffe.NetSpec()
    n.data, n.label = L.HDF5Data(batch_size=batch_size, source=hdf5, ntop=2)
    n.ip1 = L.InnerProduct(n.data, num_output=2, weight_filler=dict(type='xavier'))
    n.accuracy = L.Accuracy(n.ip1, n.label)
    n.loss = L.SoftmaxWithLoss(n.ip1, n.label)
    return n.to_proto()

logreg_str = str(logreg('examples/hdf5_classification/data/test.txt', 10))

net_param = caffe.proto.caffe_pb2.NetParameter()
_ = text_format.Merge(logreg_str, net_param)

print type(net_param);
caffe.Net(net_param, caffe.TEST)

ipython

出现以下错误
<class 'caffe.proto.caffe_pb2.NetParameter'>

--------------------------------------------------------------------------- 
ArgumentError                         Traceback (most recent call last)
<ipython-input-20-edce76ff13a1> in <module>()
     14 
     15 print type(net_param);
---> 16 caffe.Net(net_param, caffe.TEST)

ArgumentError: Python argument types in
    Net.__init__(Net, NetParameter, int) did not match C++ signature:
    __init__(boost::python::api::object, std::string, std::string, int)
    __init__(boost::python::api::object, std::string, int)

那么我做错了什么?我如何使用这个构造函数?

注意:我已经知道如何使用 "read file from disk constructor",我想使用 NetParameter 一个/或了解它为什么不起作用。

在 Shai 的评论后编辑:

我在 2015 年 7 月 26 日使用此命令获取了 caffe: git 克隆 https://github.com/BVLC/caffe.git

这是我磁盘上的文件:

~/caffe/src/caffe$ grep NetParameter net.cpp | head -1
Net<Dtype>::Net(const NetParameter& param) {
~/caffe/src/caffe$ ~/caffe/build/tools/caffe -version
caffe

-version 开关似乎什么都不做。我 grep 了源代码,但找不到版本号。

你的代码没有问题。在 C++ 中确实有一个 Net class 的重载构造函数,但它目前没有被 python 接口公开。 python 接口仅限于带有文件参数的构造函数。

我不确定是否只是在 python/caffe/_caffe.cpp 中公开它是阻止我们使用 NetParameter 构建 python Net 对象的唯一方法,或者是否需要更精细的更改。

我遇到了同样的问题,我得到了解决方案on google user group,这说明您的 c++ boost 库太旧,您可能需要更新它。