知りたいこと
PytorchのCrossEntropyLoss()の挙動
Python
1from torch import nn 2nn.CrossEntropyLoss()
試したこと
Python
1from torch import nn 2 3# yは、xの要素を確率として捉えられるよう規格化したもの 4x = torch.tensor([[2., 5., 3.]]) 5y = torch.tensor([[0.2, 0.5, 0.3]]) 6 7# 正解ラベルは「1」とする 8true_label = torch.tensor([1]) 9 10#x, yそれぞれのクロスエントロピーを出力する 11print('CrossEntropy-x:', nn.CrossEntropyLoss()(x, true_label)) 12print('CrossEntropy-y:', nn.CrossEntropyLoss()(y, true_label))
上記を実行すると、下記の出力となりました。
Python
1CrossEntropy-x: tensor(0.1698) 2CrossEntropy-y: tensor(0.9398)
疑問点
以下のことを伺いました。
0. PytorchのCrossEntropyLoss()関数では、({予測値}, {正解ラベル})という形式で引数を与える。
0. ここで与える"予測値"は、関数内でsoftmax関数により確率のように規格化されるため、CrossEntropyLoss関数に渡すときには、規格化する必要はない。
前項"試したこと"では、確率として規格化する前の"予測値(x)"と、手元で規格化した後の"予測値(y)"で、それぞれクロスエントロピーを計算しました。
上記2番が正しいとすると、規格化前後のxとyで出力結果が変わるのは不思議ですし、
また、実際のクロスエントロピーは、この場合、-1*ln(0.5)~0.7となると思います。
私の使い方および理解で、誤っている点をご指摘いただきたいです。
使用したバージョン
Python: 3.8
Pytorch: 1.7.1
回答1件
あなたの回答
tips
プレビュー