Pytorch 基础学习(数据结构、自动求导)

Pytorch 基础学习

注:本文为学习 DataWhale 开源教程《深入浅出 Pytorch》所做学习笔记,仅记录笔者认为价值较高且之前接触较少的知识点

一、基本数据结构——Tensor

1. Tensor 构建

​ Tensor 是 Pytorch 的基本数据结构,同 numpy 的 ndarray 类似,一般来说,0维代表标量,1维代表向量,2维代表矩阵,3维代表图像、文本等数据。

​ Tensor 有多种构建方法,包括:

  1. 使用 rand 函数构建随机 tensor:

    x = torch.rand(4,4,4)
    # 输出 4*4*4 的三维tensor
    
  2. 使用 zeros 创建全0 tensor:

    x = torch.zeros(4, 4, 4, dtype=torch.long)
    # 形状同上
    
  3. 直接只用 Tensor 基于数组创建 tensor:

    array = np.array([[1,2,3],[4,5,6]])
    x = torch.Tensor(array)
    
  4. 使用 eye 创建单位矩阵:

    x = torch.eye(6)
    # 仅能生成二维矩阵
    
  5. 使用 arange 创建一维向量:

    x = torch.arange(0, 10, 2)
    
  6. 使用 randn 生成正态分布 tensor:

    x = torch.randn(4,4,4)
    # 形状同第一个
    

2. Tensor 操作

​ Tensor 的操作与 ndarray 非常一致,仅有部分需注意的不同点如下:

  1. 可以使用 add_ 直接进行原值操作:

    # 使用add_进行原值操作
    y = torch.rand(4, 4, 4)
    print(y[0,0,0])
    x = torch.randn(4, 4, 4)
    print(x[0,0,0])
    y.add_(x)
    print(y[0,0,0])
    

    输出结果如下:
    在这里插入图片描述

  2. 索引切片操作

    # 索引操作
    x = torch.rand(2,2,2)
    print(x)
    print("取第0维")
    print(x[0,:,:])
    print("取第一维")
    print(x[:,0,:])
    print("取第二维")
    print(x[:,:,0])
    

    输出结果如下:

    在这里插入图片描述

​ 注:tensor 的切片方法同 ndarray 一致,对于维度的选择上,可以从最外层的括号出发,不断向里剥,如第0维是最内部括号中的数据,更大的维度依次向外扩展。

  1. view 变换形状操作:

    x = torch.rand(2,2,2)
    print(x)
    y = x.view(2, -1)
    print(y)
    

    输出结果如下:

    在这里插入图片描述

​ 注:在 view 函数中,维度的选择通过参数数量实现,因此多个参数的乘积应等于总数据数,-1则表示按照数据数动态确定

二、自动求导机制

​ 自动求导、反向传播机制是深度学习、神经网络的核心技术之一,Pytorch 通过 auto_grad 包实现了自动求导机制,同时对每一个 tensor 都支持自动求导,以实现神经网络的参数学习。

​ 自动求导的使用很简单,首先通过声明变量,创建关于核心变量的表达式,接着对表达式进行反向传播,再查看核心变量的梯度值即为表达式对核心变量的梯度计算值:

x = torch.ones(2, 2, requires_grad=True)
# 核心变量x
y = x ** 2
z = y * y * 3
# 表达式z:3 * x^4
# 开始反向传播
z.backward(torch.ones(2,2))
# 由于z是标量,需要向z传递一个同等形状的向量来计算梯度(雅各比矩阵)
print(x.grad)
# 此时x的梯度为从最上层反向传播到x的梯度,即d(z)/d(x)
# z = 3 * x^4
# dz/dx = 12 * x^3 = 12

​ 注意:① 梯度的计算是累积的,因此在每一轮重新计算时,需要通过“x.grad.data.zero_()”清空梯度;②默认情况下 Pytorch 是不保留计算图的,梯度反向传播仅支持一次,可以通过 retain_graph 属性保留计算图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值