【发布时间】:2016-07-06 13:52:03
【问题描述】:
我有一个大小为(21760, 1, 33, 33) 的 hdf5 训练数据集。 21760 是训练样本的总数。我想使用大小为128 的小批量训练数据来训练网络。
我想问:
如何每次用tensorflow从整个数据集中提供128 mini-batch 训练数据?
【问题讨论】:
标签: python tensorflow deep-learning
我有一个大小为(21760, 1, 33, 33) 的 hdf5 训练数据集。 21760 是训练样本的总数。我想使用大小为128 的小批量训练数据来训练网络。
我想问:
如何每次用tensorflow从整个数据集中提供128 mini-batch 训练数据?
【问题讨论】:
标签: python tensorflow deep-learning
如果你的数据集太大以至于无法像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})
您可能想要编写一些更复杂的代码,随机遍历所有数据,但跟踪已使用的批次,因此您不会比其他批次更频繁地使用任何批次。完成训练集的完整运行后,再次启用所有批次并重复。
【讨论】:
您可以将 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, :, :, :]})
【讨论】:
i 很大时,例如10万,怎么养?
21760训练样本,你只有21760/128不同的小批量。您必须围绕 i 循环编写一个外部循环,并在训练数据集上运行许多 epoch。
21760/128?
alkamen's 方法在逻辑上似乎是正确的,但我没有得到任何积极的结果。我最好的猜测是:使用上面的代码示例 1,在每次迭代中,网络都会重新训练,忘记在前一个循环中学到的所有内容。因此,如果我们每次迭代获取 30 个样本或批次,在每个循环/迭代中,仅使用 30 个数据样本,然后在下一个循环中,所有内容都会被覆盖。
在下面找到这种方法的屏幕截图
可以看出,损失和准确性总是重新开始。如果有人可以分享解决此问题的可能方法,我会很高兴。
【讨论】: