函数具体介绍参考torch.nn.functional.cross_entropy使用
交叉熵的计算参考交叉熵损失(Cross Entropy Loss)计算过程
code
z = torch.tensor([[1,2],[1,4]],dtype=float) # input tensor
y = torch.tensor([0,1])
print(z)
print(y)
loss1 = torch.nn.functional.cross_entropy(z,y)
print(loss1)
output
tensor([[1., 2.],
[1., 4.]], dtype=torch.float64)
tensor([0, 1])
tensor(0.6809, dtype=torch.float64)
计算过程
− [ l n ( e e + e 2 ) + l n ( e 4 e + e 4 ) ] / 2 = 0.6809 -[ln(\frac{e}{e+e^2})+ln(\frac{e^4}{e+e^4})]/2 = 0.6809 −[ln(e+e2e)+ln(e+e4e4)]/2=0.6809
默认做二分类,将模型输出z和理想输出x的每个元素当作是一个二分类的结果,然后计算交叉熵(在该函数中,z的每个元素的范围是[0,1],y没有限制,但理论上y应该在[0,1]之间。z和y可以是任意维数的,但必须形状相同。)
code
z = torch.ones(3,2)*0.8 # input tensor
y = torch.ones(3,2)*0.4
print(z)
print(y)
loss2 = torch.nn.functional.binary_cross_entropy(z, y)
print(loss2)
output
tensor([[0.8000, 0.8000],
[0.8000, 0.8000],
[0.8000, 0.8000]])
tensor([[0.4000, 0.4000],
[0.4000, 0.4000],
[0.4000, 0.4000]])
tensor(1.0549)
计算过程
− ( 0.4 ∗ l n ( 0.8 ) + 0.6 ∗ l n ( 1 − 0.8 ) ) ∗ 2 ∗ 3 / ( 2 ∗ 3 ) = 1.0549 -(0.4*ln(0.8)+0.6*ln(1-0.8))*2*3/(2*3)=1.0549 −(0.4∗ln(0.8)+0.6∗ln(1−0.8))∗2∗3/(2∗3)=1.0549
默认做二分类,将模型输出z做sigmoid后和理想输出x的每个元素当作是一个二分类的结果,然后计算交叉熵(在该函数中,由于z的每个元素是做完sigmoid后再做交叉熵,因此没有值的范围限制,y也没有,但理论上y应该在[0,1]之间。z和y可以是任意维数的,但必须形状相同。)
code
z = torch.ones(3,2)*0.8 # input tensor
y = torch.ones(3,2)*0.4
print(z)
print(y)
loss3 = torch.nn.functional.binary_cross_entropy_with_logits(z, y,reduction='sum')
print(loss3)
output
tensor([[0.8000, 0.8000],
[0.8000, 0.8000],
[0.8000, 0.8000]])
tensor([[0.4000, 0.4000],
[0.4000, 0.4000],
[0.4000, 0.4000]])
tensor(5.1066)
计算过程
− ( 0.4 ∗ l n ( s i g m o i d ( 0.8 ) ) + 0.6 ∗ l n ( 1 − s i g m o i d ( 0.8 ) ) ) ∗ 2 ∗ 3 = 5.1066 -(0.4*ln(sigmoid(0.8))+0.6*ln(1-sigmoid(0.8)))*2*3 = 5.1066 −(0.4∗ln(sigmoid(0.8))+0.6∗ln(1−sigmoid(0.8)))∗2∗3=5.1066