在Caffe培训期间更改输入数据层

问题描述 投票:2回答:2

是否可以动态更改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
  }
computer-vision deep-learning caffe conv-neural-network
2个回答
1
投票

Python layers所建议的那样,你可以在comments的帮助下解决你的问题。可以在caffe here中找到python层的使用示例。

在python脚本中,您可以编写代码以通过保留其对齐来混洗数据。


0
投票

我想提供一个没有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

© www.soinside.com 2019 - 2024. All rights reserved.