1

conv-deconv ネットを展開しています。私の質問は、トレーニング中にクロス エントロピーが常に nan だったため、ソルバーが重みを更新しなかったことです。一日中コードをチェックしましたが、どこが間違っているのかわかりませんでした。以下は私のアーキテクチャです:これ ここに画像の説明を入力 が私のクロスエントロピー関数です

ys_reshape = tf.reshape(ys,[-1,1])
prediction = tf.reshape(relu4,[-1,1])
cross_entropy = tf.reduce_mean(-(ys_reshape*tf.log(prediction)))
train_step = tf.train.AdamOptimizer(0.01).minimize(cross_entropy)

ここで、ys の次元は [1,500,500,1]、ys_reshape は [250000,1]、relu4 は [1,500,500,1]、予測は [250000,1] です。ラベル行列 ys の値は {0,1} で、これは 2 つのカテゴリの密な予測です。

train_step を出力すると、None と表示されます。誰でも私を助けることができますか?

4

1 に答える 1

6

問題を適切な数行のコードに絞り込むという素晴らしい仕事をしました。

だからあなたの予測確率は直接の出力ReLU4ですか?

それには2つの問題があります。

1 つ目: 1 より大きい可能性があります。

2番:

正確にゼロにすることができます (入力ReLU4が負の場合、出力はゼロになります)。

log(0) -> NaN

これに対する通常のアプローチは、線形活性化 (ReLU なし) を各クラスの対数オッズとして扱うことです。

単純な実装は常に壊れています (数値の問題)。

単一のクラスがあるため、tf.sigmoid_cross_entropy_with_logitsを使用する必要があります


また、トレーニング op ​​が返される場合None: ここでは、ops と tensor の間に微妙な違いがあります。と を試してprint(train_step)くださいprint(cross_entropy)

op を評価すると何かが実行され、テンソルを評価すると値が得られます。したがって、フォワード パスで計算されたクロス エントロピーの値を探している場合は、次のようにします。_, loss_value = sess.run([train_step, cross_entropy])

于 2016-10-22T15:31:31.340 に答える