我正在使用 caffe 和 HDF5 层。它将把我的 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 轴是损失。
最佳答案
如果您只想针对当前问题执行此操作,那非常简单。请注意
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
中。我认为流程是这样的:
- 在
layers/hdf5_data_layer.cpp
,从文本文件中读取 hdf5 文件名。 - 然后是一个函数
LoadHDF5FileData
尝试将 hdf5 数据加载到 blob 中。 - 内部
LoadHDF5FileData
,blob 变量 -hdf_blobs_
- 已声明并填充在函数util/hdf5.cpp
内. - 内部
util/hdf5.cpp
,函数hdf5_load_nd_dataset
第一次来电hdf5_load_nd_dataset_helper
相应地 reshape Blob 。我认为您可以在此处获取一个 hdf5 文件的数据尺寸。迭代多个 hdf5 文件是在void HDF5DataLayer<Dtype>::Next()
中完成的。函数位于layers/hdf5_data_layer.cpp
。所以这里需要将之前收到的数据维度相加。
最后,您需要弄清楚如何将它们传递回solver.cpp
.
关于machine-learning - 如何使用 HDF5 层根据迭代次数计算纪元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268065/