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

时间:2015-08-25 15:33:44

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

我正在尝试通过C ++ API使用MINST Caffe示例,但是我在解决如何重新构建我将在训练后部署的网络原型文件文件时遇到了一些麻烦。我已经使用原始文件(lenet_train_test.prototxt)训练和测试了模型,但是当我想部署它并像C++ and OpenCV example那样进行预测时,我意识到我必须修改输入部分才能生成它类似于他们拥有的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”的来源。

1 个答案:

答案 0 :(得分:4)

为了将 train_val 原型文档“转换”为 deploy ,您可以删除输入数据层(读取您的train / val数据)并将其替换为声明

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

请注意, deploy 原型文件没有两个阶段用于训练和测试只有一种风格。
用这个声明替换输入数据层基本上告诉caffe你负责提供数据,并且net应该为这个大小的输入分配空间。

关于比例:一旦你部署你的网络,网络无法控制输入 - 它不会为你读取数据作为 train_val 网。因此,您必须自己在>将输入数据提供给网络之前对其进行缩放。您可以使用DataTransformer类来帮助您转换输入blob,就像在训练期间转换它们一样。

关于第一个dim: 10:caffe中的每个Blob(即数据/参数存储单元)都有4个维度:批量大小,通道,高度和宽度。该参数实际上意味着网络应该一次为10个输入的批次分配空间 “神奇”数字10来自于谷歌网和ILSVRC中用于分类图像的其他竞争对手的方式:他们从每个图像中分类10个作物并对输出进行平均以产生更好的分类结果。