CNN中的前向网络

时间:2017-06-20 01:35:17

标签: machine-learning neural-network deep-learning caffe

我是深度学习的新手。当我使用caffe时,我发现有两个prototxt文件,一个是“deploy”,另一个是“train_val”。
我知道“train_val”用于训练模型。但对于“部署”文件,有些人说它是用来测试图像的 所以,我的问题是“部署”只有forward()网络,所以测试图像数据只能通过前向网络一次获得分数吗?

2 个答案:

答案 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()方法。然而,当您测试没有损失函数的网络(仅预测)时,这种方法毫无意义。