2016-04-01 13 views
0

私はテンソルフローで単純な線形回帰を実装しようとしています(より高度なモデルに拡張することを目標にしています)。私の現在のコードは次のようになります:テンソルの線形回帰は非常に遅い

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アクセラレーションがないため、速度が遅いことが説明されていますが、これより速いと思われます。私はさまざまなオプティマイザを試しましたが、パフォーマンスは非常に似ています。

このコードをスピードアップする明確な方法はありますか?それ以外の場合は、テンソルフローがこれらのタイプの問題にはほとんど役に立たないように感じます。

答えて

4

NUM_STEPS * num_datapoints回の繰り返し(これは5百万回のサイクルにつながる)を必要とするポイントごとにネットワークを訓練するので、それは非常に遅いです。

あなたが実際にあなたのネットワークを訓練する必要があるのはこれが秒だけのカップルを取る

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

です。

+0

ありがとうございます。その変更はもちろん、コードを大幅に高速化しますが、これを行うと完全にランダムな(そして間違った解決策に)収束しているようです。私は実際にこれについても尋ねることを意味していました。最初のコードはすべてのデータを一度に訓練していましたが、正しい解決策が見つかりませんでした。私は、オンラインでいくつかのサンプルコードをいくつか見つけました。それらはすべて、それぞれのデータポイントについて学習します。何らかの理由で、これは最小化の収束を改善するようですか?私は本当になぜ理解していない。 – user3468216

+0

デフォルトの学習率は非常に高く、非収束の結果につながります。したがって、オプティマイザを作成するときは、学習率を明示的に選択します(例: AdamOptimizer(learning_rate = 0.0001)。 –

+0

さて、私はすでにさまざまなオプティマイザと学習率で多くの実験を行っていますが、データセット全体を一度に訓練すると正しい結果が得られません(私は常にモデルとは完全に無関係な係数を持つモデルを取得します置く)。たぶん私は何かが分かりませんが、誰かが私にテンソルフローの実装を指し示すことができた、またはそれを指し示すことができれば、本当に感謝しています。 – user3468216