如何在一个hdf5数据文件中读取批次进行培训?

时间:2016-07-06 13:52:03

标签: python tensorflow deep-learning

我有一个大小为(21760, 1, 33, 33)的hdf5训练数据集。 21760是整个训练样本。我想使用大小为128的小批量训练数据来训练网络。

我想问:

如何从每个具有张量流的整个数据集中提取128小批量训练数据?

3 个答案:

答案 0 :(得分:9)

如果您的数据集太大而无法像keveman建议的那样导入到内存中,您可以直接使用h5py对象:

import h5py
import tensorflow as tf

data = h5py.File('myfile.h5py', 'r')
data_size = data['data_set'].shape[0]
batch_size = 128
sess = tf.Session()
train_op = # tf.something_useful()
input = # tf.placeholder or something
for i in range(0, data_size, batch_size):
    current_data = data['data_set'][position:position+batch_size]
    sess.run(train_op, feed_dict={input: current_data})

如果您愿意,还可以运行大量迭代并随机选择批处理:

import random
for i in range(iterations):
    pos = random.randint(0, int(data_size/batch_size)-1) * batch_size
    current_data = data['data_set'][pos:pos+batch_size]
    sess.run(train_op, feed_dict={inputs=current_data})

或顺序:

for i in range(iterations):
    pos = (i % int(data_size / batch_size)) * batch_size
    current_data = data['data_set'][pos:pos+batch_size]
    sess.run(train_op, feed_dict={inputs=current_data})

您可能希望编写一些更复杂的代码,随机查看所有数据,但会跟踪已使用的批次,因此您不会比其他批次更频繁地使用任何批次。完成整个训练集后,再次启用所有批次并重复。

答案 1 :(得分:7)

您可以将hdf5数据集读入numpy数组,并将numpy数组的切片提供给TensorFlow模型。像下面这样的伪代码可以工作:

import numpy, h5py
f = h5py.File('somefile.h5','r')
data = f.get('path/to/my/dataset')
data_as_array = numpy.array(data)
for i in range(0, 21760, 128):
  sess.run(train_op, feed_dict={input:data_as_array[i:i+128, :, :, :]})

答案 2 :(得分:1)

alkamen's方法在逻辑上似乎是正确的,但是使用它并没有得到任何积极的结果。我最好的猜测是:使用上面的代码示例1,在每次迭代中,网络都会重新训练,而忘记了在上一个循环中学到的所有知识。因此,如果我们每次迭代获取30个样本或批次,则在每个循环/迭代中,仅使用30个数据样本,那么在下一个循环中,所有内容都将被覆盖。

在以下屏幕快照中找到此方法

Training always starting afresh

可以看出,损失和准确性总是重新开始。如果有人可以分享解决此问题的方法,我将感到高兴。