在Tensorflow中批量读取numpy矩阵

时间:2017-07-19 21:18:41

标签: python numpy tensorflow gpu

我正在尝试在GPU上运行一些回归模型。虽然我的GPU利用率非常低,但却高达20%。完成代码后,

 for i in range(epochs):
    rand_index = np.random.choice(args.train_pr,
        size=args.batch_size)
    rand_x = X_train[rand_index]
    rand_y = Y_train[rand_index]

我使用这三行来为每次迭代选择一个随机批处理。所以,我想问一下培训的时间,我可以为下一次迭代再准备一批吗?

我正在研究回归问题,而不是分类问题。我已经在Tensorflow中看到了线程,但发现了仅用于图像的示例,并且没有用于训练的大型矩阵100000X1000的示例。

2 个答案:

答案 0 :(得分:3)

你有一个大的numpy数组位于主机内存中。您希望能够在CPU上并行处理它并将批次发送到设备。

从TF 1.4开始,最好的方法是使用tf.data.Dataset,尤其是tf.data.Dataset.from_tensor_slices。但是,正如the documentation指出的那样,你应该提供你的numpy数组作为这个函数的参数,因为它最终会被复制到设备内存中。你应该做的是使用占位符。文档中给出的示例非常明显:

features_placeholder = tf.placeholder(features.dtype, features.shape)
labels_placeholder = tf.placeholder(labels.dtype, labels.shape)

dataset = tf.data.Dataset.from_tensor_slices((features_placeholder, labels_placeholder))
# [Other transformations on `dataset`...]
iterator = dataset.make_initializable_iterator()

sess.run(iterator.initializer, feed_dict={features_placeholder: features,
                                          labels_placeholder: labels})

可以使用.map方法对切片应用进一步的预处理或数据增强。为了确保这些操作同时发生,请确保仅使用tensorflow操作并避免使用tf.py_func包装python操作。

答案 1 :(得分:0)

这是发电机的一个很好的用例。您可以设置生成器函数,一次为一个块生成numpy矩阵的切片。如果您使用Keras之类的包,则可以直接向train_on_batch函数提供生成器。如果您希望直接使用Tensorflow,可以使用:

sess = tf.Session()
sess.run(init)
batch_gen = generator(data)
batch = batch_gen.next()
sess.run([optimizer, loss, ...], feed_dict = {X: batch[0], y: batch[1]})

注意:我使用占位符进行优化和丢失,您必须替换为您的定义。请注意,您的生成器应该产生(x,y)元组。如果您不熟悉生成器表达式,那么在线有很多示例,但这是一个简单的示例,来自Keras文档,其中显示了如何批量读取文件中的numpy矩阵:

def generate_arrays_from_file(path):
    while 1:
        f = open(path)
        for line in f:
            x, y = process_line(line)
            yield (x, y)
        f.close()

但更基本的是,低GPU使用率并不能真正指示加载批次的任何问题,而是批量大小可能太小。