CNN中的前向网络
forward network in CNN
我是深度学习新手。我用caffe的时候发现有两个prototxt文件,一个是"deploy",一个是"train_val".
我知道 "train_val" 是用来训练模型的。但是对于 "deploy" 文件,有些人说它是用于测试图像的。
所以,我的问题是 "deploy" 是否只有 forward()
网络,所以测试图像数据只通过前向网络一次以获得分数?
理想情况下它应该是这样工作的,但是文件只是网络 definition.You 可以使用一个文件来训练并且 test.You 必须指定您希望某些斑点处于哪个阶段可用,意味着你可以定义两个输入数据层,一个在训练期间使用,另一个用于测试并指定相应的阶段,如下所示:
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 和部署文件将这两个阶段分成两个不同的 files.All 规范 train_val 与训练阶段相关。并为 testing.I 部署我不确定,train_val 组合来自哪里,但我想这是因为你可以在 test_iter 之后验证你的模型并继续从那里。
由于您不需要测试期间的损失,而不是概率,您可以使用 softmax 作为概率输出函数,而不是部署中的 softmaxwithloss,或者您可以同时定义两者。
caffe 测试命令执行前向操作但不执行后向()(反向传播)operation.I希望它有帮助
正如您已经注意到的,有一些 。
一个关键区别是 'deploy.prototxt'
通常缺少任何损失层。
当你没有为网络定义损失函数时,反向传播就没有意义:你会传播什么梯度?什么函数的梯度?
因此,caffe 中的一个 net
对象为所有阶段实现了 backward()
方法。然而,当您在没有损失函数(仅预测)的情况下测试网络时,此方法毫无意义。
我是深度学习新手。我用caffe的时候发现有两个prototxt文件,一个是"deploy",一个是"train_val".
我知道 "train_val" 是用来训练模型的。但是对于 "deploy" 文件,有些人说它是用于测试图像的。
所以,我的问题是 "deploy" 是否只有 forward()
网络,所以测试图像数据只通过前向网络一次以获得分数?
理想情况下它应该是这样工作的,但是文件只是网络 definition.You 可以使用一个文件来训练并且 test.You 必须指定您希望某些斑点处于哪个阶段可用,意味着你可以定义两个输入数据层,一个在训练期间使用,另一个用于测试并指定相应的阶段,如下所示:
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 和部署文件将这两个阶段分成两个不同的 files.All 规范 train_val 与训练阶段相关。并为 testing.I 部署我不确定,train_val 组合来自哪里,但我想这是因为你可以在 test_iter 之后验证你的模型并继续从那里。 由于您不需要测试期间的损失,而不是概率,您可以使用 softmax 作为概率输出函数,而不是部署中的 softmaxwithloss,或者您可以同时定义两者。 caffe 测试命令执行前向操作但不执行后向()(反向传播)operation.I希望它有帮助
正如您已经注意到的,有一些
一个关键区别是 'deploy.prototxt'
通常缺少任何损失层。
当你没有为网络定义损失函数时,反向传播就没有意义:你会传播什么梯度?什么函数的梯度?
因此,caffe 中的一个 net
对象为所有阶段实现了 backward()
方法。然而,当您在没有损失函数(仅预测)的情况下测试网络时,此方法毫无意义。