0

初心者向けの Tensorflow の基本的なニューラル ネットワークを調べていました [1]。エントロピー値の計算とその使用方法を理解するのに苦労しています。この例では、正しいラベルを保持するためにプレース ホルダーが作成されます。

y_ = tf.placeholder(tf.float32, [None, 10])

交差エントロピー合計 y'.log(y) は、次のように計算されます。

reduct = -tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])
cross_entropy = tf.reduce_mean( reduct )

私たちが持っていると仮定する次元を見ると(要素ごとの乗算):

y_ * log(y) = [バッチ x クラス] x [バッチ x クラス]

y_ * log(y) = [バッチ x クラス]

そして、簡単なチェックでこれを確認します:

y_ * tf.log(y)
<tf.Tensor 'mul_8:0' shape=(?, 10) dtype=float32>

今、ここで私が理解していないものがあります。y私の理解では、クロスエントロピーの場合、 (予測) とy_(オラクル)の分布を考慮する必要があります。したがって、最初reduce_meanに y とy_をそれらの列 (クラスごと) で処理する必要があると思います。次に、サイズの 2 つのベクトルを取得します。

y_ = [クラス x 1 ]

y = [クラス x 1 ]

y_ は「正しい」分布であるため、次のことを行います (この例では、ベクトルが反転していることに注意してください)。

log(y_) = [ クラス x 1 ]

そして、要素ごとの乗算を行います。

yx ログ (y_)

これにより、クラスの長さを持つベクトルが得られます。最後に、このベクトルを合計して単一の値を取得します。

Hy(y_) = sum( yx log(y_) )

ただし、これは実行されている計算ではないようです。私のエラーは誰か説明できますか?たぶん、良い説明のあるページを教えてください。これに加えて、ワンホット エンコーディングを使用しています。したがって、log(1) = 0 および log(0) = -infinity なので、計算でエラーが発生します。オプティマイザーが導関数を計算することは理解していますが、クロスエントロピーはまだ計算されていませんか?

ティア。

[1] https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html

4

1 に答える 1

0

あなたが説明したことのほとんどは正しいです。でも:

私の理解では、クロスエントロピーの場合、y (予測) と y_ (オラクル) の分布を考慮する必要があります。したがって、最初に y と y_ の reduce_mean を列ごとに (クラスごとに) 計算する必要があると仮定します。

まず、単一のベクトルを作成する必要があります (この場合、batch_member ごとに 10 個の要素があり、次にバッチを追加します)。次に、それを reduce_means して単一の数値を取得します。したがって、正しい順序は、y と y_ を要素ごとに比較してから、還元することです。

log(0)-problem について: よく見られるのはそのためです。

reduct = -tf.reduce_sum(y_ * tf.log(y + 1e-5), reduction_indices=[1])
于 2016-08-01T12:42:31.853 に答える