カテゴリクロスエントロピーは、ワンホットエンコードされた機能では正しく機能しません
ワンホットエンコーディングデータでcategorical_crossentropyの問題に苦労しています。問題は、以下に示すコードの変更されていない出力にあります。
inputs = keras.Input(shape=(1190,), sparse=True)
lay_1 = layers.Dense(1190, activation='relu')
x = lay_1(inputs)
x = layers.Dense(10, activation='relu')(x)
out = layers.Dense(1, activation='sigmoid')(x)
self.model = keras.Model(inputs, out, name='SimpleD2Dense')
self.model.compile(
optimizer=keras.optimizers.Adam(),
loss=tf.losses.categorical_crossentropy,
metrics=['accuracy']
)
Epoch 1/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 2/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 3/3
1572/1572 - 7s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
データについてのいくつかの言葉:1190の機能(119のカテゴリを持つ10の実際の機能)。入力は、サンプルごとに1190個の値を持つデータフレーム行です。出力は2進値0または1です。
以前に行われた試み:binary_crossentropyは満足のいく結果で使用されましたが、サンプル数は検証データで良好な結果を得るのに十分ではありません。さまざまなアクティベーションとレイヤーサイズを使用しようとしました。
主な質問は、categorical_crossentropyが機能しない理由と、それを正しい方法で使用する方法です。
また、データ表現に関する1つの懸念は、単純なワンホットエンコードされたデータの1つのまれな行で使用する正しい方法ですか?
回答
それが機能するために-
- 出力ニューロン数を02に変更します
- Softmaxへの出力のアクティブ化
- OHE出力のすべてのベクトルを保持します
これがKerasの内部設計方法です。同じことが公式ドキュメントページに書かれています
BinaryCrossentropyクラス
ラベルクラスが2つしかない場合(0と1と想定)、このクロスエントロピー損失を使用します。例ごとに、予測ごとに1つの浮動小数点値が必要です。以下のスニペットでは、4つの例のそれぞれに1つの浮動小数点値のみがあり、y_predとy_trueの両方の形状が[batch_size]です。
CategoricalCrossentropyクラス
y_predとy_trueの両方の形状は[batch_size、num_classes]です。
そして、我々はそれが分類保つために知っているマルチクラスは、すべて確認する必要がありnum_classの私たちが使用するので、お互いに対する出力をソフトマックス
参考
Keras公式ページ
と同様にSEスレッド
同様のSEのスレッド