• 【pytorch学习笔记】01-安装与基础使用


    pytorch安装&使用

    • 简单、高效、扩展性好
    • 在学术研究领域较多

    安装

    • 安装python
    • 查看电脑配置,按自己的需求选择对应版本(cpu,gpu,python版本等)
    • 使用指令 复制Run this Command内容执行即可
      在这里插入图片描述

    pytorch基础知识

    张量

    • pytorch基本运算单元,与数学上的使用,内容有不同
    • 0阶为scalar,1阶为vector,二阶为matrix
    • 其本质是一种多重线性映射关系,坐标分布在多维空间内,拥有多个分量的量。
    pytorch中的使用
    • 存储和变换数据的主要工具
    • 和numpy非常相似,但提供GPU计算和自动梯度等功能
    tensor创建
    import torch
    #常见Tensor创建方式
    ## 快速初始化
    ###创建全0or1\对角矩阵,可使用dtype进行类型设置,默认为float
    t1 = torch.zeros(4,3,dtype=torch.int)
    t2 = torch.ones(4,3)
    t3 = torch.eye(4,4)
    t4 = torch.rand(4,3)#随机 rand服从均匀分布,randn服从标准正态分布
    # print(t1,t2,t3,t4)
    ###直接构建
    t1 = torch.Tensor(6,4,5)#按搞定的尺寸构建,3个维度(6,4,5)
    t2 = torch.tensor([5.5,3])#按数据构建
    # print(t1,t2)
    ### 函数构建
    t1 = torch.arange(0,10,2)#从0-9,步长为1构建,默认为1
    t2 = torch.linspace(0,10,5)#从0-10,均分为2块
    t3 = torch.normal(mean=0.5,std=torch.arange(1.,6.))#生成正态分布张量
    t4 = torch.randperm(7)#生成0-7的随机排列tensor
    # print(t4)
    ###基于已有的tensor创建新的tensor
    t1 = t1.new_ones(4,3)#与旧的tensor具有相同的dtype和device
    # print(t1)
    t1 = torch.randn_like(t1,dtype=torch.float)#重置数据类型与数据
    print(t1)
    print(t1.size(),t1.shape)#查看尺寸
    
    • 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
    tensor操作
    #张量的相关操作
    ##加法
    y = torch.randn(4,3)
    x = torch.randn(4,3)
    # print(x+y)#方式1
    # print(torch.add(x,y))#方式2
    # print(y.add(x))#方式3
    ##索引 --与numpy基本一致
    # print(x[:,1])
    ##维度转换 view与reshape
    x = torch.randn(4,4)
    y = x.view(16)#4*4变为1*16 会改变原始张量 reshape不会改变但不能保证输出是拷贝值
    z = x.view(-1,8)#-1代表这一维的维数由其他维度决定 此处为2*8
    ###不影响原始张量
    x = torch.randn(4,4)
    x2 = x.clone()
    print(id(x),id(x2))#克隆副本
    ### squzee与unsqueeze  删去维数为1的维度/给指定位置增加维数为1的维度
    x = torch.unsqueeze(x,2)#指定位置添加维数为1的维度
    x = torch.unsqueeze(x,1)
    print(x.shape)
    x = torch.squeeze(x,1)#去掉指定位置维数为1的维度,不指定位置则全去除
    print(x.shape)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    tensor广播机制
    #广播机制
    ##两个形状不同的tensor按元素运算时,“可能”触发广播机制
    # x = torch.arange(1,5)
    # y = torch.arange(1,9).view(4,2)#这样是不会触发的
    # print(x)
    # print(x+y)
    
    x = torch.arange(1, 3).view(1, 2)
    print(x)
    y = torch.arange(1, 4).view(3, 1)
    print(y)
    print(x + y)#这样可以
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    自动求导

    • 目的:快速求解偏导
    • 神经网络的核心:autograd(为张量上的所有操作提供自动求导机制)
    • tensor中有一个属性为requires_grad,默认为False 设定为True后将追踪对于该张量的所有操作
    #autograd包
    #1、一个张量只有属性.requires_grad设定为True,才会程序才会追踪对于该张量的所有操作,对于已建立的张量
    #使用.requires_grad_()来更改
    #2、进行函数计算后z=f(x,y) 使用.backward()就会自动计算所有梯度(注:为标量时不需要传入任何参数)
    #3、阻止一个张量被跟踪历史,可以调用.detach()将其与计算历史分离,并阻止它未来的计算记录被跟踪
    #还可以被包装在with torch.no_grad():中,防止冗余计算
    #4、Function类,与Tensor互相连接生成无环图,编码了完整的计算历史,反应为张量属性:.grad_fn
    from __future__ import print_function
    import torch
    x = torch.randn(3,3,requires_grad=True)
    # print(x.grad_fn)
    y = x**2
    #y.backward()因为不是标量所以不能不加参数
    y.backward(gradient=torch.randn(3,3))#如此添加参数
    # print(x.grad)
    # print(y.dim())
    #梯度
    #1、每一次反向传播,梯度都会累加之前的梯度
    x = torch.ones(2,2,requires_grad=True)
    y = x**2
    out = (y*y*3).mean()
    out.backward()
    # print(x.grad)
    out1 = x.sum()
    out1.backward()
    # print(x.grad)
    x.grad.data.zero_()#清空积累的梯度
    out2 = x.sum()
    out2.backward()
    # print(x.grad)
    ##防止跟踪
    with torch.no_grad():
        print((x**2).requires_grad)
    ##希望修改tensor的数值,但又不希望autograd记录
    x = torch.ones(1,requires_grad=True)
    print(x.data) # 还是一个tensor
    print(x.data.requires_grad) # 但是已经是独立于计算图之外
    y = 2 * x
    x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播
    y.backward()
    print(x.data) # 更改data的值也会影响tensor的值 
    print(x.grad)
    ##.data与.detach的不同点与相同点
    ##相同点
    ###-都和x共享同一块数据
    ###-都和x的计算历史无关
    ###-requires_grad=False
    ##不同点
    ###-data对数据的保护不及detach
    
    • 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

    并行计算

    • 目的是提高效率,减少训练时间
    • 涉及cuda的使用,GPU的调用,对于CPU就是进程的调用
    常见的方法:
    • 网络结构分布到不同不同的设备中
    • 同一层的任务分布到不同设备中
    • 不同数据分布到不同设备中
  • 相关阅读:
    H2 数据库的 expected “identifier 错误
    ns2无线局域网隐藏节点仿真实验
    文件夹名称中空格如何替换为符号
    C# 第五章『面向对象』◆第6节:类的继承
    飞塔防火墙HA详解与配置
    (三十三)geoserver源码&添加新的数据存储
    AnyLogic Pro 8.8.4 Crack
    【每日一题】744. 寻找比目标字母大的最小字母
    【论文粗读】(NeurIPS 2020) SwAV:对比聚类结果的无监督视觉特征学习
    Apache Hudi 0.13.0版本重磅发布!
  • 原文地址:https://blog.csdn.net/qq_42947060/article/details/126819962