赞
踩
首先是F.binary_cross_entropy_with_logits(input,target)的手动计算和掉包计算实现。input的大小和target的大小要保证一样。
直接上代码:
- import torch.nn as nn
- import torch
- from math import log
- import torch.nn.functional as F
-
- input=torch.tensor([[0.5474, 0.2197],[0.1033, 1.3856]])
- target=torch.tensor([[0., 1.],[1., 0.]])
- Sigmoid_input=nn.Sigmoid()(input)
- print('Sigmoid_input:{}'.format(Sigmoid_input))
- print('手动计算:{}'.format(torch.mean(-torch.log(Sigmoid_input)*target-torch.log(1-Sigmoid_input)*(1-target))))
- print('掉包计算:{}'.format(F.binary_cross_entropy_with_logits(input,target)))
运行结果:
- Sigmoid_input:tensor([[0.6335, 0.5547],
- [0.5258, 0.7999]])
- 手动计算:0.9612189531326294
- 掉包计算:0.9612190127372742
发现手动计算和掉包计算的结果一样!
F.cross_entropy(input,target)的手动计算和掉包计算实现。
注意target比input少一维。例如input是二维的tensor,尺寸是(batch_size,label_num),即batch的长度是batch_size,多分类任务的标签数是label_num,则target是一维的tensor,且类型为LongTensor,每个值代表对应样本真实标签的索引。
直接上代码:
- input=torch.tensor([[0.5474, 0.2197],[0.1033, 1.3856]])
- target=torch.LongTensor([0, 1])
- Softmax_input=nn.Softmax(dim=1)(input)
- print('Softmax_input:{}'.format(Softmax_input))
- print('手动计算:{}'.format(((-log(0.5812))+(-log(0.7828)))/2))
- print('掉包计算:{}'.format(F.cross_entropy(input,target)))
运行结果:
- Softmax_input:tensor([[0.5812, 0.4188],
- [0.2172, 0.7828]])
- 手动计算:0.39376919537311245
- 掉包计算:0.3937433063983917
手动计算和掉包计算的结果一致!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。