8

这是我的train.prototxt。这是我的deploy.prototxt如何从train.prototxt创建caffe.deploy

当我想要我的加载部署文件我得到这个错误:

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: *** 

比,我从CONV 1层去除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: *** 

我删除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: *** 

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

回答

16

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

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

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

此声明不提供对网络的实际数据,但它告诉净期待什么形状,让朱古力预分配必要的资源。

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

更新:有关更多信息,请参阅this tutorial

+0

什么是dim:1? – 0x1337

+1

@ 0x1337为了定义我们使用[''BlobShape'']输入''data''的形状'(https://github.com/BVLC/caffe/blob/master/src/caffe/proto /caffe.proto#L6)原始消息。这个“形状”有一个“重复”参数dim,它定义了“形状”的一个维度。 'dim:1'意味着我们希望''data''在部署阶段一次只包含一个样本(即'batch_size:1')。 – Shai

+1

@Shai感谢您的明确解释。有没有办法在python中以编程方式生成deploy.prototxt类似?有关我的问题的更多细节在这里 - http://stackoverflow.com/questions/40986009/how-to-programmatically-generate-deploy-txt-for-caffe-in-python – cdeepakroy

0

除了来自@Shai的建议之外,您可能还希望禁用丢弃图层。

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

+1

这取决于你的退出层的实现方式。在某些情况下,您需要用缩放来替换掉落,以补偿未丢弃的信号的增加能量:例如,如果您下降50%,那么在测试时间内,穿过图层的信号强度会增加x2,需要将产量缩减50%。 – Shai