• 【博学谷学习记录】超强总结,用心分享丨人工智能 Python基础 个人学习总结之列表排序


    张量的创建

    创建线性和随机张量

    torch.arange 和 torch.linspace 创建线性张量
    torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
    torch.randn 创建随机张量

    创建01张量

    torch.ones 和 torch.ones_like 创建全1张量
    torch.zeros 和 torch.zeros_like 创建全0张量
    torch.full 和 torch.full_like 创建全为指定值张量

    张量元素类型转换

    tensor.type(torch.DoubleTensor)
    torch.double()

    张量形状操作常用函数

    reshape, transpose, permute, view, contiguous, squeeze, unsqueeze

    1. reshape 函数可以在保证张量数据不变的前提下改变数据的维度.
    2. transpose 函数可以实现交换张量形状的指定维度, permute 可以一次交换更多的维度.
    3. view 函数也可以用于修改张量的形状, 但是它要求被转换的张量内存必须连续,所以一般配合 contiguous 函数使用.
    4. squeeze 和 unsqueeze 函数可以用来增加或者减少维度.

    张量自动微分模块

    自动微分作用

    自动微分(Autograd)模块对张量做了进一步的封装,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,在神经网络的反向传播过程中,Autograd 模块基于正向计算的结果对当前的参数进行微分计算,从而实现网络权重参数的更新。

    梯度基本计算

    import torch
    
    
    # 1. 单标量梯度的计算
    # y = x**2 + 20
    def test01():
    
        # 定义需要求导的张量
        x = torch.tensor(10, requires_grad=True, dtype=torch.float64)
        # 变量经过中间运算
        f = x ** 2 + 20
        # 自动微分
        f.backward()
        # 打印 x 变量的梯度
        # backward 函数计算的梯度值会存储在张量的 grad 变量中
        print(x.grad)
    
    
    # 2. 单向量梯度的计算
    # y = x**2 + 20
    def test02():
    
        # 定义需要求导张量
        x = torch.tensor([10, 20, 30, 40], requires_grad=True, dtype=torch.float64)
        # 变量经过中间计算
        f1 = x ** 2 + 20
    
        # 注意:
        # 由于求导的结果必须是标量
        # 而 f 的结果是: tensor([120., 420.])
        # 所以, 不能直接自动微分
        # 需要将结果计算为标量才能进行计算
        f2 = f1.sum()  # f2 = 1/2 * x
    
        # 自动微分
        f2.backward()
    
        # 打印 x 变量的梯度
        print(x.grad)
    
    
    # 3. 多标量梯度计算
    # y = x1 ** 2 + x2 ** 2 + x1*x2
    def test03():
    
        # 定义需要计算梯度的张量
        x1 = torch.tensor(10, requires_grad=True, dtype=torch.float64)
        x2 = torch.tensor(20, requires_grad=True, dtype=torch.float64)
    
        # 经过中间的计算
        y = x1**2 + x2**2 + x1*x2
    
        # 将输出结果变为标量
        y = y.sum()
    
        # 自动微分
        y.backward()
    
        # 打印两个变量的梯度
        print(x1.grad, x2.grad)
    
    
    # 4. 多向量梯度计算
    def test04():
    
        # 定义需要计算梯度的张量
        x1 = torch.tensor([10, 20], requires_grad=True, dtype=torch.float64)
        x2 = torch.tensor([30, 40], requires_grad=True, dtype=torch.float64)
    
        # 经过中间的计算
        y = x1 ** 2 + x2 ** 2 + x1 * x2
        print(y)
    
        # 将输出结果变为标量
        y = y.sum()
    
        # 自动微分
        y.backward()
    
        # 打印两个变量的梯度
        print(x1.grad, x2.grad)
    
    
    if __name__ == '__main__':
        # test04()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    梯度控制的方法

    1.不计算梯度

    # 通过函数装饰器
    @torch.no_grad()
    def f(x):
        y = x ** 2
    # 或 对代码装饰
    with torch.no_grad(): 
        y = x ** 2
    # 或 设置梯度不可用
    set_grad_enabled(False
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.不计算累计梯度,将梯度清0
    x.grad.data.zero_()

    一个计算梯度值的小例子

    在这里插入图片描述

    输出结果: tensor([ 343., 1283., 2823.], dtype=torch.float64)

    心得:张量的使用作为深度学习的基础,是很重要的,记住一些常用函数,其他的非常用的查阅资料 ,用多了便可以记住

  • 相关阅读:
    Springboot毕设项目体育器材及场地管理系统60g3njava+VUE+Mybatis+Maven+Mysql+sprnig)
    regexpire-攻防世界-MISC
    大数据必学Java基础(五十二):集合的深入了解
    六、全局约束中的Alldifferen和Cumulative的实现
    设计模式七大原则-单一职责原则SingleResponsibility
    【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
    Java集合知识点
    c语言经典测试题2
    ADRC自抗扰控制
    12-网络篇-通信过程中的网络表
  • 原文地址:https://blog.csdn.net/weixin_44194638/article/details/127835759