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 次迭代)。
当我尝试在 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
层并动态输入图像。
如果您对动态加载图像感兴趣,请查看此
使用部署版本时,您可以像这样为您的网络设置输入数据:
x = data;
y = labels;
solver.net.blobs['data'].data[...] = x
net.blobs['label'].data[...] = y
然后你可以调用 solver.net.forward()
只看到输出;
或者你可以调用 solver.net.step(1)
到 运行 向前和向后(训练 1 次迭代)。