【PyTorch】02基础知识---张量与autograd

2 PyTorch基础知识

官方文档:https://pytorch.org/docs/

2.1 安装与配置

人工智能工具库(Anaconda/Pytorch/PyCharm等)安装环境配置视频教程

深度学习环境搭建(从卸载CUDA到安装,以及Pytorch与torchvision的安装)

【PyTorch】1.1 PyTorch简介和安装

重新创建并切换使用虚拟环境的步骤:

  1. 退出当前虚拟环境:conda deactivate
  2. 创建虚拟环境:conda create -n pytorch_1.7 python=3.6
  3. PyTorch官网本地下载链接https://download.pytorch.org/whl/torch_stable.html
  4. 激活进入虚拟环境:conda activate pytorch_1.7
  5. 清华镜像源安装PyToch1.7:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ "torch-1.7.1+cu110-cp36-cp36m-win_amd64.whl"
  6. 安装torchvision0.8:pip install "torchvision-0.8.2+cu110-cp36-cp36m-win_amd64.whl"
  7. 更新PyCharm的python解释器:File—》Settings —》Project: python36_torch —》Python Interpreter—》Add—》Conda Environment—》Existing environment—》Interpreter—》“D:\SoftwareTool\Anaconda3\envs\pytorch_1.7\python.exe”

2.2 张量(Tensor)

2.2.1 概念

张量是一个多维数组,它是标量、向量、矩阵的高维拓展

【PyTorch】1.2 张量简介

image-20220521162837395

Variable是torch.autograd中的数据类型,主要用于封装Tensor,进行自动求导

image-20220521164709967

参数说明:

  • data:被封装的Tensor

  • grad:data的梯度(偏导数)

  • grad_fn:创建Tensor的Function,是自动求导的关键,记录创建该张量时所用的方法(函数)

  • requires_grad:指示是否需要梯度

  • is_leaf:指示是否为叶子结点(张量)【用户创建的结点(张量)称为叶子结点(张量)】

PyTorch0.4.0版开始,Variable并入Tensor

image-20220521164824137

参数说明:

  • dtype:张量的数据类型,如torch.FloatTensor, torch.cuda.FloatTensor
  • shape:张量的形状,如(64,3,224,224)
  • device:张量所在设备(GPU/CPU),是加速的关键

2.2.2 创建方法

【PyTorch】1.2 张量创建

常见三种创建方法:

  • 直接创建

  • 依据数值创建

  • 依据概率分布创建

1 直接创建

1.1 torch.tensor()

image-20220521165003813

功能:从data创建tensor

参数说明:

  • data:数据,可以是list、numpy
  • dtype:数据类型,默认与data的一致
  • device:所在设备(GPU/CPU)
  • requires_grad:是否需要梯度
  • pin_memory:是否存于锁页内存

1.2 torch.from_numpy(ndarray)

功能:从numpy创建tensor

注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动
image-20220521165035422
2. 依据数值创建

2.1 torch.zeros()


功能:根据size创建全0张量

参数说明:

  • size:张量的形状,如(3,3)、(3,224,224)
  • out:输出的张量
  • layout:内存中布局形式,有strided, sparse_coo等
  • device:所在设备(GPU/CPU)
  • requires_grad:是否需要梯度

2.2 torch.zeros_like()


功能:根据input形状创建全0张量

参数说明:

  • input:创建与input同形状的全0张量
  • dtype:数据类型
  • layout:内存中布局形式

2.3 torch.ones()

在这里插入图片描述

功能:根据size创建全1张量

参数说明:

  • size:张量的形状,如(3,3)、(3,224,224)
  • out:输出的张量
  • layout:内存中布局形式,有strided, sparse_coo等
  • device:所在设备(GPU/CPU)
  • requires_grad:是否需要梯度

2.4 torch.ones_like()
在这里插入图片描述
功能:根据input形状创建全1张量

参数说明:

  • input:创建与input同形状的全1张量
  • dtype:数据类型
  • layout:内存中布局形式

2.5 torch.full()
在这里插入图片描述
功能:根据size创建自定义的数值张量

参数说明:

  • size:张量的形状,如(3,3)、(3,224,224)
  • fill_value:张量的值

