张量流的线性回归非常慢

时间:2016-04-01 10:33:48

标签: python performance regression tensorflow

我正在尝试在张量流中实现简单的线性回归(目标是最终将其扩展到更高级的模型)。我目前的代码如下:

def linear_regression(data, labels):
    # Setup placeholders and variables
    num_datapoints = data.shape[0]
    num_features = data.shape[1]
    x = tf.placeholder(tf.float32, [None, num_features])
    y_ = tf.placeholder(tf.float32, [None])
    coeffs = tf.Variable(tf.random_normal(shape=[num_features, 1]))
    bias = tf.Variable(tf.random_normal(shape=[1]))

    # Prediction
    y = tf.matmul(x, coeffs) + bias

    # Cost function
    cost = tf.reduce_sum(tf.pow(y-y_, 2))/(2.*num_datapoints)


    # Optimizer
    NUM_STEPS = 500
    optimizer = tf.train.AdamOptimizer()
    train_step = optimizer.minimize(lasso_cost)

    # Fit the model
    init = tf.initialize_all_variables()
    cost_history = np.zeros(NUM_STEPS)
    sess = tf.Session()
    sess.run(init)

    for i in range(NUM_STEPS):
        if i % 100 == 0:
            print 'Step:', i
        for xi, yi in zip(data, labels):
            sess.run(train_step, feed_dict={x: np.expand_dims(xi, axis=0), 
                y_: np.expand_dims(yi, axis=0)})
            cost_history[i] = sess.run(lasso_cost, feed_dict={x: data,
                y_:labels})

    return sess.run(coeffs), cost_history

代码有效,并找到正确的系数。但是,它非常慢。在我的MacBook Pro上,只需几分钟即可为包含1000个数据点和10个功能的数据集运行一些训练时期。由于我正在运行OSX,我没有GPU加速,这可以解释一些缓慢,但我认为它可能比这更快。我已尝试过不同的优化器,但性能非常相似。

有没有一些明显的方法来加速这段代码?否则,感觉像张量流对于这些类型的问题几乎没用。

1 个答案:

答案 0 :(得分:4)

速度很慢,因为您需要逐点训练网络,这需要NUM_STEPS * num_datapoints次迭代(导致 5万次次循环)。

您实际需要训练网络的所有内容

for i in range(NUM_STEPS):
    sess.run(train_step, feed_dict={x: data, y_:labels})

这只需几秒钟。