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

时间:2016-05-02 15:54:23

标签: computer-vision deep-learning caffe conv-neural-network

是否可以动态更改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
  }

2 个答案:

答案 0 :(得分:1)

根据comments的建议,$startTime = Carbon::parse($request->input('start')); $endTime = Carbon::parse($request->input('end')); $classRoomCount = ClassRoom::where(function ($query) { $query->where('start', '>=', $startTime) ->where('end', '<=', $startTime); })->orWhere(function ($query) { $query->where('start', '>=', $endTime) ->where('end', '<=', $endTime); })->count(); if ($classRoomCount > 0) { echo 'Classroom is already booked'; } 的帮助可以解决您的问题。可以在caffe here中找到python图层的使用示例。

在python脚本中,您可以编写代码以通过保留其对齐来对数据进行随机播放。

答案 1 :(得分:0)

我想提供一个没有python接口的答案,我是用C ++源代码完成的。

以Intel / 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