2.6 torch.full_like()

功能:根据input形状创建自定义的数值张量

2.7 torch.arange()

在这里插入图片描述
功能:创建等差的1维张量

注意事项:数值区间为[start,end),即左闭右开

参数说明:

  • start:数列起始值
  • end:数列结束值
  • step:数列公差,即步长,默认为1

2.8 torch.linspace()

在这里插入图片描述
功能:创建均分的1维张量

注意事项:长度为steps,数值区间为[start,end],即左闭右闭

参数说明:

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度,即均分数

2.9 torch.logspace()
在这里插入图片描述
功能:创建对数均分的1维张量

注意事项:长度为steps,底为base

参数说明:

  • start:数列起始值
  • end:数列结束值
  • steps:数列长度,即均分数
  • base:对数函数的底,默认为10

2.10 torch.eye()
在这里插入图片描述
功能:创建单位对角矩阵(2维张量)

注意事项:默认为方阵

参数说明:

  • n:矩阵行数
  • m:矩阵列数

3 依据概率分布创建

3.1 torch.normal()
在这里插入图片描述
功能:生成正态分布(高斯分布)张量

参数说明:

  • mean:均值
  • std:标准差

四种模式:

  • mean为标量,std为标量:需增加设置size参数(张量的形状)
  • mean为标量,std为张量
  • mean为张量,std为标量
  • mean为张量,std为张量

3.2 torch.randn()
在这里插入图片描述
功能:根据size生成标准正态分布(高斯分布)张量

参数说明:

  • size:张量的形状

3.3 torch.randn_like()

功能:根据input形状生成标准正态分布(高斯分布)张量

3.4 torch.rand()

功能:在区间[0,1)上,根据size生成均匀分布张量

参数说明:

  • size:张量的形状

3.5 torch.rand_like()

功能:在区间[0,1)上,根据input形状生成均匀分布张量

3.6 torch.randint()
在这里插入图片描述
功能:在区间[low,high)上,根据size生成整数均匀分布张量

参数说明:

  • size:张量的形状

3.7 torch.randint_like()

功能:在区间[low,high)上,根据input形状生成整数均匀分布张量

3.8 torch.randperm()
在这里插入图片描述
功能:生成从0到n-1的随机排列张量

参数说明:

  • n:张量的长度

3.9 torch.bernoulli()
在这里插入图片描述
功能:以input为概率,生成伯努利分布(0-1分布/两点分布)张量

参数说明:

  • input:概率值

代码实现:

import numpy as np
import torch

# -------------------------------example 1------------------------------------
# 通过torch.tensor创建张量

flag=True
if flag:
    arr1=np.ones((3,3))
    print("ndarray的数据类型:",arr1.dtype)

    t1=torch.tensor(arr1)
    # t=torch.tensor(arr1,device="cuda") # 使用GPU

    print(t1)

print("\n")
# -------------------------------example 2------------------------------------
# 通过torch.from_numpy创建张量

flag=True
if flag:
    arr2=np.array([[1,2,3],[4,5,6]])
    t2=torch.from_numpy(arr2)
    # print("numpy array:",arr2)
    # print("tensor:",t2)

    # print("\n修改arr")
    # arr2[0,0]=0
    # print("numpy array:",arr2)
    # print("tensor:",t2)

    print("\n修改tensor")
    arr2[0,0]=-1
    print("numpy array:",arr2)
    print("tensor:",t2)

print("\n")
# -------------------------------example 3------------------------------------
# 通过torch.zeros建张量

flag=True
if flag:
    out_t=torch.tensor([1])
    t3=torch.zeros((3,3),out=out_t)

    print("t3:\n",t3)
    print("out_t:\n",out_t)

    print(id(t3),id(out_t),id(t3)==id(out_t))

print("\n")
# -------------------------------example 4------------------------------------
# 通过torch.full创建全1张量

flag=True
if flag:
    t4=torch.full((3,3),fill_value=1)

    print("t4:\n",t4)


print("\n")
# -------------------------------example 5------------------------------------
# 通过torch.arange创建等差数列张量

flag=True
if flag:
    t5=torch.arange(2,10,2)  # 步长为2,左闭右开

    print("t5:\n",t5)

