0
点赞
收藏
分享

微信扫一扫

pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分

hwwjian 2022-05-03 阅读 133

在训练神经网络时,最常用的算法是反向传播。在该算法中,参数(模型权重)根据损失函数相对于给定参数的梯度进行调整。为了计算这些梯度,Pytorch有一个名为 torch.autograd 的内置微分引擎。它支持自动计算任何计算图形的梯度。本例中考虑最简单的单层神经网络,输入x,参数w和b,以及一些损失函数。可通过以下方式在PyTorch中定义:

import torch

x = torch.ones(5)  # input tensor,返回一个全为1 的张量,形状由可变参数sizes定义
y = torch.zeros(3)  # expected output,返回一个全为标量 0 的张量
w = torch.randn(5, 3, requires_grad=True)#返回一个符合均值为0,方差为1的正态分布(标准正态分布)中填充随机数的张量
b = torch.randn(3, requires_grad=True)  #requires_grad(bool, optional) –autograd是否应该记录对返回张量的操作(说明当前量是否需要在计算中保留对应的梯度信息)。
z = torch.matmul(x, w)+b#两个张量矩阵x,w相乘
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)#对神经网络的输出结果进行sigmoid操作,然后求交叉熵

其中torch.randn()函数返回一个符合标准正态分布填充随机数的张量参数requires_grad的含义是如果需要为张量计算梯度,则为True,否则为False。在使用pytorch创建tensor时,可以指定requires_grad为True(默认为False),更多含义参考:

torch.randn()函数_meteor,across T sky的博客-CSDN博客_torch.randn()

其中torch.matmul(input, other) 函数是计算两个张量input和other的矩阵乘积。因为matmul函数没有强制规定维度和大小,可以用利用广播机制进行不同维度的相乘操作。本例中input为一维,other为二维,则先将input的一维向量扩充到二维,然后进行矩阵乘积,得到结果后再将此维度去掉,得到的与input的维度相同。该函数的多维张量操作详见:

PyTorch疑难杂症(1)——torch.matmul()函数用法总结_wendy_ya的博客-CSDN_torch.matmul

其中torch.nn.functional.binary_cross_entropy_with_logits函数的功能是先对神经网络的输出结果进行Sigmoid激活操作,然后求交叉熵。作用是衡量真实分布和预测的分布的差异情况。参数input神经网络的预测结果(未经过sigmoid),任意形状的tensor。参数target是标签值,与input形状相同。详细的参数如下:

pytorch常用函数:torch.nn.functional.binary_cross_entropy_with_logits_xingS1992的博客-CSDN博客_torch.nn.functional.binary_cross_entropy

1、张量、函数和计算图

 以上代码可以定义以下 计算图

在这个网络中,w和b是需要优化的参数。 因此就要计算损失函数相对于这些变量的梯度变化。 为了做到这一点,设置了requires_grad方法查看这些张量的属性。(你可以在创建张量时设置requires_grad的值,或稍后使用x.requires_grad(True)方法设置。)

 我们应用于张量来构造计算图的函数实际上是类函数的对象。 该对象知道如何计算正向函数,以及如何在反向传播步骤中计算其导数。 对反向传播函数的引用存储在张量的grad_fn属性中。

print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")

 

举报

相关推荐

0 条评论