深入浅出Pytorch-阅读笔记②(中)【和B站视频学习】

184 阅读5分钟

推荐学习视频: www.bilibili.com/video/BV1Vx…

干货满满,一起学习😀

阅读笔记 ② —— 第2章 Pytorch深度学习框架简介

基本概念和运算内容

张量的创建和维度的操作

  1. 张量创建-用列表/numpy数组/迭代器都可

image.png

image.png

image.png

  1. 张量4种创建方式
  1. torch.tensor函数 (上个标题都是使用这个方法~)

  2. Pytorch内置函数(6个) torch.rand——生成服从[0,1)上均匀分布的任意形状的张量

image.png

torch.randn函数——生成元素服从标准正态分布 x~N(0,1) image.png torch.zeros——生成元素全为0的张量;torch.ones——生成元素全为1的张量 image.png

torch.eye——生成单位矩阵

image.png

torch.randint——生成均匀分布(x~U(a,b))的整数张量 image.png

  1. 通过已知张量创建形状相同的张量(xx_like函数) image.png

  2. 通过已知张量创建形状不同但数据类型相同的张量 (new_xx函数:xx只有ones & zeros 可以) image.png

  1. 张量存储设备
  • 使用device属性可以获取张量所在的设备 image.png
  1. 张量维度方法(张量形状相关的函数)

image.png

改变张量的形状:

  1. view()方法 作用于原来的张量,新张量的总元素数目和原来张量数目相同,只改变了形状,没有改变原来的数据 如果使用contiguous()则是重新生成了张量。

  2. reshape()方法 生成新张量(相当于连续调用view()和contiguous())——当形状信息不兼容,即步长和维度(新张量的两个连续维度乘积=原来张量的某一个维度)时,会生成一个新的张量,并自动复制原始的张量数据。

image.png

  1. 张量的索引和切片(都和Numpy类似
  • 索引 image.png
  • 切片 image.png
  • Pytorch的编号从0开始,同样可以使用[i:j]的方法来获取张量切片(从i开始但不包括j,即[i,j))
  • 索引操作支持掩码选择,传入一个和原来形状相同的布尔型张量,返回初始张量对应布尔型张量值为True(或者8位无符号整数1)位置对应的元素。 / 最终,返回的是一个向量(即一维张量) image.png

张量的运算

  1. 单个张量作为参数的函数运算
  • 调用张量的内置方法:大部分的函数都有Tensor的内置方法(比如sigmoid,relu,tanh等,以及常用函数如:幂函数pow等)
  • 调用torch自带的函数

上述两种情况,操作的结果都是返回一个新的张量!

张量的平方根(t1是一个tensor)

  1. 张量内部方法 t1.sqrt()
  2. 函数形式 torch.sqrt(t1)
  3. 平方根原地操作 t1.sqrt_()

求和的函数(和内置方法):torch.sum

#注:对第0维的元素求和
torch.sum(t1,0)

#对第0,1维的元素求和
torch.sum(t1,[0,1])

求积的函数(和内置方法):torch.prod(上述方式同理prod和mean)

求平均的函数(和内置方法):torch.mean

  • 求和,求平均,求积等计算的同时,会使张量的维度缩减,若要保留这些维度keepdim=True,这样这个维度就会被保留为1.

  1. 两个张量作为参数的函数运算
  • Pytorch张量的四则运算

image.png

  • 如果使用张量的内置方法,即“下划线版本”,该版本会直接调用方法的张量的值,即原地操作(不会改变张量分配的内存地址,而是改变张量内存地址中的存储的值)

    t1.add_(t2) 那么直接输出t1即最终求和的结果


  1. 张量的极值和排序

获取张量(沿着某个维度)的最大值和最小值,以及这些值所在的位置

😀max/argmax/min/argmin具体可见此文:blog.csdn.net/Flag_ing/ar…

  1. 如果只需要知道最大值和最小值的位置,即返回序号——使用argmax和argmin
  2. 如果既要获得最大和最小值的位置 以及 获得位置具体的值,即返回最大最小值的位置,对应最大值和最小值组成的元组(Tuple)——使用max和min image.png image.png
  • max/argmax (同理min/argmin)中:若函数不指明dim,则max返回最大值argmax返回最大值的位置
  1. 排序函数sort(默认descending=False,即从小到大排) 如果要从大到小排,即descending=True 😀sort()具体可见此文blog.csdn.net/pearl8899/a…

  1. 矩阵的乘法和张量的缩并
  • 矩阵的乘法(线性变换):
  1. 函数——torch.mm()【mm代表:matrix multiplication】
  2. 张量内置的方法——mm方法
  3. 利用 @ 运算符号

image.png

  • 张量的缩并

Untitled notebook(1)_1.jpg


  1. 张量的拼接和分割
  • 拼接:torch.stack,torch.cat 将多个张量堆叠和拼接成一个张量

torch.stack和torch.cat的区别:torch.stack维度开始不存在,会创建一个新的维度torch.cat维度预先存在,张量沿着这个维度堆叠。

Snipaste_2022-08-20_16-05-08.png

image.png

  • 分割:torch.split,torch.chunk 把一个张量分割成多个张量

张量有内置的split和chunk方法

chunk和split的区别在于:

  • chunk的int是分段,split的int是沿某个维度上数int
  1. chunk的 chunks只能是int型,而split的 split_size_or_section可以是list
  2. chunks在时,不满足该维度下的整除关系,会将块按照维度切分成1的结构。而split会报错。

torch.split(*tensor*, *ssplit_size_or_section*, *dim=0)*

torch.chunk(*input*, *chunks*, *dim=0*) → List of Tensors

image.png

image.png

  • a.split的3是沿着最后一个维度上,数3列划分,所以最终是2个tensor(每个tensor3*3)
  • a.chunk的3是要分成3段,即分成3个tensor(每个tensor3*2)

  1. 张量维度的扩增和压缩
  • 张量维度扩增:torch.unsqueeze()函数 或者 内置的unsqueeze方法
  • 张量的压缩:torch.squeeze()函数 或者 内置的squeeze方法

image.png

Snipaste_2022-08-20_18-43-43.png


其他

randn和rand的区别

image.png