pytorch方法测试——损失函数(BCELoss)

本文介绍了如何在PyTorch中使用BCELoss进行损失计算,包括基本用法和带权重的测试。通过示例代码展示了reduce参数对平均损失的影响,并给出了BCELoss的计算公式。
部署运行你感兴趣的模型镜像

测试代码:

import torch
import torch.nn as nn
import math

m = nn.Sigmoid()

loss = nn.BCELoss(size_average=False, reduce=False)
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
lossinput = m(input)
output = loss(lossinput, target)

print("输入值:")
print(lossinput)
print("输出的目标值:")
print(target)
print("计算loss的结果:")
print(output)
print("自己计算的第一个loss")
print(-(target[0]*math.log(lossinput[0])+(1-target[0])*math.log(1-lossinput[0])))


输出为:
输入值:
tensor([ 0.6682,  0.6042,  0.7042])
输出的目标值:
tensor([ 0.,  1.,  1.])
计算loss的结果:
tensor([ 1.1032,  0.5038,  0.3506])
自己计算的第一个loss:

tensor(1.1032)

带权重的测试(输入的weight必须和target值的数目一致,默认为none):

测试代码:

import torch
import torch.nn as nn
import math

m = nn.Sigmoid()
weights=torch.randn(3)

loss = nn.BCELoss(weight=weights,size_average=False, reduce=False)
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
lossinput = m(input)
output = loss(lossinput, target)

print("输入值:")
print(lossinput)
print("输出的目标值:")
print(target)
print("权重值")
print(weights)
print("计算loss的结果:")
print(output)
print("自己计算的第一个loss")
print(-weights[0]*(target[0]*math.log(lossinput[0])+(1-target[0])*math.log(1-lossinput[0])))
输出为:
输入值:
tensor([ 0.6637,  0.1873,  0.8684])
输出的目标值:
tensor([ 1.,  1.,  1.])
权重值
tensor([ 1.9695,  0.2139, -0.4034])
计算loss的结果:
tensor([ 0.8073,  0.3584, -0.0569])
自己计算的第一个loss:
tensor(0.8073)
size_average  
reduce 作用测试(默认都为True):

     官网上给出说明为:如果reduce为True,则


    如果reduceFalse,则size_average 不起作用。

测试代码:

import torch
import torch.nn as nn
import math

m = nn.Sigmoid()
weights=torch.randn(3)

loss = nn.BCELoss(weight=weights,size_average=False, reduce=True)
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
lossinput = m(input)
output = loss(lossinput, target)

print("输入值:")
print(lossinput)
print("输出的目标值:")
print(target)
print("权重值")
print(weights)
print("计算loss的结果:")
print(output)
print("自己计算的第一个loss")
perres = [0,0,0]
res = 0
for i in range(3):
    perres[i] = -weights[i]*(target[i]*math.log(lossinput[i])+(1-target[i])*math.log(1-lossinput[i]))
    res += perres[i]
print(res)
输出为:
输入值:
tensor([ 0.2902,  0.6208,  0.2917])
输出的目标值:
tensor([ 1.,  0.,  0.])
权重值
tensor([ 0.6165, -1.3114,  0.4537])
计算loss的结果:
tensor(-0.3525)
自己计算的第一个loss:
tensor(-0.3525)

import torch
import torch.nn as nn
import math

m = nn.Sigmoid()
weights=torch.randn(3)

loss = nn.BCELoss(weight=weights,size_average=True, reduce=True)
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
lossinput = m(input)
output = loss(lossinput, target)

print("输入值:")
print(lossinput)
print("输出的目标值:")
print(target)
print("权重值")
print(weights)
print("计算loss的结果:")
print(output)
print("自己计算的第一个loss")
perres = [0,0,0]
res = 0
for i in range(3):
    perres[i] = -weights[i]*(target[i]*math.log(lossinput[i])+(1-target[i])*math.log(1-lossinput[i]))
    res += perres[i]
print(res/3)
输入值:
tensor([ 0.5891,  0.6687,  0.2319])
输出的目标值:
tensor([ 1.,  1.,  1.])
权重值
tensor([-0.1225,  1.8304,  0.4226])
计算loss的结果:
tensor(0.4298)
自己计算的第一个loss:

tensor(0.4298)

结论:

BCELoss的计算公式为:



您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 如何根据任务类型选择适当的损失函数PyTorch 中,`torch.nn` 模块提供了多种损失函数来适应不同的机器学习任务需求。以下是针对不同类型的任务推荐使用的常见损失函数及其特点: #### 1. **回归任务** 对于回归任务,目标是最小化模型预测值与实际标签之间的差异。两种最常用的损失函数是均方误差 (MSE) 和绝对误差 (L1Loss)[^2]。 - **均方误差 (Mean Squared Error)** `torch.nn.MSELoss()` 是一种广泛应用于回归问题的损失函数。它通过计算预测值和真实值之间差值平方的平均值得到最终的损失值。由于其对较大误差给予更高的权重,因此适合于希望减少极端偏差的情况。 ```python import torch from torch import nn mse_loss = nn.MSELoss() input_tensor = torch.randn(3, requires_grad=True) target_tensor = torch.randn(3) output = mse_loss(input_tensor, target_tensor) ``` - **L1 范数损失 (L1 Loss)** 使用 `torch.nn.L1Loss()` 可以获得更鲁棒的结果,因为它仅考虑预测值与真实值间绝对差距而不放大异常点的影响[^3]。 #### 2. **分类任务** 当处理多类别的分类问题时,通常会采用交叉熵作为评价指标之一。具体来说可以选用如下几种形式: - **二元分类** 如果只有两个可能输出,则可以选择 BCEWithLogitsLoss 或者 BinaryCrossEntropy 来代替传统的 softmax 加 log likelihood 的组合方式简化操作流程并提高数值稳定性[^4]。 - **多类别单标签分类** 对于每个输入只属于某一特定种类的情形下适用 CrossEntropyLoss 。该方法内部集成了 LogSoftmax 和 NLLLoss 功能,在训练过程中能够有效降低过拟合风险同时提升收敛速度。 ```python cross_entropy_loss = nn.CrossEntropyLoss(ignore_index=-100, reduction='mean') inputs = torch.randn((5, 3), dtype=torch.float32) # batch_size * num_classes targets = torch.tensor([1, 0, 2, 1, 2], dtype=torch.int64) # class indices per sample loss_value = cross_entropy_loss(inputs, targets) ``` - **多类别多标签分类** 当面对多个独立但又相互关联的目标变量时,BCELoss 将是一个不错的选择;如果这些目标还存在概率分布特性的话则建议改用 KLDivLoss 进行建模分析。 #### 总结 每种类型的神经网络应用都有相应的最佳实践指导原则用于挑选匹配度最高的成本评估工具——即所谓的“损失函数”。上述列举了一些典型场景下的候选方案供开发者参考采纳。然而值得注意的是,并不存在适用于所有情况的理想选项,所以还需要依据实际情况灵活调整策略直至找到最优解为止。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值