如何使用HDF5层从迭代次数计算时期?

时间:2017-04-07 01:03:10

标签: machine-learning neural-network deep-learning caffe

我正在使用带有HDF5层的caffe。它会将我的hdf5list.txt读为

/home/data/file1.h5
/home/data/file2.h5
/home/data/file3.h5

在每个文件* .h5中,我有10.000张图片。所以,我总共有大约30,000张图片。在每次迭代中,我将使用批量大小为10作为设置

layer {
  name: "data"
  type: "HDF5Data"
  top: "data"
  top: "label"
  hdf5_data_param {
    source: "./hdf5list.txt"
    batch_size: 10
    shuffle: true
  }
  include {
    phase: TRAIN
  }
}

使用caffe,它的输出喜欢

Iterations 10, loss=100
Iterations 20, loss=90
...

我的问题是,如何计算一些时代,尊重损失?这意味着我想绘制一个图表,其中x轴是纪元数,y-asix是亏损。

相关链接:Epoch vs iteration when training neural networks

1 个答案:

答案 0 :(得分:1)

如果你想为当前的问题做这件事,那就太容易了。注意

Epoch_index = floor((iteration_index * batch_size) / (# data_samples))

现在,在solver.cpp中,找到Caffe打印Iterations ..., loss = ...的行。只需使用上面的公式计算纪元索引并打印出来。你完成了。别忘了重新编译Caffe。

如果您想要修改Caffe以便始终显示纪元索引,那么您首先需要计算所有HDF5文件的数据大小。通过浏览Caffe HDF5层代码,我认为您可以通过hdf_blobs_[0]->shape(0)获取数据样本的数量。您应该为所有HDF5文件添加此内容,并在solver.cpp中使用该号码。

变量hdf_blobs_layers/hdf5_data_layer.cpp中定义。我相信它填充在函数util/hdf5.cpp中。我认为这就是流程的方式:

  1. layers/hdf5_data_layer.cpp中,从文本文件中读取hdf5文件名。
  2. 然后函数LoadHDF5FileData尝试将hdf5数据加载到blob中。
  3. LoadHDF5FileData内,声明了blob变量 - hdf_blobs_ - 并将其填充到函数util/hdf5.cpp中。
  4. util/hdf5.cpp内,函数hdf5_load_nd_dataset首先调用hdf5_load_nd_dataset_helper,相应地重塑整个blob。我认为这是您获取一个hdf5文件的数据的维度的地方。迭代多个hdf5文件是在void HDF5DataLayer<Dtype>::Next()中的layers/hdf5_data_layer.cpp函数中完成的。所以在这里你需要加上之前收到的数据维度。
  5. 最后,你需要弄清楚如何将它们传回solver.cpp