【问题标题】:How to modify Caffe network input for C++ API?如何修改 C++ API 的 Caffe 网络输入?
【发布时间】:2015-11-19 09:43:12
【问题描述】:

我正在尝试通过 C++ API 使用 MINST Caffe 示例,但在确定如何重构我将在训练后部署的网络 prototxt 文件时遇到了一些麻烦。我已经使用原始文件 (lenet_train_test.prototxt) 训练和测试了模型,但是当我想部署它并像在 C++ and OpenCV example 中那样进行预测时,我意识到我必须修改输入部分以使其类似于deploy.prototxt 他们拥有的文件。

是否可以将 lenet_train_test.prototxt 的训练和测试层中的信息替换为 deploy.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”是从哪里来的。

【问题讨论】:

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


    【解决方案1】:

    为了将您的 train_val prototxt“转换”为 deploy,您需要删除输入数据层(读取您的 train/val 数据)并用声明替换它们

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

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

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

    关于第一个dim: 10:caffe中的每个Blob(即数据/参数存储单元)都有4个维度:batch-size、channels、height和width。这个参数实际上意味着网络应该一次为 10 个输入的批次分配空间。
    “神奇”数字 10 来自 googlenet 和 ILSVRC 挑战赛中的其他竞争对手用于对图像进行分类的方式:他们从每张图像中对 10 种作物进行分类,并对输出进行平均以产生更好的分类结果。

    【讨论】:

    • 如果我已经将图像作为 OpenCV Mat,是否可以将每个像素乘以 0.00390625 来执行此缩放步骤,而无需使用 DataTransformer 类?
    • @JackSimpson,我不能 100% 确定,但您可能会这样做。
    • @JackSimpson 嗨,我想知道你能不能解决这个问题?你能和我分享你的经验吗?我正在运行并遇到同样的问题。谢谢
    • 是的,当我使用模型进行预测时,我最终将每个像素相乘。
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2017-12-23
    • 2018-02-12
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多