2016-07-28 86 views
3

我通过遵循和调整tensorflow教程,为我的回归问题设计了张量流的神经网络。但是,由于我的问题的结构(大约300.000个数据点和使用昂贵的FTRLOptimizer),我的问题花了很长时间才能执行,即使使用我的32个CPU计算机(我没有GPU)。使用队列的火车模型Tensorflow

根据this commenthtop的快速确认,似乎我有一些单线程操作,它应该是feed_dict。

因此,建议here,我试图使用队列多线程我的程序。

我写了一个简单的代码文件,队列训练的模型如下:

import numpy as np 
import tensorflow as tf 
import threading 

#Function for enqueueing in parallel my data 
def enqueue_thread(): 
    sess.run(enqueue_op, feed_dict={x_batch_enqueue: x, y_batch_enqueue: y}) 

#Set the number of couples (x, y) I use for "training" my model 
BATCH_SIZE = 5 

#Generate my data where y=x+1+little_noise 
x = np.random.randn(10, 1).astype('float32') 
y = x+1+np.random.randn(10, 1)/100 

#Create the variables for my model y = x*W+b, then W and b should both converge to 1. 
W = tf.get_variable('W', shape=[1, 1], dtype='float32') 
b = tf.get_variable('b', shape=[1, 1], dtype='float32') 

#Prepare the placeholdeers for enqueueing 
x_batch_enqueue = tf.placeholder(tf.float32, shape=[None, 1]) 
y_batch_enqueue = tf.placeholder(tf.float32, shape=[None, 1]) 

#Create the queue 
q = tf.RandomShuffleQueue(capacity=2**20, min_after_dequeue=BATCH_SIZE, dtypes=[tf.float32, tf.float32], seed=12, shapes=[[1], [1]]) 

#Enqueue operation 
enqueue_op = q.enqueue_many([x_batch_enqueue, y_batch_enqueue]) 

#Dequeue operation 
x_batch, y_batch = q.dequeue_many(BATCH_SIZE) 

#Prediction with linear model + bias 
y_pred=tf.add(tf.mul(x_batch, W), b) 

#MAE cost function 
cost = tf.reduce_mean(tf.abs(y_batch-y_pred)) 

learning_rate = 1e-3 
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 
available_threads = 1024 

#Feed the queue 
for i in range(available_threads): 
    threading.Thread(target=enqueue_thread).start() 

#Train the model 
for step in range(1000): 
    _, cost_step = sess.run([train_op, cost]) 
    print(cost_step) 
Wf=sess.run(W) 
bf=sess.run(b) 

此代码不起作用,因为每一个我称之为x_batch时间,一个y_batch也出列,反之亦然。然后,我不会将这些功能与相应的“结果”进行比较。

有没有简单的方法来避免这个问题?

回答

1

我的错误,一切工作正常。 我被误导了,因为我在算法的每一步估计了我在不同批次上的表现,也因为我的模型对于虚拟模型太复杂了(我应该有类似y = W * x或y = x + b的东西)。 然后,当我试图在控制台上打印时,我对不同的变量进行了几次sess.run的启动,并得到明显不一致的结果。

0

尽管如此,你的问题已经解决了,想要告诉你在你的代码中效率低下。当你创建你的RandomShuffleQueue时,你指定了capacity=2**20。在所有队列capacity

的上限可被存储在该队列 元素的数量。

队列将尝试在队列中放置尽可能多的元素,直到它达到此限制。所有这些元素都在吃你的RAM。如果每个元素只包含1个字节,那么您的队列将会吃掉1Mb的数据。如果你的队列中有10Kb的图像,你会吃10Gb的RAM。

这非常浪费,尤其是因为您从不需要排队中有太多元素。所有你需要确定的是你的队列永远不会是空的。所以找到合理的队列容量,不要使用大量的数字。