推荐学习视频: www.bilibili.com/video/BV1Vx…
干货满满,一起学习😀
阅读笔记 ② —— 第2章 Pytorch深度学习框架简介
基本概念和运算内容
张量的创建和维度的操作
- 张量创建-用列表/numpy数组/迭代器都可
- 张量4种创建方式
torch.tensor函数 (上个标题都是使用这个方法~)
Pytorch内置函数(6个) torch.rand——生成服从[0,1)上均匀分布的任意形状的张量
torch.randn函数——生成元素服从标准正态分布 x~N(0,1)
torch.zeros——生成元素全为0的张量;torch.ones——生成元素全为1的张量
torch.eye——生成单位矩阵
torch.randint——生成均匀分布(x~U(a,b))的整数张量
通过已知张量创建形状相同的张量(xx_like函数)
通过已知张量创建形状不同但数据类型相同的张量 (new_xx函数:xx只有ones & zeros 可以)
- 张量存储设备
- 使用device属性可以获取张量所在的设备
- 张量维度方法(张量形状相关的函数)
改变张量的形状:
view()方法 作用于原来的张量,新张量的总元素数目和原来张量数目相同,只改变了形状,没有改变原来的数据 如果使用contiguous()则是重新生成了张量。
reshape()方法 生成新张量(相当于连续调用view()和contiguous())——当形状信息不兼容,即步长和维度(新张量的两个连续维度乘积=原来张量的某一个维度)时,会生成一个新的张量,并自动复制原始的张量数据。
- 张量的索引和切片(都和Numpy类似)
- 索引
- 切片
- Pytorch的编号从0开始,同样可以使用[i:j]的方法来获取张量切片(从i开始但不包括j,即[i,j))
- 索引操作支持掩码选择,传入一个和原来形状相同的布尔型张量,返回初始张量对应布尔型张量值为True(或者8位无符号整数1)位置对应的元素。 / 最终,返回的是一个向量(即一维张量)
张量的运算
- 以单个张量作为参数的函数运算
- 调用张量的内置方法:大部分的函数都有Tensor的内置方法(比如sigmoid,relu,tanh等,以及常用函数如:幂函数pow等)
- 调用torch自带的函数
上述两种情况,操作的结果都是返回一个新的张量!
张量的平方根(t1是一个tensor)
- 张量内部方法 t1.sqrt()
- 函数形式 torch.sqrt(t1)
- 平方根原地操作 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.
- 以两个张量作为参数的函数运算
- Pytorch张量的四则运算
-
如果使用张量的内置方法,即“下划线版本”,该版本会直接调用方法的张量的值,即原地操作(不会改变张量分配的内存地址,而是改变张量内存地址中的存储的值)
t1.add_(t2)
那么直接输出t1即最终求和的结果
- 张量的极值和排序
获取张量(沿着某个维度)的最大值和最小值,以及这些值所在的位置
😀max/argmax/min/argmin具体可见此文:blog.csdn.net/Flag_ing/ar…
- 如果只需要知道最大值和最小值的位置,即返回序号——使用argmax和argmin
- 如果既要获得最大和最小值的位置 以及 获得位置具体的值,即返回最大最小值的位置,对应最大值和最小值组成的元组(Tuple)——使用max和min
- max/argmax (同理min/argmin)中:若函数不指明dim,则max返回最大值;argmax返回最大值的位置。
- 排序函数sort(默认descending=False,即从小到大排) 如果要从大到小排,即descending=True 😀sort()具体可见此文blog.csdn.net/pearl8899/a…
- 矩阵的乘法和张量的缩并
- 矩阵的乘法(线性变换):
- 函数——torch.mm()【mm代表:matrix multiplication】
- 张量内置的方法——mm方法
- 利用 @ 运算符号
- 张量的缩并
- 张量的拼接和分割
- 拼接:torch.stack,torch.cat 将多个张量堆叠和拼接成一个张量
torch.stack和torch.cat的区别:torch.stack维度开始不存在,会创建一个新的维度;torch.cat维度预先存在,张量沿着这个维度堆叠。
- 分割:torch.split,torch.chunk 把一个张量分割成多个张量
张量有内置的split和chunk方法
chunk和split的区别在于:
- chunk的int是分段,split的int是沿某个维度上数int
- chunk的 chunks只能是int型,而split的 split_size_or_section可以是list。
- chunks在时,不满足该维度下的整除关系,会将块按照维度切分成1的结构。而split会报错。
torch.split(*tensor*, *ssplit_size_or_section*, *dim=0)*
torch.chunk(*input*, *chunks*, *dim=0*) → List of Tensors
- a.split的3是沿着最后一个维度上,数3列划分,所以最终是2个tensor(每个tensor3*3)
- a.chunk的3是要分成3段,即分成3个tensor(每个tensor3*2)
- 张量维度的扩增和压缩
- 张量维度扩增:torch.unsqueeze()函数 或者 内置的unsqueeze方法
- 张量的压缩:torch.squeeze()函数 或者 内置的squeeze方法
其他
randn和rand的区别