回答編集履歴

1

書式の修正

2022/04/17 14:18

投稿

jbpb0
jbpb0

スコア7653

test CHANGED
@@ -1,73 +1,37 @@
1
1
  > 予測値が [[0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
2
-
3
- 教師データのインデックスが [1, 2]の場合、誤差は0になる
2
+ > 教師データのインデックスが [1, 2]の場合、誤差は0になる
4
-
5
-
6
3
 
7
4
  [PytorchのCrossEntropyLossの解説](https://qiita.com/ground0state/items/8933f9ef54d6cd005a69)
8
-
9
5
  の「PyTorchのCrossEntropyLoss」に書かれてるように、「torch.nn.CrossEntropyLoss()」は予測値をソフトマックス処理するので、そうはなりません
10
6
 
11
-
12
-
13
7
  > 出力結果
14
-
15
- tensor(0.5514)
8
+ > tensor(0.5514)
16
-
17
-
18
9
 
19
10
  ```python
20
-
21
11
  import numpy as np
22
-
23
12
  y = [0, 1, 0]
24
-
25
13
  print(-1 * y[1] + np.log(np.exp(y).sum()))
26
-
27
14
  ```
28
-
29
15
  を計算したら「0.5514」になります
30
16
 
31
-
32
-
33
17
   .
34
-
35
18
  > 確率分布での学習の場合でも。 -t*log(y) でよいのでしょうか?
36
19
 
37
-
38
-
39
20
  「torch.nn.CrossEntropyLoss()」での計算のやり方に合わせたら、という意味なら、
40
-
41
21
  ```python
42
-
43
22
  y = [[0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
44
-
45
23
  t = [[0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
46
-
47
24
  ```
48
-
49
25
  の場合の計算結果が「0.5514」になるはずですが、質問に掲載のコードではそうなりません
50
-
51
26
  理由は二つあります
52
-
53
27
  ・上で指摘したように「torch.nn.CrossEntropyLoss()」は予測値をソフトマックス処理する
54
-
55
28
  ・一つのサンプルでの複数の結果(この例では三つ)は合計する
56
29
 
57
-
58
-
59
30
  以上を踏まえると、こんな感じになると思います
60
-
61
31
  ```python
62
-
63
32
  (-t * torch.log(y)).mean()
64
-
65
33
  ```
66
-
67
34
  ↓ 変更
68
-
69
35
  ```python
70
-
71
36
  torch.mean(torch.sum(-t * torch.t(torch.t(y) - torch.log(torch.sum(torch.exp(y), dim=1))), dim=1))
72
-
73
37
  ```