如何从 train.prototxt 创建 caffe.deploy

How to create caffe.deploy from train.prototxt

这是我的train.prototxt. And this is my 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: ***

我从损失层中删除了 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: ***

我应该如何修复它并创建我的部署文件?

"train" prototxt 和 "deploy" 之间有两个主要区别:

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

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

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

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

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

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

虽然Caffe的作者贾扬清曾说过dropout层对测试结果的影响可以忽略不计(google group conversation, 2014), other Deeplearning tools suggest to disable dropout in the deploy phase (for example, lasange)。