2017-11-16 21 views
1

Hej、回帰ニューラルネットワークの評価

回帰問題を解決するための小さなプログラムを作成しようとしています。私のデータセットはここでは4つのランダムx(x1、x2、x3、x4)と1 yの値です。

0.634585 0.552366 0.873447 0.196890 8.75 

私はトレーニングの後、私は私のモデルは損失を示すことによって、どのように良い評価したいと思いますので、できるだけ近くにy値を予測したい知っている:行の1つは、このようになります。私のミスでも優れているか、どこ

X_data = tf.placeholder(shape=[None, 4], dtype=tf.float32) 
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32) 

# Input neurons : 4 
# Hidden neurons : 2 x 8 
# Output neurons : 3 
hidden_layer_nodes = 8 

w1 = tf.Variable(tf.random_normal(shape=[4,hidden_layer_nodes])) # Inputs -> Hidden Layer1 
b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes])) # First Bias 
w2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1])) # Hidden layer2 -> Outputs 
b2 = tf.Variable(tf.random_normal(shape=[1])) # Third Bias 

hidden_output = tf.nn.relu(tf.add(tf.matmul(X_data, w1), b1)) 
final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, w2), b2)) 

loss = tf.reduce_mean(-tf.reduce_sum(y_target * tf.log(final_output), axis=0)) 

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) 
train = optimizer.minimize(loss) 

init = tf.global_variables_initializer() 

steps = 10000 

with tf.Session() as sess: 

    sess.run(init) 

    for i in range(steps): 

     sess.run(train,feed_dict={X_data:X_train,y_target:y_train}) 

     # PRINT OUT A MESSAGE EVERY 100 STEPS 
     if i%500 == 0: 

      print('Currently on step {}'.format(i)) 

    training_cost = sess.run(loss, feed_dict={X_data:X_test,y_target:y_test}) 
    print("Training cost=", training_cost) 

たぶん誰かが常に私のトレーニング:) I中にエラーを表示する方法を、知っている:残念ながら、私はいつも

Training cost= nan 

の最も重要な行は次のようになり可能性を受け取りますtf.estimatorでこれがどのように行われているかを知っているが、そうではない。データセットが必要な場合は、教えてください。

乾杯!

+0

回帰における入力と出力のアクティブ化は、「線形」でなければなりません。隠れた - 'relu'か何か他の。 回帰ケースに関するあなたの損失関数を理解していません。これをチェックしてください。あなたの「ナノ」はログ機能によって引き起こされたものと思われます。 – avchauzov

+0

ありがとうございます。私は私のアクティベーション機能とロス機能を変更しようとしましたが、私のエラーは最大7000に達していません。使用されているアクティベーション機能は現在隠れたレイヤーでreluであり、単に出力レイヤーではアクティブ化されていないので、 "final_output = tf.add tf.matmul(hidden_​​output、w2)、b2)」とコスト関数「tf.reduce_sum(tf.square(final_output-y_target))」を使用します。 ラベルが0と8の間でばらついているときに、どこから大きなエラーが発生するのだろうか? – Schnurrberto

+0

今私が理解していることは、0と1の間の値しか供給できないので、Sigmoidアクティベーション機能は出力レイヤーにあってはならないということです。 私は何をしようとしていても、コスト関数は、エラーは常に非常に大きくなる! – Schnurrberto

答えて

1

これは、Relu活性化機能が爆発勾配を引き起こすためです。したがって、それに応じて学習率を下げる必要があります。さらに、別のアクティベーション機能を試すこともできます(このためには、まずデータセットを正規化する必要があるかもしれません)。

ここでは、(In simple multi-layer FFNN only ReLU activation function doesn't converge)は、あなたの場合と同様の問題です。答えに従うと分かります。

これが役に立ちます。

+0

あなたの答えをありがとう。あなたは正しいですが、learning_rateが助けになりましたが、活性化関数をシグモイドに、オプティマイザをAdagradOptimizerに変更するだけで、5の損失を受けました。0は値がすべてランダムであると仮定して考えると良いです。 tf.estimatorの例では、評価中に損失またはエラーが継続的に発生しています。データセットを調べている間に変化するエラーが絶えず見えるようにするにはどうすればよいでしょうか? – Schnurrberto

関連する問題