カテゴリクロスエントロピーは、ワンホットエンコードされた機能では正しく機能しません

Aug 18 2020

ワンホットエンコーディングデータで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つのまれな行で使用する正しい方法ですか?

回答

10xAI Aug 18 2020 at 13:52

それが機能するために-

  1. 出力ニューロン数を02に変更します
  2. Softmaxへの出力のアクティブ化
  3. 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のスレッド