理想情况下它应该是这样工作的,但文件只是网络定义。你可以使用一个文件来训练和测试。你必须指定你想让一些 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
}
在训练期间,将使用前一层,而忽略第二层。
在测试阶段,第一层将被忽略,第二层将用作测试的输入。
另一点是,在测试期间,我们需要预测的准确性,因为我们不再需要更新权重
l
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"
}
如果未给出包含指令,则该层包含在所有阶段中。
虽然您也可以在训练期间包含准确度层以查看输出的进展情况(即:用于测量经过多少次迭代后的准确度改进),但我们在预测方面更需要它。
在您的求解器中,您可以指定test_iter 指定在多少次迭代测试操作之后将执行(您验证您的模型每次 test_iter 迭代)
train_val 和 deploy 文件将这两个阶段分成两个不同的文件。train_val 中的所有规范都与训练阶段相关。并部署进行测试。我不确定 train_val 组合来自哪里,但我想这是因为您可以在 test_iter 之后验证您的模型并从那里继续训练。
由于您在测试期间不需要损失,而不是概率,您可以使用 softmax 作为概率输出函数,而不是部署中的 softmaxwithloss,或者您可以同时定义两者。
caffe test 命令执行前向操作,但不执行backward()(反向传播)操作,希望对您有所帮助