使用队列在Tensorflow中训练模型

我在tensorflow中设计了一个神经网络来解决我的回归问题,我参考并调整了tensorflow的教程。然而,由于我的问题结构(约300,000个数据点和使用了昂贵的FTRLOptimizer),即使在我的32核CPU机器上(我没有GPU),执行时间也过长。

根据这个评论和通过htop的快速确认,似乎我有一些单线程操作,应该是feed_dict导致的。

因此,按照这里的建议,我尝试使用队列来多线程化我的程序。

我编写了一个简单的代码文件,使用队列来训练模型,如下所示:

import numpy as npimport tensorflow as tfimport threading#并行入队数据的函数def enqueue_thread():    sess.run(enqueue_op, feed_dict={x_batch_enqueue: x, y_batch_enqueue: y})#设置用于“训练”模型的(x, y)对的数量BATCH_SIZE = 5#生成数据,其中y=x+1+少量噪声x = np.random.randn(10, 1).astype('float32')y = x+1+np.random.randn(10, 1)/100#创建模型变量 y = x*W+b,然后W和b都应该收敛到1。W = tf.get_variable('W', shape=[1, 1], dtype='float32')b = tf.get_variable('b', shape=[1, 1], dtype='float32')#准备入队的占位符x_batch_enqueue = tf.placeholder(tf.float32, shape=[None, 1])y_batch_enqueue = tf.placeholder(tf.float32, shape=[None, 1])#创建队列q = tf.RandomShuffleQueue(capacity=2**20, min_after_dequeue=BATCH_SIZE, dtypes=[tf.float32, tf.float32], seed=12, shapes=[[1], [1]])#入队操作enqueue_op = q.enqueue_many([x_batch_enqueue, y_batch_enqueue])#出队操作x_batch, y_batch = q.dequeue_many(BATCH_SIZE)#使用线性模型+偏置进行预测y_pred=tf.add(tf.mul(x_batch, W), b)#MAE成本函数cost = tf.reduce_mean(tf.abs(y_batch-y_pred))learning_rate = 1e-3train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)init = tf.initialize_all_variables()sess = tf.Session()sess.run(init)available_threads = 1024#填充队列for i in range(available_threads):    threading.Thread(target=enqueue_thread).start()#训练模型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,反之亦然。然后,我无法将特征与相应的“结果”进行比较。

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


回答:

我的错误,一切正常。我被误导了,因为我在算法的每一步都估计了不同批次的性能,而且我的模型对于一个简单的模型来说太复杂了(我应该使用类似y=W*x或y=x+b的模型)。然后,当我在控制台尝试打印时,我多次执行了sess.run在不同的变量上,显然得到了不一致的结果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注