我是深度学习的新手。当我使用caffe时,我发现有两个prototxt文件,一个是“deploy”,另一个是“train_val”。
我知道“train_val”用于训练模型。但对于“部署”文件,有些人说它是用来测试图像的
所以,我的问题是“部署”只有forward()
网络,所以测试图像数据只能通过前向网络一次获得分数吗?
答案 0 :(得分:2)
理想情况下它应该如何工作,但文件只是网络定义。你可以使用一个文件进行训练和测试。你必须指定你想要一些blob可用的阶段,这意味着你可以确定两个inputData层,一个将在训练期间使用,另一个用于测试并指定相应的阶段,如下所示:
name: "MyModel"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: false
crop_size: 227
mean_file: "data/train_mean.binaryproto" # location of the training data mean
}
data_param {
source: "data/train_lmdb" # location of the training samples
batch_size: 128 # how many samples are grouped into one mini-batch
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
在训练期间,将使用前一层,而忽略第二层。 在测试阶段,第一层将被忽略,第二层将被用作测试的输入。
另一点是,在测试过程中,我们需要预测的准确性,因为我们不再需要更新我们的权重 升
layer {
name: "accuracy"
type: "Accuracy"
bottom: "fc8"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "fc8"
bottom: "label"
top: "loss"
}
如果未给出include伪指令,则该层将包含在所有阶段中。
虽然您也可以在训练期间包括精度层,以了解输出是如何进行的(即:在多少次迭代后测量精度提高),我们在预测时需要更多。
在求解器中,您可以指定test_iter
以指定将执行多少次迭代测试操作(每次test_iter迭代验证模型)
train_val和deploy文件将这两个阶段分成两个不同的文件.train_val中的所有规范都与训练阶段相关。我不确定,train_val组合来自哪里,但我想这是因为你可以在test_iter之后验证你的模型并继续从那里再次训练。 由于您不需要测试期间的损失,而不是概率,您可以使用softmax作为概率输出函数而不是部署中的softmaxwithloss,或者您可以同时定义两者。 caffe测试命令执行正向操作但不执行向后()(反向传播)操作。我希望它有帮助
答案 1 :(得分:2)
正如您已经注意到的,有一些fundamental differences between 'train_val.prototxt'
and 'deploy.prototxt'
一个关键的区别是'deploy.prototxt'
通常没有任何损失层
如果没有为网络定义损失函数,则没有向后传播的含义:您将传播什么样的渐变?什么功能的渐变?
因此,caffe中的net
对象已为所有阶段实施backward()
方法。然而,当您测试没有损失函数的网络(仅预测)时,这种方法毫无意义。