10 - 自动微分以及autograd的使用

本文介绍了PyTorch中binary_cross_entropy_with_logits与binary_cross_entropy的使用方法,重点讲解了两者在计算梯度和输入处理上的区别,以及在实际神经网络训练中的应用实例。
摘要由CSDN通过智能技术生成

1.官网介绍

autograd-pytorch

1.1 说明

当训练神经网络的时候,运用最多的算法是反向传播算法back propagation,在反向传播过程中,模型的权重weight会根据损失函数相对于给定参数的梯度来调整自身的权重weight
为了计算这些梯度,Pytorch提供了一个内置的微分引擎系统(torch.autograd),它支持根据任意计算图来计算梯度
考虑最简单的单层神经网络,对于输入X,参数w,参数b和损失函数loss_fucntion

1.2 binary_cross_entropy_with_logits

  • 测量目标和输入对数之间的二元交叉熵的函数。
torch.nn.functional.binary_cross_entropy_with_logits(input, target, weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)
  • 注意:有一个(类)损失函数名字中带了with_logits,而这里的logits指的是该函数已经内部自带了计算logit的操作,而无序在传入给这个loss函数之前手动使用sigmoid/softmax将之前网络的输入映射到[0,1]之间
import torch
from torch import nn
from torch.nn import functional as F

x = torch.ones(5)
y = torch.zeros(3)
w = torch.ones(5, 3, requires_grad=True)
b = torch.zeros(3, requires_grad=True)
z = torch.matmul(x, w) + b
# 使用binary_cross_entropy_with_logits计算交叉熵,这里的输入不需要用sigmoid函数再输入
loss_logits = F.binary_cross_entropy_with_logits(z, y)
loss_logits.backward()
print(f"w.grad={w.grad}")
print(f"b={b}")
print(f"loss_logits={loss_logits}")

input = torch.randn((3, 2), requires_grad=True)
target = torch.randn((3, 2), requires_grad=False)

# 使用bianary_cross_entropy,那么输入需要使用F.sigmoid来处理输入值
loss_cross_entropy = F.binary_cross_entropy(F.sigmoid(input), target)
loss_cross_entropy.backward()
print(f"input={input}")
print(f"target={target}")
print(f"loss_cross_entropy={loss_cross_entropy}")
  • 结果:
w.grad=tensor([[0.3311, 0.3311, 0.3311],
        [0.3311, 0.3311, 0.3311],
        [0.3311, 0.3311, 0.3311],
        [0.3311, 0.3311, 0.3311],
        [0.3311, 0.3311, 0.3311]])
b=tensor([0., 0., 0.], requires_grad=True)
loss_logits=5.006715297698975
input=tensor([[ 0.9871, -1.2020],
        [ 0.5035,  0.5934],
        [-0.4187, -1.1187]], requires_grad=True)
target=tensor([[-0.0181,  0.0148],
        [ 0.6474, -0.4546],
        [-0.2010, -2.3036]])
loss_cross_entropy=0.2804051637649536

1.3 binary_cross_entropy

测量目标和输入概率之间的二元交叉熵的函数。

import torch
from torch.nn import functional as F

input = torch.randn((3, 2), requires_grad=True)
target = torch.randn((3, 2), requires_grad=False)

# 使用bianary_cross_entropy,那么输入需要使用F.sigmoid来处理输入值
loss_cross_entropy = F.binary_cross_entropy(F.sigmoid(input), target)
loss_cross_entropy.backward()
print(f"input={input}")
print(f"target={target}")
print(f"loss_cross_entropy={loss_cross_entropy}")
input=tensor([[ 0.9871, -1.2020],
        [ 0.5035,  0.5934],
        [-0.4187, -1.1187]], requires_grad=True)
target=tensor([[-0.0181,  0.0148],
        [ 0.6474, -0.4546],
        [-0.2010, -2.3036]])
loss_cross_entropy=0.2804051637649536
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值