Dense
レイヤーのみを使用してVanilla自動エンコーダーを作成しました。以下は私のコードです:
iLayer = Input ((784,))
layer1 = Dense(128, activation='relu' ) (iLayer)
layer2 = Dense(64, activation='relu') (layer1)
layer3 = Dense(28, activation ='relu') (layer2)
layer4 = Dense(64, activation='relu') (layer3)
layer5 = Dense(128, activation='relu' ) (layer4)
layer6 = Dense(784, activation='softmax' ) (layer5)
model = Model (iLayer, layer6)
model.compile(loss='binary_crossentropy', optimizer='adam')
(trainX, trainY), (testX, testY) = mnist.load_data()
print ("shape of the trainX", trainX.shape)
trainX = trainX.reshape(trainX.shape[0], trainX.shape[1]* trainX.shape[2])
print ("shape of the trainX", trainX.shape)
model.fit (trainX, trainX, epochs=5, batch_size=100)
1)softmax
は確率分布を提供します。わかった。これは、0〜1の確率で784個の値のベクトルを持つことを意味します。たとえば、[0.02、0.03 ..... 784個までのアイテム]では、784個の要素すべてを合計すると1になります。
2)これらの値でバイナリクロスエントロピーがどのように機能するのか理解できません。バイナリクロスエントロピーは、出力の2つの値に対するものですよね?
オートエンコーダーのコンテキストでは、モデルの入力と出力は同じです。したがって、入力値が[0,1]の範囲にある場合、sigmoid
を最後のレイヤーのアクティベーション関数として使用することは許容されます。それ以外の場合は、最後のレイヤーに適切なアクティベーション関数を使用する必要があります(例:linear
これはデフォルトのレイヤーです)。
損失関数については、入力データの値に戻ります。入力データが のみ ゼロと1の間 (それらの間の値ではなく)、binary_crossentropy
は損失関数として許容されます。それ以外の場合は、'mse'
(平均二乗誤差)または'mae'
(平均絶対誤差)などの他の損失関数を使用する必要があります。範囲[0,1]
の入力値の場合、通常使用されるbinary_crossentropy
を使用できます(例 Keras autoencoder tutorial および このペーパー =)。ただし、予測とラベルの両方がゼロでも1でもない場合(等しいかどうかに関係なく)binary_crossentropy
はゼロを返さないため、損失値がゼロになるとは思わないでください。 ここ は Hugo Larochelle のビデオです。ここでは、オートエンコーダーで使用される損失関数について説明しています(範囲[0,1]の入力でのbinary_crossentropy
の使用に関する部分) 5: )
具体的には、この例では、MNISTデータセットを使用しています。したがって、デフォルトでは、MNISTの値は[0、255]の範囲の整数です。通常、最初にそれらを正規化する必要があります。
trainX = trainX.astype('float32')
trainX /= 255.
これで、値は範囲[0,1]になります。したがって、sigmoid
をアクティベーション関数として使用し、binary_crossentropy
またはmse
のいずれかを損失関数として使用できます。
真のラベル値(グランドトゥルース)が[0,1]の範囲にある場合でも、なぜbinary_crossentropy
を使用できるのか?
トレーニングでは損失関数を最小化しようとしていることに注意してください。そのため、予測が真のラベルと等しいときに、使用した損失関数が最小値(必ずしもゼロに等しいとは限りません)に達する場合、それは許容可能な選択です。これが、次のように定義されるbinrayクロスエントロピーの場合であることを確認しましょう。
bce_loss = -y*log(p) - (1-y)*log(1-p)
ここで、y
は真のラベルであり、p
は予測値です。 y
を固定と見なし、p
のどの値がこの関数を最小化するかを見てみましょう:p
に関する導関数を取る必要があります(log
は自然であると仮定しました計算を簡単にするための対数関数):
bce_loss_derivative = -y*(1/p) - (1-y)*(-1/(1-p)) = 0 =>
-y/p + (1-y)/(1-p) = 0 =>
-y*(1-p) + (1-y)*p = 0 =>
-y + y*p + p - y*p = 0 =>
p - y = 0 => y = p
ご覧のとおり、バイナリクロスエントロピーはy=p
のとき、つまり真のラベルが予測ラベルと等しく、これがまさに探しているときに最小値を持ちます。