是否可以动态更改ImageData
图层或MemoryData
图层的输入源?
我试图在每个时代对数据进行混洗,但我有图像和其他一些非图像功能,我想在网络的后期连接。我找不到一种可靠的方法来将图像和我的其他数据混合在一起,以保持两者的对齐方式。
因此,我正在考虑在每个时期重新生成imagelist.txt
以及非图像数据(在内存中),并将新文件附加到ImageData
层并使用新数据初始化MemoryDataLayer
。
如何在不重新启动培训过程的情况下确保使用新文本文件重新初始化网络。 (我希望网络在同一阶段继续训练,动力等......,只开始从新文件而不是最初编译的文件中读取图像文件)。
layer {
name: "imgdata"
type: "ImageData"
top: "imgdata"
top: "dlabel"
transform_param {
# Transform param here
}
image_data_param {
source: "path to imagelist.txt" ## This file changes after n iterartions
batch_size: XX
new_height: XXX
new_width: XXX
}
}
同样,我希望能够将重新洗牌的数据复制到MemoryData
层。我可以在训练中期打电话给Net.set_input_arrays
吗?
layers {
name: "data"
type: MEMORY_DATA
top: "data"
top: "label"
memory_data_param {
batch_size: XX
channels: X
height: XXX
width: XXX
}
我想提供一个没有python接口的答案,我是用C ++源代码完成的。
以英特尔/ caffe为例,因为目前我正在研究它,但您可以轻松尝试使用blvc / caffe。我假设您可以编译caffe源代码。
这是在源代码中更改的一个适当位置(在加载train_text.prototxt之后):
https://github.com/intel/caffe/blob/master/src/caffe/solver.cpp#L156
在块内,添加以下内容:
net_param.mutable_layer(0)->mutable_data_param()->set_source("/test/data/path/");
net_param.mutable_layer(1)->mutable_data_param()->set_source("/test/data/path/");
LOG(INFO) << "+++> " << net_param.layer(0).data_param().source();
LOG(INFO) << "+++> " << net_param.layer(1).data_param().source();
您将更改前两层的数据源(训练数据层和测试数据层)。
因此,如果要在其他方案中更改数据源,只需找到net_param,layer和data_param的上下文,就可以使用上面的函数调用来更改自己的数据路径。
实际上因为caffe使用google protobuffer,所以如果你想了解net_param,layer和data_param的完整接口,你需要构建caffe,然后检查文件:.build_release/src/caffe/proto/caffe.pb.h
(我使用Makefile构建,而不是cmake)。我不太了解protobuffer,如果你知道,你可以查看源代码:src/caffe/proto/caffe.proto
。