如何在tensorflow中批量训练时限制RAM使用?

时间:2018-04-18 13:19:40

标签: python tensorflow training-data

我正在使用大图像数据集训练深度神经网络,其中包含大小为40的小批量数据集。我的数据集采用.mat格式(我是可以轻松更改为任何其他格式,例如.npy格式(如果需要),并且在训练之前,加载为4-D numpy数组。我的问题是,在训练时,cpu-RAM(不是GPU RAM)非常快,并开始使用几乎一半的Swap内存。

我的训练代码有以下模式:

batch_size = 40
...
with h5py.File('traindata.mat', 'r') as _data:
    train_imgs = np.array(_data['train_imgs'])

# I can replace above with below loading, if necessary
# train_imgs = np.load('traindata.npy')

...

shape_4d = train_imgs.shape 
for epoch_i in range(max_epochs):
    for iter in range(shape_4d[0] // batch_size):
        y_ = train_imgs[iter*batch_size:(iter+1)*batch_size]
        ...
        ...

这似乎是完整训练数据的初始加载本身就成了瓶颈(在我中止之前占用了12 GB的cpu RAM)。

解决这个瓶颈的最有效方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

在内存中加载大数据集不是一个好主意。我建议你使用不同的东西加载数据集,看看TensorFlow中的数据集API:https://www.tensorflow.org/programmers_guide/datasets

您可能需要将数据转换为其他格式,但如果您的CSV或TXT文件中包含每行示例,则可以使用TextLineDataset并使用它来提供模型:

filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]
dataset = tf.data.TextLineDataset(filenames)

def _parse_py_fun(text_line):
    ... your custom code here, return np arrays

def _map_fun(text_line):
    result = tf.py_func(_parse_py_fun, [text_line], [tf.uint8])
    ... other tensorlow code here
    return result

dataset = dataset.map(_map_fun)
dataset = dataset.batch(4)
iterator = dataset.make_one_shot_iterator()
input_data_of_your_model = iterator.get_next()

output = build_model_fn(input_data_of_your_model)

sess.run([output]) # the input was assigned directly when creating the model