関数の引数で受け取った値を、one hotへ変換したい。
Q&A
Closed
解決したいこと
one hotに変換したい。
「該当するコード」に記載している関数の引数である、'y_hat'をone_hotに変換したいです。
解決策を教えていただきたいです。
発生している問題
「該当するコード」の関数内で、y_hatをone hotへ変換しているつもりですが、うまくできません。
ちなみに、yはone_hotへ変換することができています。
該当するソースコード
オリジナルの損失関数を作成しています。
config.N_CLASSESは、予測するクラス数を表していて、15587です。
def scce_with_ls(y, y_hat):
y = tf.one_hot(tf.cast(y, tf.int32), config.N_CLASSES)
pred = tf.math.argmax(y_hat, axis=1)
y_hat = tf.one_hot(tf.cast(pred, tf.int32), config.N_CLASSES)
return categorical_crossentropy(y, y_hat, label_smoothing=0.1)
入力値:y, y_hatのshapeとtype
yは、正解ラベルです。
y_hatは,各クラス(15587種)の予測確率です。
y-> shaep: (None, 1),
type: <class 'tensorflow.python.framework.ops.Tensor'>,
y_hat-> shape: (None, 15587)
type: <class 'tensorflow.python.framework.ops.Tensor'>
y, y_hatへ期待する出力
y-> shape(None, 1, 15587)
y_hat-> shape(None, 1, 15587)
y, y_hatの実際の出力
y_hatがone hotへ変換されておらず、yとy_hatのshapeが合ないため、下記に記載している、エラーが発生します。
y-> shape(None, 1, 15587)
y_hat-> shape(None, 15587)
発生しているエラー分
ValueError: in user code:
File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1021, in train_function *
return step_function(self, iterator)
File "<ipython-input-395-2b3ee9814ca9>", line 16, in scce_with_ls *
return categorical_crossentropy(y, y_hat, label_smoothing=0.1)
File "/usr/local/lib/python3.7/dist-packages/keras/losses.py", line 1790, in categorical_crossentropy
y_true, y_pred, from_logits=from_logits, axis=axis)
File "/usr/local/lib/python3.7/dist-packages/keras/backend.py", line 5083, in categorical_crossentropy
target.shape.assert_is_compatible_with(output.shape)
ValueError: Shapes (None, 1, 15587) and (None, 15587) are incompatible