print("\n")
# -------------------------------example 6------------------------------------
# 通过torch.linspace创建均分数列张量

flag=True
if flag:
    t6=torch.linspace(2,10,5)  # 均分为5个数,左闭右闭

    print("t6:\n",t6)


print("\n")
# -------------------------------example 7------------------------------------
# 通过torch.normal创建正态分布张量

flag=True
if flag:

    # 模式1: mean:张量  std:张量
    mean=torch.arange(1,5,dtype=torch.float)
    std=torch.arange(1,5,dtype=torch.float)
    t7=torch.normal(mean,std)

    print("mean:{}\nstd:{}".format(mean,std))
    print("t7:\n",t7)

    print("\n")
    # 模式2: mean:标量  std:标量
    mean=0
    std=1
    t8=torch.normal(mean,std,size=(4,))   # mean和std都是标量时需设置size(张量的形状)

    print("mean:{}\nstd:{}".format(mean,std))
    print("t8:\n",t8)

    print("\n")
    # 模式3: mean:张量  std:标量
    mean=torch.arange(1,5,dtype=torch.float)
    std=1
    t9=torch.normal(mean,std)

    print("mean:{}\nstd:{}".format(mean,std))
    print("t9:\n",t9)

    print("\n")
    # 模式4: mean:标量  std:张量
    mean=0
    std=torch.arange(1,5,dtype=torch.float)
    t10=torch.normal(mean,std)

    print("mean:{}\nstd:{}".format(mean,std))
    print("t10:\n",t10)

2.2.3 张量操作

【PyTorch】1.3 张量操作与线性回归

常见四种操作:

  • 拼接
  • 切分
  • 索引
  • 变换
  1. 拼接

    • torch.cat()
      在这里插入图片描述
      功能:将张量按维度dim进行拼接

      参数说明:

      • tensors:张量序列
      • dim:拼接的维度(dim=0:行维度)
    • torch.stack()
      在这里插入图片描述
      功能:在新创建的维度dim上将张量进行拼接

      注意事项:使用时会增加维度

      参数说明:

      • tensors:张量序列
      • dim:拼接的维度
  2. 切分

    • torch.chunk()

      功能:将张量按维度dim进行平均切分

      返回值:张量列表

      注意事项:若不能整除,最后一份张量小于其他张量

      参数说明:

      • input:切分的张量
      • chunks:切分的份数
      • dim:切分的维度
    • torch.split()
      在这里插入图片描述
      功能:将张量按维度dim进行切分

      返回值:张量列表

      参数说明:

      • tensor:切分的张量
      • split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
      • dim:切分的维度
  3. 索引

    • torch.index_select()
      在这里插入图片描述
      功能:在维度dim上,按index索引数据

      返回值:根据index索引数据拼接的张量

      参数说明:

      • input:索引的张量
      • dim:索引的维度
      • index:索引数据的序号
    • torch.masked_select()
      在这里插入图片描述
      功能:按mask中的True进行索引

      返回值:一维张量

      参数说明:

      • input:索引的张量
      • mask:与input同形状的布尔类型张量
  4. 变换

    • torch.reshape()
      在这里插入图片描述
      功能:变换张量形状

      注意事项:当张量在内存中是连续时,新张量与input共享数据内存

      参数说明:

      • input:变换的张量
      • shape:新张量的形状
    • torch.transpose()
      在这里插入图片描述
      功能:交换张量的两个维度

      参数说明:

      • input:变换的张量
      • dim0:交换的维度
      • dim1:交换的维度
    • torch.t()
      在这里插入图片描述
      功能:2维张量转置,对矩阵而言,等价于torch.transpose(input,0,1)

    • torch.squeeze()
      在这里插入图片描述
      功能:压缩长度为1的维度(轴)

      参数说明:

      • dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除
    • torch.unsqueeze()
      在这里插入图片描述
      功能:依据dim扩展维度(轴)

      参数说明:

      • dim:扩展的维度

