这是我的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: ***
然后,我从conv1层中删除了bottom: "data"
。
之后,我得到了这个错误:
F1117 23:17:15.363919 21935 insert_splits.cpp:35] Unknown bottom blob 'label' (layer 'loss', bottom index 1)*** Check failure stack trace: ***
我从loss层中删除了bottom: "label"
。然后我得到了这个错误:
I1117 23:19:11.171021 21962 layer_factory.hpp:76] Creating layer conv1I1117 23:19:11.171036 21962 net.cpp:110] Creating Layer conv1I1117 23:19:11.171041 21962 net.cpp:433] conv1 -> conv1F1117 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: ***
我应该做些什么来修复它并创建我的部署文件?
回答:
训练用的prototxt和部署用的prototxt之间有两个主要区别:
1. 输入:训练时数据固定为预处理的训练数据集(如lmdb/HDF5等),而部署网络时需要处理其他输入,方式更为“随机”。
因此,首先要做的改动是删除输入层(在训练和测试阶段推送“数据”和“标签”的层)。你需要添加以下声明来替换输入层:
input: "data"input_shape: { dim:1 dim:3 dim:224 dim:224 }
这个声明并不提供网络的实际数据,但它告诉网络期望的形状,使caffe能够预分配必要的资源。
2. 损失:训练用的prototxt中的最顶层定义了训练的损失函数。这通常涉及到真实标签。在部署网络时,你不再能访问这些标签。因此,损失层应转换为“预测”输出。例如,一个“SoftmaxWithLoss”层应转换为一个简单的“Softmax”层,输出类别概率而不是对数似然损失。其他一些损失层已经将预测作为输入,因此只需删除它们即可。
更新:请参阅这个教程以获取更多信息。