2017-08-18 5 views
1

私はTensorflowを使用してタイタニックカグル競争を試みようとしています。損失は最初から0に等しい

私の前処理された列車のデータは次のようになります。

data_x: 

PassengerId Pclass Sex Age SibSp Parch Ticket Fare Cabin \ Embarked 
1    2  1 1 38.0  1  0  500 71.2833 104 
2    3  3 1 26.0  0  0  334 7.9250  0 
3    4  1 1 35.0  1  0  650 53.1000 130 
4    5  3 0 35.0  0  0  638 8.0500  0 

data_y: 

Survived 
0 
1 
1 
1 
0 

それは右、バイナリだから乗客が生き残ったかどうソフトマックス関数が予測する作業を行う必要がありますか?

X = tf.placeholder(tf.float32, [None, data_x.shape[1]]) 
Y_ = tf.placeholder(tf.float32, [None, 1]) 

W = tf.Variable(tf.truncated_normal([10, 1])) 
b = tf.Variable(tf.zeros([1])) 

# Parameters 
learning_rate = 0.001 

#The model 
Y = tf.matmul(X,W) + b 

# Loss function 
entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 
loss = tf.reduce_mean(entropy) # computes the mean over examples in the batch 

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

acc = tf.equal(tf.argmax(Y_, 1), tf.argmax(Y, 1)) 
acc = tf.reduce_mean(tf.cast(acc, tf.float32)) 

tf.summary.scalar('loss', loss) 
tf.summary.scalar('accuracy', acc) 
merged_summary = tf.summary.merge_all() 

init = tf.global_variables_initializer() 

そしてfinallyn、トレーニング一部:だからここ

は、私は私のモデルを構築する方法です

with tf.Session() as sess: 
    sess.run(init) 
    writer = tf.summary.FileWriter("./graphs", sess.graph) 
    for i in range(1000): 
     _, l, summary = sess.run([optimizer, loss, merged_summary], feed_dict={X: data_x, Y_: data_y}) 
     writer.add_summary(summary, i) 
     if i%100 == 0: 
      print (i) 
      print ("loss = ", l) 

しかし、損失がある第一歩ので、0に等しい...

テンソルボードの可視化は次のとおりです。

enter image description here

ここで何が起こっていると思いますか?

答えて

0

使用

entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 

代わり

entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y) 
+0

あなたの答えをありがとう。あなたはその2つの違いを説明できますか? –

+0

あなたはこの質問の答えで説明を見つけることができます: https://stackoverflow.com/questions/37312421/tensorflow-whats-the-difference-between-sparse-softmax-cross-entropy-with-logi –

2

実は、私はあなたがソフトマックスの間違ったのアイディアを得たと思います。 確率分布であるように出力を変換します。 ただし、出力が1つのニューロンだけであるため、softmaxは常に1に変換します。

ロジットでソフトマックス+クロスエントロピーを実行するには、2つのニューロンを出力する必要があります。 1つは0(否定)である確率である。また、ラベルを変更する必要があります。正の例のラベルは[1, 0]、負の値は[0, 1]です。その後、クロスエントロピーを使用することができ、それは動作するはずです。

EDIT:別の良いオプションは、 tf.nn.sigmoid_cross_entropy_with_logitsの損失機能を使用することです。 Sigmoidは、クロスエントロピーのために必要な間隔を[0, 1]に変換し、(可能な)他の出力を心配しません。この方法で、現在のラベルとアーキテクチャで動作します。

+0

もちろんです!私は忘れてしまった...それはホットエンコードされている必要があります。私はそれを試してみましょうとあなたに知らせる:) –

関連する問題