深度学习——关于caffe的一些幼稚问题

deep learning - a number of naive questions about caffe

我正在尝试了解 caffe 的基础知识,特别是与 python 一起使用。

我的理解是模型定义(比如给定的神经网络架构)必须包含在 '.prototxt' 文件中。

并且当您使用 '.prototxt' 在数据上训练模型时,您将 weights/model 参数保存到 '.caffemodel' 文件

此外,用于训练的 '.prototxt' 文件(包括学习率和正则化参数)与用于 testing/deployment 的文件之间存在差异,testing/deployment 不包括它们。

问题:

  1. '.prototxt' 是训练的基础是否正确? '.caffemodel' 是训练(权重)的结果,使用 '.prototxt'关于训练数据?
  2. 有一个'.prototxt'用于训练,一个用于 测试,并且只有轻微的差异(学习率 和训练中的正则化因素),但是 nn 架构(假设你使用神经网络)是否相同?

对于这些基本问题和可能一些非常不正确的假设,我深表歉意,我正在做一些在线研究,上面的几行总结了我迄今为止的理解。

让我们看一下 BVLC/caffe 提供的示例之一:bvlc_reference_caffenet.
您会注意到实际上有 3 '.prototxt' 个文件:

  • train_val.prototxt:这个文件描述了训练阶段的网络架构。
  • depoly.prototxt:该文件描述了测试时的网络架构("deployment")。
  • solver.prototxt: this file is very small and contains "meta parameters" for training. For example, the ,

train_val.prototxtdeploy.prototxt所代表的网络架构应该大体相似。两者之间有几个主要区别:

  • 输入数据:在训练期间,通常使用一组预定义的输入 training/validation。因此,train_val 通常包含一个显式输入层,例如 "HDF5Data" 层或 "Data" 层。另一方面,deploy通常事先并不知道它会得到什么输入,它只包含一个声明:

    input: "data"
    input_shape {
      dim: 10
      dim: 3
      dim: 227
      dim: 227
    }
    

    声明网络期望的输入及其维度。
    或者,可以放置一个 "Input" 层:

    layer {
      name: "input"
      type: "Input"
      top: "data"
      input_param { shape { dim: 10 dim: 3 dim: 227 dim: 227 } }
    }
    
  • 输入标签:在训练期间,我们为网络提供 "ground truth" 预期输出,此信息在 deploy 期间显然不可用。
  • 损失层:在训练期间必须定义损失层。该层告诉求解器在每次迭代时应朝哪个方向调整参数。此损失将网络的当前预测与预期 "ground truth" 进行比较。损失的梯度是 back-propagated 到网络的其余部分,这就是驱动学习过程的原因。在 deploy 期间没有损失,也没有 back-propagation.

在 caffe 中,您提供 train_val.prototxt 描述网络、train/val 数据集和损失。此外,您提供 solver.prototxt 描述训练的元参数。训练过程的输出是一个.caffemodel包含网络训练参数的二进制文件。
训练网络后,您可以使用 deploy.prototxt.caffemodel 参数来预测新输入和未见输入的输出。

是的,但是有不同类型的 .prototxt 文件 例如

https://github.com/BVLC/caffe/blob/master/examples/mnist/lenet_train_test.prototxt

这是训练和测试网络

对于命令行训练,ypu 可以使用求解器文件,例如也是 .prototxt 文件

https://github.com/BVLC/caffe/blob/master/examples/mnist/lenet_solver.prototxt