2.2.4 数学运算

  1. 加减乘除
  2. 对数、指数、幂函数
  3. 三角函数
  1. 加减乘除
    在这里插入图片描述

    • torch.add()
      在这里插入图片描述
      功能:逐个元素计算input+alpha*other

      参数说明:

      • input:第一个张量
      • alpha:乘项因子
      • other:第二个张量
    • torch.addcmul()
      在这里插入图片描述
      功能:(加法结合乘法)逐个元素计算input+value*tensor1*tensor2

    • torch.addcdiv()

      功能:(加法结合除法)逐个元素计算input+value*tensor1/tensor2

  2. 对数、指数、幂函数
    在这里插入图片描述

  3. 三角函数
    在这里插入图片描述

2.3 计算图

计算图是用来描述运算的有向无环图

【PyTorch】1.4 计算图

计算图有两个主要元素:结点(Node)边(Edge)

  • 结点表示数据,如向量、矩阵、张量

  • 边表示运算,如加减乘除卷积等

用计算图表示:y=(x+w)*(w+1)
在这里插入图片描述

  1. 叶子结点:用户创建的结点(张量),如X与W

    is_leaf:指示张量是否为叶子结点(张量)
    在这里插入图片描述

  2. grad_fn:记录创建该张量时所用的方法(函数)
    在这里插入图片描述

2.4 PyTorch动态图机制

根据计算图搭建方式,可将计算图分为动态图静态图

  • 动态图:运算与搭建同时进行
  • 静态图搭建图,运算

【PyTorch】1.4 动态图机制

2.5 autograd(自动求导)

【PyTorch】1.5 autograd与逻辑回归

  1. torch.autograd.backward()
    在这里插入图片描述
    功能:自动求取梯度

    参数说明:

    • tensors:用于求导的张量,如loss
    • grad_tensors:设置多梯度权重
    • retain_graph:保存计算图,设置为True以便后面再次使用计算图(反向传播)
    • create_graph:创建导数计算图,用于高阶求导
  2. torch.autograd.grad()
    在这里插入图片描述
    功能:自动求取梯度

    参数说明:

    • outputs:用于求导的张量,如loss
    • inputs:需要梯度的张量
    • grad_outputs:设置多梯度权重
    • retain_graph:保存计算图,设置为True以便后面再次使用计算图(反向传播)
    • create_graph:创建导数计算图,一阶求导时需设置create_graph=True用于高阶求导

autograd 注意事项

  1. 梯度不自动清零,即需使用w.grad.zero_()方法进行梯度清零,以防止梯度一直累加
  2. 依赖于叶子结点的结点,requires_grad默认为True
  3. 叶子结点不可执行inplace(原位/原地操作),即会改变内存地址
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个开源的机器学习框架,主要用于构建深度学习模型。下面是一些PyTorch基础代码知识: 1. 张(Tensor)操作: - 创建张:使用`torch.tensor()`函数可以创建一个张。 - 张的属性:可以使用`.shape`属性获取张的形状,使用`.dtype`属性获取张的数据类型。 - 张的运算:可以进行加减乘除等基本运算,也可以使用函数`torch.add()`, `torch.sub()`, `torch.mul()`, `torch.div()`等进行运算。 2. 自动求导(Autograd): - 自动求导:PyTorch使用自动求导机制来计算梯度。要启用自动求导,只需将`requires_grad=True`设置为张的参数。 - 梯度计算:通过调用`.backward()`方法可以计算张的梯度。 - 禁用梯度跟踪:可以使用`torch.no_grad()`上下文管理器来禁用梯度的跟踪。 3. 神经网络模块: - 搭建网络:使用`torch.nn.Module`类可以定义神经网络模块。需要实现两个方法:`__init__()`和`forward()`。 - 参数优化:使用`torch.optim`模块可以定义优化器,如SGD、Adam等。可以通过`optimizer.zero_grad()`清零梯度,`optimizer.step()`更新参数。 4. 数据加载: - 数据集:可以使用`torch.utils.data.Dataset`类来定义自己的数据集。 - 数据加载器:使用`torch.utils.data.DataLoader`类可以创建数据加载器,用于批加载数据。 5. 训练模型: - 训练循环:通常使用两个嵌套的循环来训练模型,外循环用于迭代训练轮数,内循环用于迭代数据批次。 - 前向传播和反向传播:在内循环中,通过前向传播计算输出,然后计算损失,最后使用反向传播计算梯度并更新参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值