import torch import torch.nn.functional as F x1= torch.Tensor( [ [1,2,3,4],[1,3,4,5],[3,4,5,6]]) y11= F.softmax(x, dim = 0) #對每一列進行softmax y12 = F.softmax(x,dim =1) #對每一行進行softmax x2 = torch.Tensor([1,2,3,4]) y2 = F.softmax(x2,dim=0)
tf.nn.softmax中dim默認為-1,即,tf.nn.softmax會以最后一個維度作為一維向量計算softmax
softmax是什么?
函數 Softmax(x) 也是一個 non-linearity, 但它的特殊之處在於它通常是網絡中一次操作. 這是因為它接受了一個實數向量並返回一個概率分布.其定義如下. 定義 x 是一個實數的向量(正數或負數都無所謂, 沒有限制). 然后, 第i個 Softmax(x) 的組成是
輸出是一個概率分布: 每個元素都是非負的, 並且所有元素的總和都是1.
2、log_softmax
在softmax的結果上再做多一次log運算
雖然在數學上等價於log(softmax(x)),但做這兩個單獨操作速度較慢,數值上也不穩定。這個函數使用另一種公式來正確計算輸出和梯度。
import torch import torch.autograd as autograd import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import numpy as np data=autograd.Variable(torch.FloatTensor([1.0,2.0,3.0])) log_softmax=F.log_softmax(data,dim=0) print(log_softmax) softmax=F.softmax(data,dim=0) print(softmax) np_softmax=softmax.data.numpy() log_np_softmax=np.log(np_softmax) print(log_np_softmax)
3、nn.CrossEntropyLoss() 與 NLLLoss()
NLLLoss 的 輸入 是一個對數概率向量和一個目標標簽. 它不會為我們計算對數概率. 適合網絡的最后一層是log_softmax. 損失函數 nn.CrossEntropyLoss() 與 NLLLoss() 相同, 唯一的不同是它為我們去做 softmax.
4、log似然代價函數