【发布时间】:2019-01-18 12:45:10
【问题描述】:
我正在使用Tensorflow 中的tf.train.GradientDescentOptimizer() 训练一个线性回归问题。一般来说,我可以使用placeholders和feed_dict={}每次输入一批样本并训练权重W。但是,我想使用tf.FIFOQueue 而不是feed_dict。例如,在下面的代码中,我输入X和Y和训练权重W:
v_dimen = 300
n_samples = 10000
batch_size = 32
X = tf.random_normal([n_samples, v_dimen], mean=0, stddev=1)
Y = tf.random_normal([n_samples, 1], mean=0, stddev=1)
q_in = tf.FIFOQueue(capacity=5, dtypes=tf.float32) # enqueue 5 batches
enqueue_op = q_in.enqueue(X)
numberOfThreads = 1
qr = tf.train.QueueRunner(q_in, [enqueue_op] * numberOfThreads)
tf.train.add_queue_runner(qr)
X_batch = q_in.dequeue()
q_out = tf.FIFOQueue(capacity=5, dtypes=tf.float32) # enqueue 5 batches
enqueue_op = q_out.enqueue(Y)
numberOfThreads = 1
qr = tf.train.QueueRunner(q_out, [enqueue_op] * numberOfThreads)
tf.train.add_queue_runner(qr)
Y_batch = q_out.dequeue()
W = tf.Variable(tf.random.truncated_normal((v_dimen, 1), mean=0.0,stddev=0.001))
predicted_Y = f(X_batch) # some function on X, like tf.matmul(X_batch,W)
loss = tf.nn.l2_loss(Y_batch - predicted_Y)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss, var_list=[W])
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
for i in range(10000):
sess.run([optimizer]) # would like to run on mini batches
coord.request_stop()
coord.join(threads)
我想知道如何更改代码以便能够使用 X_batch 和 Y_batch 以 batch_size 的小批量训练 W。
【问题讨论】:
-
您的代码有效,我没有发现任何问题。但是对于导入数据,最好使用 tf.data 来完成。文档在这里,tensorflow.org/guide/datasets?hl=en
-
感谢@LIXuhong 的回复。但是在我的代码中,我没有指定任何批量大小,所以我猜它每次只从队列中读取一个样本。我想我需要使用
q_in.dequeue_many(batch_size)之类的东西。 -
@LIXuhong 好的,那么你的意思是我可以使用 tf.data 创建我的批次。
-
对不起,我以为你确实使用了
batch_size... 看我的回答。
标签: python tensorflow enqueue