2017-07-12 10 views
1

TensorFlowを使用して簡単なニューラルネットワークを構築しようとしています。目標は、32ピクセル×32ピクセルのイメージで四角形の中心を見つけることです。矩形は5つのベクトルで記述されます。最初のベクトルは位置ベクトルであり、他の4つは方向ベクトルであり、長方形のエッジを構成します。 1つのベクトルには2つの値(xとy)があります。 ( - 6,0)TensorFlowを使用した簡単なフィードフォワードニューラルネットワークは学習しません。

enter image description here

このイメージの対応する入力は、(2,5)(0,4)(6,0)(0、-4)であろう。 センター(したがって、希望の出力)は(5,7)にあります。

私は次のようなルックスを思い付いコード:

 
    import tensorflow as tf 
    import numpy as np 
    import Rectangle_Records 

    def init_weights(shape): 
     """ Weight initialization """ 
     weights = tf.random_normal(shape, stddev=0.1) 
     return tf.Variable(weights) 

    def forwardprop(x, w_1, w_2): 
     """ Forward-propagation """ 
     h = tf.nn.sigmoid(tf.matmul(x, w_1)) 
     y_predict = tf.matmul(h, w_2) 
     return y_predict 

    def main(): 
     x_size = 10 
     y_size = 2 
     h_1_size = 256 

     # Prepare input data 
     input_data = Rectangle_Records.DataSet() 

     x = tf.placeholder(tf.float32, shape = [None, x_size]) 
     y_label = tf.placeholder(tf.float32, shape = [None, y_size]) 

     # Weight initializations 
     w_1 = init_weights((x_size, h_1_size)) 
     w_2 = init_weights((h_1_size, y_size)) 

     # Forward propagation 
     y_predict = forwardprop(x, w_1, w_2) 

     # Backward propagation 
     cost = tf.reduce_mean(tf.square(y_predict - y_label)) 

     updates = tf.train.GradientDescentOptimizer(0.01).minimize(cost) 

     # Run 
     sess = tf.Session() 
     init = tf.global_variables_initializer() 
     sess.run(init) 

     for i in range(200): 
      batch = input_data.next_batch(10) 
      sess.run(updates, feed_dict = {x: batch[0], y_label: batch[1]}) 

     sess.close() 

    if __name__ == "__main__": 
     main() 

悲しいことに、ネットワークが適切に学習しません。結果は遠すぎます。例えば、[[3.7.76]、[3.70766664]]がarround [[3.、7.]]でなければなりません。私は間違って何をしていますか?

+1

あなたはR^2やMSEを追跡しプロットしていますか? –

+0

いいえ、私はどのように知りません。私はこれをTensorFlowでやや難しいと思っています。 – Gizmo

+1

その目的のために予約したテストデータセットに対して手動で行うことができます。 3.71が3.7に近いようだから尋ねます。 –

答えて

7

主な問題は、トレーニング全体がone epochのためだけに行われていることです。十分なトレーニングではありません。次の変更を試してみてください。

sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 
for j in range(30): 
    input_data = Rectangle_Records.DataSet() 
    for i in range(200): 
     batch = input_data.next_batch(10) 
     loss, _ = sess.run([cost,updates], feed_dict = {x: batch[0], y_label: batch[1]}) 

    pred = sess.run(y_predict, feed_dict={x: batch[0]}) 
    print('Cost:', loss ) 
    print('pred:', pred) 
    print('actual:', batch[1]) 
sess.close() 
は、より高速な収束のための運動量オプティマイザにあなたのオプティマイザを変更

:お使いのネット​​ワークでも、単層、二ニューロンパーセプトロンができるはずであることをそう簡単ルックスを解くことを学ぶことですtf.train.AdamOptimizer(0.01).minimize(cost)

1

ニューラルネットの性能を向上させる方法はたくさんあります。いずれかを試してみてください

  1. はNNのどこのアンサンブルを使用(非常に有効であることが、私が見つけたrelu)層ごと
  2. 変更アクティベーション機能をより多くの層、または複数のノードを追加します各NNは
  3. はパラメータ
1

あなたはforgottを持っているを最適化するために、グリッドサーチを行う

  • は、より多くのトレーニングデータに持ち込むのR^2得点で重み付け投票を取得しますバイアスを追加する。この

    w_1 = init_weights((x_size, h_1_size)) 
    w_2 = init_weights((h_1_size, y_size)) 
    b_1 = init_bias((h_1_size,)) 
    b_2 = init_bias((y_size,)) 
    
    # Forward propagation 
    y_predict = forwardprop(x, w_1, w_2, b_1, b_2) 
    

    への主な変更それインサイド

    def init_bias(shape): 
        biases = tf.random_normal(shape) 
        return tf.Variable(biases) 
    
    def forwardprop(x, w_1, w_2, b_1, b_2): 
        """ Forward-propagation """ 
        h = tf.nn.sigmoid(tf.matmul(x, w_1) + b_1) 
        y_predict = tf.matmul(h, w_2) + b_2 
        return y_predict 
    

    これはあなたに多くの優れた精度が得られます。さらにレイヤーを追加したり、上記のようにさまざまなアクティベーション機能を試したりすることができます。

  • 1

    問題解決する。問題が線形であるため、ReLUアクティベーション機能が最も優れている可能性があります。

    反復回数はそれほど多くありません。 1000以上の反復を試してみてください。 100回の繰り返しごとにコスト値を印刷するか、データを収集して最後にプロットし、学習の進捗状況を確認します。

    import matplotlib.pyplot as plt 
    cost_history = np.arange(learning_steps, dtype=np.float) 
    ... 
    for epoch in range(learning_steps): 
        ... 
        cost_history[epoch] = sess.run(cost, feed_dict = {y: predict, y_:label}) 
    
    plt.plot(cost_history, 'r', label='Cost fn') 
    plt.yscale('log') 
    plt.show() 
    

    回線がダウンすると問題ありません。それが非常にラフで降下しない場合、学習速度が大きすぎる可能性があります。yorの場合、学習のスピードは非常に遅いため、200回程度の反復を行っても結果は得られません。代わりに0.1以上のような大きな値を試してください。 NNはまだ収束している可能性があります。学習曲線を見てください。

    関連する問題