初心者向けの 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