我想使用以下卷积神经网络:
http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/
使用https://github.com/BVLC/caffe/tree/windows
构建的caffe适用于带有Visual Studio 2013,CUDA 7.5,cudNN 4和python支持的Windows 10。
现在,当我打电话给
提供的两个网络中的任何一个时net = caffe.Net('xyz.prototxt', 'xyz.caffemodel', caffe.TEST)
我收到以下错误:
Error parsing text-format caffe.NetParameter: 43:85: Unknown enumeration value of "CROP" for field "type".
网络的第43行如下所示:
layers { bottom: 'd3c' bottom: 'u3a' top: 'd3cc' name: 'crop_d3c-d3cc' type: CROP }
我在网上看过,有些人似乎遇到了同样的错误信息。但是,我找不到任何解决方案。
我现在的问题是:如何摆脱这个错误?
非常感谢帮助!
修改
根据Dale Song的建议更改.prototxt消除了此错误,但导致另一个错误:
[libprotobuf ERROR ..\src\google\protobuf\text_format.cc:274] Error parsing text-format caffe.NetParameter: 10:102: Message type "caffe.LayerParameter" has no field named "blobs_lr".
我通过替换
来解决这个问题blobs_lr: 1 weight_decay: 1 blobs_lr: 2 weight_decay: 0
与
param {lr_mult: 1 decay_mult: 1} param {lr_mult: 2 decay_mult: 0}
在.prototxt中,如建议here。
谢谢!
答案 0 :(得分:3)
<强>解决方案:强>
您应该修改net.prototxt
:
layers { ... type: CROP }
到
layer { ... type: "Crop" }
同时,其他层次&#39;原型中的参数也应该类似于:
进行修改 layer { ... type: "TypeString" }
,
和TypeString
可以从以下网址找到:
REGISTER_LAYER_CLASS(some_layer_name)
文件中的行some_layer_name_layer.cpp
。例如,REGISTER_LAYER_CLASS(Data)
中的data_layer.cpp
表示在TypeString
中编写数据层时Data
应为net.prototxt
。REGISTER_LAYER_CREATOR(some_layer_name, GetSomeLayer)
中layer_factory.cpp
。例如,REGISTER_LAYER_CREATOR(Convolution, GetConvolutionLayer)
表示在TypeString
中编写卷积图层时Convolution
应为net.prototxt
。<强>原因:强>
您遇到问题的原因是:您使用了旧的图层参数格式
layers { ... type: SOMELAYERNAME }
。
来自caffe.proto中V1LayerParameter
的此格式不支持某些较新的图层类型,包括crop
图层。
您可以通过检查enum LayerType
的{{1}}是否包含图层类型V1LayerParameter
来确认这一点。
为避免此问题,您始终可以使用最新格式:
CROP
其中layer { ... type: "TypeString" }
可以在上述2个地方找到。
修改1
简单说一句:
一般来说,错误:
TypeString
总是可以通过检查Error parsing text-format caffe.xxxParameter: ...
文件使用caffe.proto中声明的正确字段名称并为其分配正确的值(通过检查字段类型及其值范围)来解决。