8

这是我的train.prototxt。这是我的deploy.prototxt

当我想加载我的部署文件时,我收到此错误:

File "./python/caffe/classifier.py", line 29, in __init__  
in_ = self.inputs[0]  
IndexError: list index out of range  

所以,我删除了数据层:

F1117 23:16:09.485153 21910 insert_splits.cpp:35] Unknown bottom blob 'data' (layer 'conv1', bottom index 0)
*** Check failure stack trace: ***

比,我bottom: "data"从 conv1 层中删除。

之后,我得到了这个错误:

F1117 23:17:15.363919 21935 insert_splits.cpp:35] Unknown bottom blob 'label' (layer 'loss', bottom index 1)
*** Check failure stack trace: ***

bottom: "label"从损失层中删除。我得到了这个错误:

I1117 23:19:11.171021 21962 layer_factory.hpp:76] Creating layer conv1
I1117 23:19:11.171036 21962 net.cpp:110] Creating Layer conv1
I1117 23:19:11.171041 21962 net.cpp:433] conv1 -> conv1
F1117 23:19:11.171061 21962 layer.hpp:379] Check failed: MinBottomBlobs() <= bottom.size() (1 vs. 0) Convolution Layer takes at least 1 bottom blob(s) as input.
*** Check failure stack trace: ***

我应该怎么做才能修复它并创建我的部署文件?

4

2 回答 2

17

“训练” prototxt 和“部署” prototxt 有两个主要区别:

1. 输入:虽然训练数据固定为预处理的训练数据集(lmdb/HDF5 等),但部署网络需要它以更“随机”的方式处理其他输入。
因此,第一个更改是删除输入层(在 TRAIN 和 TEST 阶段推送“数据”和“标签”的层)。要替换输入层,您需要添加以下声明:

input: "data"
input_shape: { dim:1 dim:3 dim:224 dim:224 }

这个声明不提供网络的实际数据,但它告诉网络期望什么形状,允许 caffe 预先分配必要的资源。

2. 损失:训练原型中的最顶层定义了训练的损失函数。这通常涉及基本事实标签。部署网络时,您不再有权访问这些标签。因此损失层应该被转换为“预测”输出。例如,“SoftmaxWithLoss”层应转换为简单的“Softmax”层,输出类概率而不是对数似然损失。其他一些损失层已经将预测作为输入,因此只需删除它们就足够了。

更新:有关更多信息,请参阅本教程

于 2015-11-18T06:25:42.267 回答
0

除了来自@Shai 的建议,您可能还想禁用 dropout 层。

尽管 Caffe 的作者贾扬青曾经说过 dropout 层对测试结果的影响可以忽略不计(google group conversation,2014),但其他 Deeplearning 工具建议在部署阶段禁用 dropout(例如,lasange)。

于 2016-07-28T07:22:13.690 回答