如何为 C++ API 修改 Caffe 网络输入?

How to modify Caffe network input for C++ API?

我正在尝试通过 C++ API 使用 MINST Caffe 示例,但我在弄清楚如何重构我将在训练后部署的网络 prototxt 文件时遇到了一些麻烦。我已经使用原始文件(lenet_train_test.prototxt), but when I want to deploy it and make predictions like in the C++ and OpenCV example, I realise I have to modify the input section to make it similar to the deploy.prototxt 他们拥有的文件。

训练和测试了模型

我可以用 deploy.prototxt 文件的这一部分替换 lenet_train_test.prototxt 的训练层和测试层中的信息吗?

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

我将传递给网络进行分类的图像将是灰度和 24*24 像素,我还想像对 MINST 数据集所做的那样对其进行缩放,所以我可以修改该部分以这个?

name: "CaffeNet"
input: "data"
input_shape {
  dim: 10
  dim: 1
  dim: 24
  dim: 24
}
transform_param {
scale: 0.00390625
}

虽然我不完全确定“dim: 10”的来源。

为了 "convert" 你 train_val prototxt 到一个 deploy 你移除输入数据层(读取您的 train/val 数据)并将它们替换为声明

name: "CaffeNet"
input: "data"
input_shape {
  dim: 10
  dim: 1
  dim: 24
  dim: 24
}

请注意,deploy prototxt 没有两个阶段,仅用于训练和测试单一风格。
用这个声明替换输入数据层基本上告诉caffe你负责提供数据,网络应该为这个大小的输入分配space。

关于规模:一旦你部署你的网络,网络就无法控制输入——它不会为你读取数据作为[=中的输入数据层21=]train_val净。因此,您必须先 自己缩放输入数据,然后 将其馈送到网络。您可以使用 DataTransformer class 来帮助您以与训练期间相同的方式转换输入 blob。

关于第一个dim: 10:caffe中的每个Blob(即data/parameters存储单元)都有4个维度:batch-size、channels、height和width。这个参数实际上意味着网络应该一次为 10 个输入的批次分配 space。
"magic" 数字 10 来自 googlenet 和其他竞争者在 ILSVRC 挑战赛中用于 class 化图像的方式:他们 class 从每张图像中裁剪 10 次并对输出进行平均以产生更好的结果 class化验结果。