3

深いニューラルネットワークアーキテクチャを使用して、バイナリラベル値-1と+1で分類しようとしています。ここに私のコードはtensorflowでそれを行うです。TensorFlowのバイナリ分類、予想外の大きな値の損失と精度

import tensorflow as tf 
import numpy as np 
from preprocess import create_feature_sets_and_labels 

train_x,train_y,test_x,test_y = create_feature_sets_and_labels() 

x = tf.placeholder('float', [None, 5]) 
y = tf.placeholder('float') 

n_nodes_hl1 = 500 
n_nodes_hl2 = 500 
n_nodes_hl3 = 500 

n_classes = 1 
batch_size = 100 

def neural_network_model(data): 

    hidden_1_layer = {'weights':tf.Variable(tf.random_normal([5, n_nodes_hl1])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))} 

    hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))} 

    hidden_3_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])), 
         'biases':tf.Variable(tf.random_normal([n_nodes_hl3]))} 

    output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl3, n_classes])), 
         'biases':tf.Variable(tf.random_normal([n_classes]))} 


    l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases']) 
    l1 = tf.nn.relu(l1) 

    l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), hidden_2_layer['biases']) 
    l2 = tf.nn.relu(l2) 

    l3 = tf.add(tf.matmul(l2, hidden_3_layer['weights']), hidden_3_layer['biases']) 
    l3 = tf.nn.relu(l3) 

    output = tf.transpose(tf.add(tf.matmul(l3, output_layer['weights']), output_layer['biases'])) 
    return output 



def train_neural_network(x): 
    prediction = neural_network_model(x) 
    cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(prediction, y)) 
    optimizer = tf.train.AdamOptimizer().minimize(cost) 

    hm_epochs = 10 

    with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      i = 0 
      while i < len(train_x): 
       start = i 
       end = i + batch_size 
       batch_x = np.array(train_x[start:end]) 
       batch_y = np.array(train_y[start:end]) 

       _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, 
               y: batch_y}) 
       epoch_loss += c 
       i+=batch_size 

      print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', epoch_loss) 

     # correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 
     # accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 

     print (test_x.shape) 
     accuracy = tf.nn.l2_loss(prediction-y,name="squared_error_test_cost")/test_x.shape[0] 
     print('Accuracy:', accuracy.eval({x: test_x, y: test_y})) 

train_neural_network(x) 

これは私がこれを実行したときに私が手に出力されます:非MNIST進分類の本当の不足があると私は取得しています値が正しい場合、私は理解していない

('Epoch', 0, 'completed out of', 10, 'loss:', -8400.2424869537354) 
('Epoch', 1, 'completed out of', 10, 'loss:', -78980.956665039062) 
('Epoch', 2, 'completed out of', 10, 'loss:', -152401.86713409424) 
('Epoch', 3, 'completed out of', 10, 'loss:', -184913.46441650391) 
('Epoch', 4, 'completed out of', 10, 'loss:', -165563.44775390625) 
('Epoch', 5, 'completed out of', 10, 'loss:', -360394.44857788086) 
('Epoch', 6, 'completed out of', 10, 'loss:', -475697.51550292969) 
('Epoch', 7, 'completed out of', 10, 'loss:', -588638.92993164062) 
('Epoch', 8, 'completed out of', 10, 'loss:', -745006.15966796875) 
('Epoch', 9, 'completed out of', 10, 'loss:', -900172.41955566406) 
(805, 5) 
('Accuracy:', 5.8077128e+09) 

例。正確さは、私が期待したものと全く同じです。私はその大きな値の代わりにパーセンテージを期待していました。

私は、機械学習の背後にある理論を幾分確信しています。私はテンソルフローを使って私のアプローチの正しさを伝えることができません。

私のバイナリ分類へのアプローチが正しいかどうか教えてください。 また、私のコードの正確な部分は正しいですか?このことから

+0

あなたのネットワークは不安定であるようです。より小さなレイヤーで計算を実行するか、またはxavier-glorot初期化を使用してください。 – martianwars

+0

私はあなたのインデントが問題のPythonのために正しくないと思う。元のコードと同じにしてください(コードを貼り付けようとしているのがわかりますが、字下げを正しくコピーしないとPythonのデバッグがもっと難しくなります)。 –

+1

@NeilSlater固定インデント。 –

答えて

5

バイナリラベル値 - -1と+1

。 。 。 0.0と1.0を想定している - これはあなたの選択した損失関数sigmoid_cross_entropy_with_logitsと非常によく仕事に行くされていない

実際-1.0と+1.0

ある私が train_ytest_yに値を想定しています。負の値 yが原因です。しかし、ロス関数の選択はバイナリ分類に適しています。 yの値を0と1に変更することをお勧めします。

さらに、ネットワークの出力は最終的な予測ではありません。損失関数sigmoid_cross_entropy_with_logitsは、出力層にシグモイド伝達関数を持つネットワークで動作するように設計されていますが、損失関数が適用されていますが、の前にはが実行されています。あなたの訓練コードが正しいように見える

私はtf.transposeについて100%確信していません - あなたがそれを個人的に削除するとどうなりますか?

output = tf.add(tf.matmul(l3, output_layer['weights']), output_layer['biases']) 

どちらの方法でも、これは「ロジット」出力ですが、予測はしません。 outputの値は、非常に確かな予測のために高くなる可能性があります。これは後でシグモイド関数がないために非常に高い値を説明するでしょう。だから、(これは例が正のクラスである確率/信頼を表して)予測テンソルを追加します。

prediction = tf.sigmoid(output) 

あなたは、精度を計算するためにそれを使用することができます。あなたの精度計算は、L2エラーに基づいてはならず、正しい値の合計をコメントアウトしたコードに近いものにするべきです(マルチクラス分類のようです)。バイナリ分類のtrue/falseとの比較のためには、予測を閾値化し、真のラベルと比較する必要があります。このようなもの:

predicted_class = tf.greater(prediction,0.5) 
correct = tf.equal(predicted_class, tf.equal(y,1.0)) 
accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 

精度値は0.0〜1.0でなければなりません。パーセンテージで欲しいならば、もちろん100倍にしてください。

+0

ありがとうNeil!しかし、まだいくつかの問題があります。詳細で質問を更新する。 –

+0

@VineetKaushik:異なる場合は、*あなたの質問を変更しないでください*。例えば、私の提案された修正を追加せず、なぜそれが今働いていないのか尋ねてください。それは私の答え、つまりすべての仕事と、同じ問題の他の誰かの利益を無効にするからです。 –

+0

@VineetKaushik:私の答えが訓練とテストの際に大きな間違った値で問題を過ぎ去ったのを助けたら、代わりに新しい問題。 –

関連する問題