如何从train.prototxt创建caffe.deploy。

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

然后,我从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: ***

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


只是让您知道,您的培训和部署文件链接都失效了,您能否替换它们? - Farid Alijani
抱歉,我已经没有那些文件了。 - Carlos Porta
2个回答

17

“train”和“deploy”prototxt有两个主要的区别:

1. 输入数据:在训练时,数据集固定为预处理后的训练数据集(如lmdb/HDF5等),而部署网络则需要以更“随机”的方式处理其他输入数据。
因此,第一个改变就是删除输入层(在TRAIN和TEST阶段推送“data”和“labels”的层)。为了替换这些输入层,你需要添加以下声明:

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

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

2. 损失函数:在训练prototxt中的最顶部层定义了训练的损失函数。这通常涉及到真实标签。当部署网络时,您将无法访问这些标签。因此,损失层应该转换为“预测”输出。例如,“SoftmaxWithLoss”层应该被转换为一个简单的“Softmax”层,该层输出类概率而不是对数似然损失。一些其他的损失层已经有了预测作为输入,因此只需要将它们删除即可。

更新:请参见本教程以获取更多信息。


1
为了定义输入数据"data"的形状,我们使用'BlobShape'协议消息。这个"shape"有一个"repeated"参数"dim",用于定义"shape"的一个维度。"dim:1"表示我们在部署阶段只期望"data"每次包含一个样本(即,batch_size:1)。 - Shai
1
@Shai 感谢您清晰的解释。是否有一种类似于Python的编程方式来生成deploy.prototxt文件?关于我的问题,更多细节请参见此处 - https://dev59.com/9J3ha4cB1Zd3GeqPPBp8 - cdeepakroy
@Shai,考虑到更大的“batch_size”在测试过程中有什么区别?它对测试准确性有任何影响吗?还是只针对训练过程? - Farid Alijani
@FäridAlijani 它对测试时间的准确性没有影响。 - Shai
@Shai,所以我有net.blobs[net.inputs[0]].reshape(batch_sz, ch, height, width) # n,C,H,W -> 1,C,H,W,我总是假设batch_size = 1最容易处理内存消耗和时间效率吗? - Farid Alijani

0
除了@Shai的建议外,您可能还想禁用dropout层。
尽管Caffe的作者贾杨清曾经表示,在测试结果上,dropout层对结果影响微乎其微(google group conversation, 2014),但其他深度学习工具建议在部署阶段禁用dropout(例如lasange)。

1
这取决于您的 Dropout 层实现方式。在某些情况下,您需要用缩放来替换 Dropout 以弥补未被丢弃信号的能量增加:例如,如果您丢弃了 50%,则在测试时间中,通过该层传递的信号强度将增加两倍,您需要将输出缩小 50%。 - Shai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接