
1 x = np.array([[1, 2,3,4,5],#共三3樣本,有5個類別
2 [1, 2,3,4,5],
3 [1, 2,3,4,5]]).astype(np.float32)
4 y = np.array([1, 1, 0])#這3個樣本的標簽分別是1,1,0即兩個是第2類,一個是第1類。多類別這種,並不是one-hot編碼,因此后面的損失計算是直接用對應標簽索引到樣本對應的正確置信度,直接求和得到batch的loss
5 x = torch.from_numpy(x)
6 y = torch.from_numpy(y).long()
7
8 soft_out = F.softmax(x,dim=1)#給每個樣本的pred向量做指數歸一化---softmax
9 log_soft_out = torch.log(soft_out)#將上面得到的歸一化的向量再point-wise取對數
10 loss = F.nll_loss(log_soft_out, y)#將歸一化且取對數后的張量根據標簽求和,實際就是計算loss的過程
"""
這里的loss計算式根據batch_size歸一化后的,即是一個batch的平均單樣本的損失,迭代一次模型對一個樣本平均損失。
在多個epoch訓練時,還會求每個epoch內的總損失,用於衡量epoch之間模型性能的提升。
"""
11 print(soft_out)
12 print(log_soft_out)
13 print(loss)
14
15 loss = F.cross_entropy(x, y)
16 print(loss)
#輸出:
softmax:
tensor([[0.0117, 0.0317, 0.0861, 0.2341, 0.6364],
[0.0117, 0.0317, 0.0861, 0.2341, 0.6364],
[0.0117, 0.0317, 0.0861, 0.2341, 0.6364]])
tensor([[-4.4519, -3.4519, -2.4519, -1.4519, -0.4519],
[-4.4519, -3.4519, -2.4519, -1.4519, -0.4519],
[-4.4519, -3.4519, -2.4519, -1.4519, -0.4519]])
tensor(3.7852)
tensor(3.7852)