2016-07-23 8 views
2

私はTensorFlowでロジスティック回帰を実装しようとしていましたが、これはMNISTの例に従いますが、CSVのデータです。各行は1つのサンプルで、12のディメンションを持ちます。TensorFlowロジスティック回帰の実装時に返す

batch_size = 5 
learning_rate = .001 
x = tf.placeholder(tf.float32,[None,12]) 
y = tf.placeholder(tf.float32,[None,2]) 
W = tf.Variable(tf.zeros([12,2])) 
b = tf.Variable(tf.zeros([2])) 
mult = tf.matmul(x,W) 
pred = tf.nn.softmax(mult+b) 
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 
avg_cost = 0 
total_batch = int(len(Xtrain)/batch_size) 
for i in range(total_batch): 
    batch_xs = Xtrain[i*batch_size:batch_size*i+batch_size] 
    batch_ys = ytrain[i*batch_size:batch_size*i+batch_size] 
    _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,y: batch_ys}) 
    print(c) 

Xtrainは252x10 numpyの配列で、ytrainは252x2 1ホットnumpyの配列です:私のコードは次のようです。

問題:コストcは最初の反復(値は0.6931 ...)で計算されますが、その後の各反復では 'nan'が返されます。

私が試したこと:モデルの各コンポーネントが機能していることを確認しました。この問題は最初の反復後に完全に発生します。私は学習率で遊んだことがありますが、それは何もしません。私はtruncated_normal(私はロジスティック回帰のためにする必要はありませんとにかく)としてウェイトを初期化しようとしましたが、それもどちらか助けにはなりません。

だから、どんな考えですか?私はそれを修正しようと約3時間を費やし、アイデアがなくなった。 TensorFlowがコスト関数を最適化するときに何かがうまくいかないようです。

+0

ありがとう、すぐに働いた:

はさらに読書のために、私はこの偉大な答えをお勧めします。あなたが説明を気にしないなら、tf.maximum(pred、1e-15)は何をするのですか?なぜ私は持っていた問題を解決しますか? – Alex

+0

うれしかったです。下記参照! –

答えて

3

log(pred)がpred = 0に定義されていないため、問題が発生しています。これを回避するには、tf.maximum(pred, 1e-15)またはtf.clip_by_value(pred, 1e-15, 1.0)を使用します。

しかし、より良い解決策は、softmaxとcross-entropyを別々に適用する代わりに、tf.nn.softmax_cross_entropy_with_logits(pred)を使用しています。これは、このようなエッジケース(したがってすべての問題)を自動的に処理します。 https://stackoverflow.com/a/34243720/5829427

関連する問題