BCELoss、crossentropyLoss、NLLLoss的使用(pytorch)
文章目录
- BCELoss
- 参考文档
- 理解
- demo
- 应用
- crossentropyLoss、NLLLoss
- 参考文档
- crossEntropyLoss
- NLLLoss
BCELoss
用于二分类问题,计算loss值,与sigmoid函数一起使用(就是逻辑回归的那个公式,线性外面套一个sigmoid函数)
参考文档
pytorch-BCELoss
理解
看它的参数说明大概能知道:
参数
- weight(张量*,*可选)–对每个批次元素的损失赋予的手动重新缩放重量。如果给定,则必须是大小为nbatch的张量。
- size_average(bool*,*可选)–已弃用(请参阅
reduction
)。默认情况下,损失是批次中每个损失元素的平均数。请注意,对于某些损失,每个样本有多个元素。如果该字段size_average
设置为False
,则每个小批量的损失总和。何时reduce
被忽略False
。默认:True
- reduce(bool*,*可选)–不推荐使用(请参阅
reduction
)。默认情况下,根据,对每个小批量的损失进行平均或求和size_average
。当reduce
为is时False
,则返回每批元素的损失,然后忽略size_average
。默认:True
- reduction(字符串*,*可选)–指定要应用于输出的减少量:
'none'
|'mean'
|'sum'
。'none'
:不应用缩减,'mean'
:输出的总和除以输出中元素的数量,'sum'
:输出的总和。注意:size_average
和reduce
正在弃用的过程中,同时,指定这两个args中的任何一个将覆盖reduction
。默认:'mean'
**理解:**我们一般只用reduction这个参数,有两个选择:
'mean'
:输出的总和 除以 输出中元素的数量 【以batch为单位进行计算】'sum'
:输出的总和【以样本个体为单位进行计算】
demo
import torch
import torch.nn as nnepoch = 4
batch_size = 3m = nn.Sigmoid()
loss = nn.BCELoss(reduction="mean")
loss1 = nn.BCELoss(reduction="sum")input = torch.randn(epoch, batch_size, requires_grad=True)
target = torch.empty(epoch, batch_size, ).random_(2)print(input)
print(target)"""
the way of mean
"""
i = 0
total_loss = 0
while i < epoch:out = m(input[i])output = loss(out, target[i])output.backward()total_loss += output.item()# print(f"input[{i}]:", input[i])# print(f"target[{i}]:", target[i])print("output:", output)i += 1
print("total_loss:", total_loss)
print("loss:", total_loss / epoch) # 这里除的是epoch,也可以是你的迭代次数
"""
the way of sum
"""
i = 0
total_loss = 0
while i < epoch:out = m(input[i])output1 = loss1(out, target[i])output1.backward()total_loss += output1.item()# print(f"input[{i}]:", input[i])# print(f"target[{i}]:", target[i])print("output1:", output1)i += 1
print("total_loss:", total_loss)
print("loss:", total_loss / (epoch * batch_size)) # 这里除以了样本总数# 输出结果:tensor([[ 0.5393, 0.8473, -0.3530],[-0.6885, 0.5141, -0.0987],[ 0.4177, 0.2554, -1.7657],[-0.5285, 0.9502, 0.1078]], requires_grad=True)
tensor([[0., 1., 0.],[0., 0., 1.],[0., 1., 1.],[0., 1., 0.]])
output: tensor(0.6292, grad_fn=<BinaryCrossEntropyBackward>)
output: tensor(0.7112, grad_fn=<BinaryCrossEntropyBackward>)
output: tensor(1.1403, grad_fn=<BinaryCrossEntropyBackward>)
output: tensor(0.5129, grad_fn=<BinaryCrossEntropyBackward>)
total_loss: 2.993612587451935
loss: 0.7484031468629837
output1: tensor(1.8875, grad_fn=<BinaryCrossEntropyBackward>)
output1: tensor(2.1336, grad_fn=<BinaryCrossEntropyBackward>)
output1: tensor(3.4209, grad_fn=<BinaryCrossEntropyBackward>)
output1: tensor(1.5388, grad_fn=<BinaryCrossEntropyBackward>)
total_loss: 8.98083770275116
loss: 0.7484031418959299
应用
我们需要查看其loss,一般在一个epoch中,要么每个batch输出一次,要么隔n个batch输出一次,因此,
如果使用mean
(默认为mean
),表示已经做了均值处理,只需要total_loss除以n(迭代次数)就可以;
如果使用sum
,表示没有除以该batch中的样本数,则需要total_loss除以(n*batch_size)【最后一下如果不能整除,自然也就不会进行这一步的total_loss转loss计算】
代码如下:
total_loss += loss.item()if i % 3 == 0:# print("len(trainLoader):", len(trainLoader))# print("len(x)", len(x))print(f'[{time_since(start)}] Epoch {epoch} ', end='')print(f'[{i * len(x[0])}/{len(trainSet)}] ', end='')print(f'loss = {total_loss / (i * len(x[0]))} ', end='')print(f'loss = {total_loss / (i)} ', end='')print(f'[{total_loss} / {(i )}]')
crossentropyLoss、NLLLoss
CrossEntropyLoss,它就是计算交叉熵损失函数
NLLLoss(Negative Log Likelihood Loss)是计算负log似然损失
参考文档
transformer 代码解读(pytorch)
crossEntropyLoss
import torch
import torch.nn as nnbatch_size = 3criterion = nn.CrossEntropyLoss()y_pred = torch.randn(batch_size, 5)
y = torch.empty(batch_size, dtype=torch.long).random_(5)
print(y_pred)# soft = nn.Softmax(dim=1) # 这里用的softmax
# y_pred = soft(y_pred) # 但是crossEntropy会自动添加一个Softmax,所以不用自己加
# print(y_pred)print(y)loss = criterion(y_pred, y)
print(loss)"""
tensor([[-0.9051, -0.4489, -0.5590, -0.1007, 1.1984],[-0.0395, 0.4527, 0.0423, -0.1724, 0.4925],[ 0.4064, 1.5080, 1.1995, 0.1651, 0.2300]])
tensor([[0.0693, 0.1094, 0.0980, 0.1550, 0.5682],[0.1588, 0.2597, 0.1723, 0.1390, 0.2703],[0.1275, 0.3836, 0.2818, 0.1002, 0.1069]])
tensor([2, 1, 3])
tensor(1.6658)
"""
直观解析:这里是5分类
- y_pred:生成一个Batch_size x 5(classify number)的矩阵,每行是每个分类的概率
- y:直接是分类的代号
- crossEntropy会自动添加一个Softmax,所以不用自己加
NLLLoss
import torch
import torch.nn as nnbatch_size = 4m = nn.LogSoftmax(dim=1)
criterion = nn.NLLLoss()
y_pred = torch.randn(batch_size, 5)
print(y_pred)
y = torch.empty(batch_size, dtype=torch.long).random_(5)
y_pred = m(y_pred) # 注意:这里用的是LogSoftmax 负log似然
loss = criterion(y_pred, y)print(y_pred)
print(y)
print(loss)
"""
tensor([[-0.0823, -1.9247, -0.0603, 0.1532, -1.3969],[ 0.4716, 1.2842, -0.9967, 1.2505, -0.5792],[ 0.1119, 1.1941, -0.9118, 2.0806, -0.1346],[ 0.2026, 0.6298, -0.2217, 0.7229, -0.1681]])
tensor([[-1.3123, -3.1547, -1.2903, -1.0768, -2.6269],[-1.7939, -0.9813, -3.2621, -1.0150, -2.8447],[-2.5058, -1.4236, -3.5295, -0.5371, -2.7523],[-1.7156, -1.2884, -2.1399, -1.1953, -2.0863]])
tensor([3, 1, 1, 3])
tensor(1.1692)
"""
NLLLoss这里,y_pred需要经过LogSoftmax才行
BCELoss、crossentropyLoss、NLLLoss的使用(pytorch)相关推荐
- 利用pytorch来深入理解CELoss、BCELoss和NLLLoss之间的关系
利用pytorch来深入理解CELoss.BCELoss和NLLLoss之间的关系 损失函数为为计算预测值与真实值之间差异的函数,损失函数越小,预测值与真实值间的差异越小,证明网络效果越好.对于神经网 ...
- (详细全面)softmax和log_softmax的联系和区别,NLLLOSS和CrossEntropyLoss的联系和区别
文章目录 1.softmax 2.log_softmax 3.softmax和log_softmax 4.NLLLOSS和CrossEntropyLoss 1.softmax 作用:实现了将n维向量变 ...
- NLLLOSS CrossEntropyLoss
今天在看论文的时候,看到了NLLLOSS函数,嗯?这是个啥,然后就查了查,原来是跟CrossEntropyLoss一样的,这里整理一下,方便以后查阅. NLLLOSS & CrossEntro ...
- MachineLearning(1)-激活函数sigmoid、损失函数MSE、CrossEntropyLoss
损失函数 1.激活函数 2.损失函数 2.1均方误差损失函数 2.2交叉熵损失函数 2.3 NLLLoss() 2.4 BCELoss() 1.激活函数 全连接网络又叫多层感知器,多层感知器的基本单元 ...
- 【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)
从有代码的课程开始讨论 [Pytorch深度学习实践]B站up刘二大人之LinearModel -代码理解与实现(1/9) [Pytorch深度学习实践]B站up刘二大人之 Gradient Desc ...
- 【刘二大人 - PyTorch深度学习实践】学习随手记(一)
目录 1. Overview 1.Human Intelligence 2.Machine Learning 3.How to develop learning system? 4.Tradition ...
- PyTorch:tensor、torch.nn、autograd、loss等神经网络学习手册(持续更新)
PyTorch1:tensor2.torch.nn.autograd.loss等神经网络学习手册(持续更新) 链接:画图.读写图片 文章目录 一.tensor 二.完整训练过程:数据.模型.可学习参数 ...
- pytorch与keras_Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者
pytorch与keras by Patryk Miziuła 通过PatrykMiziuła Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者 (Keras vs PyTorch ...
- 解决pytorch半精度amp训练nan问题
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 可可哒@知乎(已授权) 来源 | https://zhua ...
最新文章
- MySql忘记密码了咋办
- 8月第2周中国五大顶级域名增4.1万 美国减6.8万
- python encoding报错_菜鸟世界 -docker 环境下解决python 的 UnicodeEncodeError 错误
- Sql Server 分区演练
- 树莓派4b上部署yolov3和v3-tiny记录带截图
- 【转】Win32 Slider Control的用法
- 09-OSPF故障排查总结
- 2017年单多晶市场竞争核心分析
- android byte转string_唠点儿你不一定知道的Android小知识
- linux查看文件写进程,Linux下如何知道文件被那个进程写
- 密码学基础部分大归纳(密码学发展史,对称、非对称密码算法,数字签名、数字证书)
- Vue项目:IE11中地址栏直接改变路由页面不跳转bug
- 倾向值匹配法的概述和应用+倾向值分析:统计方法与应用
- Springboot 整合百度地图 API
- 如何获取美团外卖推广链接
- 宣传文本html,优秀的宣传语(精选50句)
- 《红警2》防空步兵都说了些什么?
- 联通光猫TEWA-800E设置桥接模式
- python 列表根据汉字拼音进行排序 / 查询结果集(列表嵌套字典)根据特定key字段拼音进行整体排序
- 怎么运行python外星人入侵_Python入门项目:外星人入侵
热门文章
- 字节序(小端字节序与大端字节序)
- 微星linux显卡驱动下载,MSI 显卡 驱动程序下载——更新 MSI 软件
- win10 操作自带防病毒软件Defender
- pandas的get_dummies
- 我的2016,喜忧参半
- 安卓开发中如何获取手机返回键的监听处理
- ai照片放大python源码_Bigjpg - AI人工智能图片无损放大 - 使用人工智能深度卷积神经网络(CNN)无损放大图片...
- 福师计算机应用基础浏览器用户最近刚刚,奥鹏福师2020年《计算机应用基础》期末 试卷A卷.pdf...
- 基于PPT的三维光路结构示意图绘制实例演示
- 连发数枪,海尔离“世界中心”仅一步之遥