windows Caffe 中的未知图层类型(裁剪)

Unknown layer type (crop) in Caffe for windows

我想使用以下卷积神经网络:

http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

使用从 https://github.com/BVLC/caffe/tree/windows

构建的咖啡

对于 windows 10,具有 visual studio 2013、CUDA 7.5、cudNN 4 和 python 支持。

现在,当我调用

提供的两个网络中的任何一个时
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 }

我上网查了一下,好像有人遇到了同样的错误信息。但是,我找不到任何解决方案。

我现在的问题是:如何摆脱这个错误?

非常感谢帮助!

编辑:

按照 的建议更改 .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

谢谢!

解法:

您应该将 net.prototxt 修改为:

layers { ... type: CROP }

layer { ... type: "Crop" }

同时prototxt中其他层的参数也要修改成类似:

layer { ... type: "TypeString" },

并且 TypeString 可以从以下位置找到:

  1. 相关 some_layer_name_layer.cpp 文件中的行 REGISTER_LAYER_CLASS(some_layer_name)。例如,data_layer.cpp中的REGISTER_LAYER_CLASS(Data)表示在net.prototxt中写入数据层时,TypeString应为Data
  2. REGISTER_LAYER_CREATOR(some_layer_name, GetSomeLayer)layer_factory.cpp。例如REGISTER_LAYER_CREATOR(Convolution, GetConvolutionLayer)表示在net.prototxt中写一个卷积层时TypeString应该是Convolution

原因:

您出现问题的原因是:您使用了旧的图层参数格式

layers { ... type: SOMELAYERNAME }

并且这种来自 V1LayerParameter in caffe.proto 的格式不支持一些较新的图层类型,包括 crop 图层。

您可以通过检查 V1LayerParameterenum LayerType 不包含图层类型 CROP 来确认这一点。

为避免此问题,您始终可以使用最新格式:

layer { ... type: "TypeString" }

其中TypeString可以在上面提到的两个地方找到


编辑 1

简单说明:

一般来说,错误:

Error parsing text-format caffe.xxxParameter: ...

始终可以通过检查 xxx.prototxt 文件是否使用了在 caffe.proto 中声明的正确字段名称并为其分配了正确的值(通过检查字段类型及其值范围)来解决。