我试图在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 回答
你有一个大的numpy数组位于主机内存中 . 您希望能够在CPU上并行处理它并将批次发送到设备 .
从TF 1.4开始,最好的方法是使用
tf.data.Dataset
,尤其是tf.data.Dataset.from_tensor_slices
. 但是,正如the documentation指出的那样,您可能不应该将numpy数组作为此函数的参数提供,因为它最终会被复制到设备内存中 . 你应该做的是使用占位符 . 文档中给出的示例非常明显:可以使用
.map
方法对切片应用进一步的预处理或数据增强 . 要确保这些操作同时发生,请确保仅使用tensorflow操作并避免使用tf.py_func
包装python操作 .这是发电机的一个很好的用例 . 您可以设置生成器函数,一次生成一个块的
numpy
矩阵 . 如果使用Keras
之类的软件包,则可以直接向train_on_batch
函数提供生成器 . 如果您更喜欢直接使用Tensorflow
,可以使用:注意:我使用占位符进行优化和丢失,您必须替换为您的定义 . 请注意,您的生成器应该产生一个 (x, y) 元组 . 如果您不熟悉生成器表达式,那么在线有很多示例,但这里有一个简单的示例来自
Keras
文档,该文档显示了如何批量读取文件中的numpy
矩阵:但更基本的是,低GPU使用率并不能真正指示加载批次的任何问题,而是您的批量大小可能太小 .