Excel2016打印預覽表格的教程是什么(excel2016怎么看打印預覽)">Excel2016打印預覽表格的教程是什么(excel2016怎么看打印預覽)
1275
2025-04-02
學習總結
(1)本次圖像多分類中的最后一層網絡不需要加激活,因為在最后的torch.nn.CrossEntropyLoss已經包括了激活函數softmax。這里注意softmax的dim參數問題,如下面這個是(3,2)的一個變量,dim = 0 實際上是對第一維的3個變量進行對數化,而dim = 1是對第二維進行操作。
a = torch.Tensor([[1,1],[2,2],[3,3]]) a.size() Out[89]: torch.Size([3, 2]) b = torch.nn.Softmax(dim=0)(a) b Out[91]: tensor([[0.0900, 0.0900], [0.2447, 0.2447], [0.6652, 0.6652]]) b = torch.nn.Softmax(dim=1)(a) b Out[93]: tensor([[0.5000, 0.5000], [0.5000, 0.5000], [0.5000, 0.5000]])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(2)本次pytorch在讀圖像時,將PIL圖像(現在都用Pillow了)轉為Tensor,神經網絡一般希望input比較小,最好在-1到1之間,最好符合正態分布。三種主流圖像處理庫的比較:
文章目錄
學習總結
一、多分類問題
二、分布和API
三、交叉熵代碼實踐
四、代碼實踐
Reference
一、多分類問題
注意驗證/測試的流程基本與訓練過程大體一致,不同點在于:
需要預先設置torch.no_grad,以及將model調至eval模式
不需要將優化器的梯度置零
不需要將loss反向回傳到網絡
不需要更新optimizer
二、分布和API
法一:把每一個類別的確定看作是一個二分類問題。利用交叉熵。
為了解決抑制問題,就不要輸出每個類別的概率,且滿足每個概率大于0和概率之和為1的條件。(二分類我們輸出的是分布,求出一個然后用1減去即可,多分類雖然也可以這樣,但是最后1減去其他所有概率的計算,還需要構建計算圖有點麻煩)。
之前二分類中的交叉熵的兩項中只能有一項為0.
(1)NLLLoss函數計算如下紅色框:
(2)可以直接使用torch.nn.CrossEntropyLoss(將下列紅框計算納入)。注意右側是由類別生成獨熱編碼向量。
交叉熵,最后一層網絡不需要激活,因為在最后的Torch.nn.CrossEntropyLoss已經包括了激活函數softmax。
(1)交叉熵手寫版本
import numpy as np y = np.array([1, 0, 0]) z = np.array([0.2, 0.1, -0.1]) y_predict = np.exp(z) / np.exp(z).sum() loss = (- y * np.log(y_predict)).sum() print(loss) # 0.9729189131256584
1
2
3
4
5
6
7
(2)交叉熵pytorch栗子
交叉熵損失和NLL損失的區別(讀文檔):
https://pytorch.org/doc s/stable/nn.html#crossentropyloss
https://pytorch.org/docs/stable/nn.html#nllloss
搞懂為啥:CrossEntropyLoss <==> LogSoftmax + NLLLoss
三、交叉熵代碼實踐
前面是sigmoid,后面是softmax(使得概率大于0,概率值和為1)。 兩點注意。
# -*- coding: utf-8 -*- """ Created on Mon Oct 18 22:48:55 2021 @author: 86493 """ # 用CrossEntropyLoss計算交叉熵 import torch # 注意1:設定的第0個分類 y = torch.LongTensor([0]) z = torch.Tensor([[0.2, 0.1, -0.1]]) # 注意2:CrossEntropyLoss criterion = torch.nn.CrossEntropyLoss() loss = criterion(z, y) print(loss.item()) # 0.9729189276695251 # 舉栗子:mini-batch:batch_size = 3 import torch criterion = torch.nn.CrossEntropyLoss() # 三個樣本 Y = torch.LongTensor([2, 0, 1]) # 第一個樣本比較吻合,loss會較小 Y_pred1 = torch.Tensor([[0.1, 0.2, 0.9], # 2 該層為原始的線性層的輸出 [1.1, 0.1, 0.2], # 0 [0.2, 2.1, 0.1]])# 1 # 第二個樣本差的比較遠,loss較大 Y_pred2 = torch.Tensor([[0.8, 0.2, 0.3], # 2 [0.2, 0.3, 0.5], # 0 [0.2, 0.2, 0.5]])# 1 l1 = criterion(Y_pred1, Y) l2 = criterion(Y_pred2, Y) print("Batch Loss1 = ", l1.data, "\nBatch Loss2 =", l2.data) # Batch Loss1 = tensor(0.4966) # Batch Loss2 = tensor(1.2389)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
代碼打印的loss值:
[1, 300] loss: 2.216 [1, 600] loss: 0.872 [1, 900] loss: 0.423 Accuracy on test set: 89 % [2, 300] loss: 0.333 [2, 600] loss: 0.272 [2, 900] loss: 0.232 Accuracy on test set: 93 % [3, 300] loss: 0.189 [3, 600] loss: 0.176 [3, 900] loss: 0.160 Accuracy on test set: 95 % [4, 300] loss: 0.135 [4, 600] loss: 0.127 [4, 900] loss: 0.121 Accuracy on test set: 95 % [5, 300] loss: 0.104 [5, 600] loss: 0.096 [5, 900] loss: 0.097 Accuracy on test set: 96 % [6, 300] loss: 0.080 [6, 600] loss: 0.071 [6, 900] loss: 0.083 Accuracy on test set: 97 % [7, 300] loss: 0.062 [7, 600] loss: 0.062 [7, 900] loss: 0.062 Accuracy on test set: 97 % [8, 300] loss: 0.050 [8, 600] loss: 0.052 [8, 900] loss: 0.053 Accuracy on test set: 97 % [9, 300] loss: 0.034 [9, 600] loss: 0.045 [9, 900] loss: 0.043 Accuracy on test set: 97 % [10, 300] loss: 0.032 [10, 600] loss: 0.032 [10, 900] loss: 0.036 Accuracy on test set: 97 %
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Reference
(1)pytorch中with torch.no_grad()
(2)https://www.bilibili.com/video/BV1Y7411d7Ys?p=9
(3)pytorch學習(五)—圖像的加載/讀取方式
(4)解決Python報錯:RuntimeError: Can’t call numpy() on Variable that requires grad. Use var.detach().numpy()
pytorch 網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。