1. ホーム
  2. tensorflow

[解決済み] TensorFlow SparseCategoricalCrossentropyはどのように機能するのですか?

2022-03-07 13:18:06

質問

TensorFlowのこの損失関数を理解しようとしているのですが、うまくいきません。それは スパースカテゴリカルクロステントロピー . 他の損失関数はすべて同じ形状の出力とラベルを必要としますが、この特定の損失関数はそうではありません。

ソースコードです。

import tensorflow as tf;

scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 1,    1,    1,    2   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32)
);
print("Loss:", Loss.numpy());

というエラーが発生します。

InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2).  
Label values: 1 1 1 2 [Op:SparseSoftmaxCrossEntropyWithLogits]

損失関数SparseCategoricalCrossentropyに適切なパラメータを与えるには?

どのように解決するのですか?

SparseCategoricalCrossentropyとCategoricalCrossentropyはどちらもカテゴリー別クロスエントロピーを計算する。唯一の違いは、ターゲット/ラベルをどのようにエンコードするかである。

SparseCategoricalCrossentropyを使用する場合、ターゲットはカテゴリのインデックス(0から始まる)で表現されます。出力は4x2の形状をしており、これは2つのカテゴリがあることを意味する。 したがって、ターゲットは0または1のエントリを持つ4次元のベクトルでなければならない。例えば

scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 0,    0,    0,    1   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))

これは、CategoricalCrossentropyとは対照的で、ラベルは一発符号化されている必要があります。

cce = tf.keras.losses.CategoricalCrossentropy();
Loss = cce(
  tf.constant([ [1,0]    [1,0],    [1, 0],   [0, 1]   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))

SparseCategoricalCrossentropyは、カテゴリがたくさんある場合に効率的である。