如何使用 HDF5 层从迭代次数计算 epoch?
Posted
技术标签:
【中文标题】如何使用 HDF5 层从迭代次数计算 epoch?【英文标题】:How to compute epoch from iteration number using HDF5 layer? 【发布时间】:2017-09-02 05:52:19 【问题描述】:我正在使用带有 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】:如果您只想针对当前问题执行此操作,则非常简单。请注意,
Epoch_index = floor((iteration_index * batch_size) / (# data_samples))
现在,在 solver.cpp
中,找到 Caffe 打印 Iterations ..., loss = ...
的行。只需使用上述公式计算 epoch index 并打印出来。你完成了。不要忘记重新编译 Caffe。
如果您想修改 Caffe 使其始终显示 epoch 索引,那么您首先需要计算所有 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
,从而相应地重塑blob。我认为这是您将为一个 hdf5 文件获取数据尺寸的地方。在layers/hdf5_data_layer.cpp
的void HDF5DataLayer<Dtype>::Next()
函数中完成对多个hdf5 文件的迭代。所以这里需要把之前收到的数据维度加起来。
最后,您需要弄清楚如何将它们传递回solver.cpp
。
【讨论】:
感谢 Parag,这是一个不错的解决方案。但是,如您所见,我的 hdf5 文件存储在文本列表文件中。你认为我们可以从hdf_blobs_[0]->shape(0).
获得文件总数吗?
我就是这么说的。如果您只需要针对此问题的解决方案,那么您知道您的数据样本数量,并且您不必使用 hdf_blobs
等。有关您的问题的详细信息,请参阅我的编辑。
谢谢,我会试试的。您是否尝试过打印纪元号。我不知道为什么 caffe 没有这个选项,而其他深度学习工具有这个选项。
不,我没有尝试打印一个纪元。如果您只想为一个问题/一次执行此操作,我的建议是对样本数量进行硬编码。以上是关于如何使用 HDF5 层从迭代次数计算 epoch?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Tensorflow 数据集 API 与训练和验证集一起使用
神经网络中的Epoch、Iteration、Batchsize