首页 文章

在Tensorflow中批量读取numpy矩阵

提问于
浏览
2

我试图在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 回答

  • 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操作 .

  • 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使用率并不能真正指示加载批次的任何问题,而是您的批量大小可能太小 .

相关问题