我正在尝试在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的示例。
答案 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使用率并不能真正指示加载批次的任何问题,而是批量大小可能太小。