Caffe:在 python 内加载图像和标签以进行微调

Caffe: Loading images and labels within python for fine-tuning

当我尝试在 python 中加载一批图像 + 标签并尝试使用它来训练网络时,我遇到了一些问题。 我正在处理一对图像,我将它们转换为一个图像(例如,通过对两个图像的等效像素进行平均),然后将其提供给网络。由于对的数量太大(单个图像两两的组合)无法将所有图像存储在内存中,因此我在每次迭代中创建每个批次,我想将其提供给网络。

我正在以这种方式实例化网络:

solver = caffe.get_solver(path_to_solver_file)

其中输入网络层定义为:

layer {
  name: "data"
  type: "ImageData"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  image_data_param { 
    batch_size: 1
    new_height: 227
    new_width: 227
  }
}
layer {
  name: "data"
  type: "ImageData"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  image_data_param {
    batch_size: 1
    new_height: 227
    new_width: 227
  }
}

在我之前的实验中,我在 image_data_param 中有一个 source 参数,我会在其中传递一个文件用于训练和测试的图像和标签。 但是,由于我想在 python 中加载它们,我删除了 source 参数,但出现以下错误:

0830 17:01:49.014819 1967923200 layer_factory.hpp:77] Creating layer data

I0830 17:01:49.014858 1967923200 net.cpp:91] Creating Layer data

I0830 17:01:49.014868 1967923200 net.cpp:399] data -> data

I0830 17:01:49.014890 1967923200 net.cpp:399] data -> label

I0830 17:01:49.014910 1967923200 image_data_layer.cpp:38] Opening file 

I0830 17:01:49.014935 1967923200 image_data_layer.cpp:53] A total of 0 images.

Segmentation fault: 11

我还没到这一步,但在我能够实例化网络之后,我打算加载批处理并使用以下方法执行 SGD 优化的一个步骤:

net.blobs["data"].data[...] = images
net.blobs["label"].data[...] = labels
net.step(1)

我搜索了使用 python 执行微调和测试的示例和教程(例如,here and here),但是大多数只讨论测试阶段的正向传递,而微调网络的那些使用源参数定义训练数据(标签和图像),而不是直接从 python 界面加载。

图层ImageData只能从一个文本文件中读取图像,文本文件每行保存图像的地址。您不能使用 ImageData 层并动态输入图像。

如果您对动态加载图像感兴趣,请查看此 。我建议使用部署版本(post 中解释的第三个选项),它更方便、更灵活。

使用部署版本时,您可以像这样为您的网络设置输入数据:

x = data;
y = labels;
solver.net.blobs['data'].data[...] = x
net.blobs['label'].data[...] = y

然后你可以调用 solver.net.forward() 只看到输出; 或者你可以调用 solver.net.step(1) 到 运行 向前和向后(训练 1 次迭代)。