【问题标题】:forward network in CNNCNN中的前向网络
【发布时间】:2017-11-22 08:53:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    正如您已经注意到的,有一些fundamental differences between 'train_val.prototxt' and 'deploy.prototxt'。
    一个关键区别是'deploy.prototxt' 通常没有任何损失层。
    当你没有为网络定义损失函数时,反向传播就没有意义:你会传播什么梯度?什么函数的梯度?

    因此,caffe 中的net 对象在所有阶段都实现了backward() 方法。然而,当您在没有损失函数(仅预测)的情况下测试网络时,这种方法毫无意义。

    【讨论】:

      【解决方案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
        }
      

      在训练期间,将使用前一层,而忽略第二层。 在测试阶段,第一层将被忽略,第二层将用作测试的输入。

      另一点是,在测试期间,我们需要预测的准确性,因为我们不再需要更新权重 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()(反向传播)操作,希望对您有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        相关资源
        最近更新 更多