Python 在Tensorflow中批量读取numpy矩阵

Python 在Tensorflow中批量读取numpy矩阵,python,numpy,tensorflow,gpu,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] 我使用这三行为每个迭代选择一个随机批。所以,我想问一下,培训什么时候开始,

我试图在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中的线程,但只找到了用于图像的示例,没有用于培训的大小为10000x1000的大型矩阵的示例

这是发电机的一个很好的用例。您可以设置一个生成器函数,一次生成一块
numpy
矩阵的切片。如果您使用像
Keras
这样的软件包,您可以将发电机直接提供给
train\u on\u 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]})
注意:我正在为优化器和loss使用占位符,您必须替换为您的定义。请注意,生成器应该生成一个(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使用率低并不意味着加载批处理时出现任何问题,而是意味着批处理大小可能太小。

主机内存上有一个很大的numpy阵列。您希望能够在CPU上并行处理它,并向设备发送批处理

自TF1.4以来,最好的方法是使用
TF.data.Dataset
,尤其是
TF.data.Dataset.from_tensor_slices
。但是,正如所指出的,您可能不应该将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操作。这是问题的重复:使用此方法,我可以在特定步骤对x和y进行更改吗?假设我正在使用K交叉验证,我需要在某个步骤之后,将x的一些样本与中间的一些其他样本交换。有可能吗?谢谢@迪帕克:是的!我编辑了我的问题以标记预处理应该发生的位置。我相信sccript中有一些错误,因为对于tf.py_func,tf.placeholder应该是输入而不是Numpy数组。您可以参考以下内容:运行脚本时是否出现错误?请告诉我更多。对我来说很好。嘿,当我运行它时,我得到了以下错误。