回答編集履歴
1
書式の修正
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
|
```
|