张量数据类型 1.查看数据类型之前一直在看李宏毅老师的深度学习课程,感觉对于深度学习的许多细节得到了明显的提升
最近想尝试几个gan的代码运行,将之前忽略的一些基础操作重新整理一下,便于日后使用
学习来源: 深度学习与PyTorch入门实战
需要代码和视频资源的可以私信或者留言
尽量使用 tensor.type()与isinstance()来判别数据类型, python自带的type()函数只能告诉我们是tensor但不能得到具体的类型
查看基本类型
查看cpu与gpu
1. import from numpy 2. import from List通常创建随机未初始化的用(大写+shape)
torch.Tensor(2,3) 传入的是shape
创建已知数值tensor的用(小写+数值)
torch.tensor([1,2])
-
3.生成未初始化的tensor4.设置默认的tensor type在后续代码中需要用正常的数据覆盖他们,不然可能会产生错误
5. 随机初始化 6.正态分布初始 7. 其他创建方式torch.set_default_tensor_type(torch.DoubleTensor)
增强学习的过程中通常会设置成double类型
full
arange
linspace logspace
左右边界都包括, step代表分成几个数
默认生成10的0次方为起始值,10的-1次方为终止值的10个数构成的等比数列 bases可以修改底数
ones zero eye,randperm
切片与索引,维度变换 1.切片取值randperm功能是随机打乱一个数字序列。
常用的切片操作与list一样, 这里就记录一些有用的函数
...可以省略中间的:,:,:
unsqueeze: 在相应的位置上插入1个维度
下面案例中的索引-5的作用与0的作用相同
unsqueeze的应用, b与f的相加
Squeeze: 指定位置处如果维度为1, 则压缩, 不为1则不变
Expand 参数为新的shape
transpose交换维度 Broadcasting特性repeat参数表示 将当前维度重复的次数
在不同维度相加的情况下, 只要满足Broadcasting的使用条件, pytorch会自动帮你补全相应的维度并进行相加操作
使用场景: 如下图, 给所有人的每门成绩加五分
使用条件: 从最小的维度开始匹配, 如果维度为1, 则自动补全
补全情况
不能自动使用Broadcasting的情况
stack除了要拼接的维度之外, 其他维度需要相同
stack与cat不同, stack的做法是新建一个维度
假设(32,8) 代表32个学生和8门课的成绩, 如果用stack的话,得到(2,32,8) 这里的2可以理解为班级, 因此在实际情况下我们根据场景的不同选择 stack或者cat
chunk输入的数值表示划分后tensor的长度
数学运算 普通加减乘除输入的数值代表要划分的数量, 2代表分为2个tensor
torch.mm: 二维矩阵相乘
torch.matmul : 高维也可以用
a@b: 简写
matmul 对于高维的数据来说,保持高纬不动,低二维做矩阵乘法操作
Tensor属性统计 norma.lamp(min, max) : 小于min的都换min, 大于max的都换max
norm-p 代表p范数
norm-1 绝对值相加
norm-2 平方和相加最后开根号
norm-p 公式如上图
指定维度计算norm
argmin, argmaxprod 累乘
如果不指定dim的话会奖数据拉平成一维的再返回索引
所以最好指定维度
实际应用: 如minist手写数字识别, 喂入四张图片, 训练得到一个(4,10)的结果,10表示没种类别的概率, 通过argmax函数就可以看出每张图片的最大概率是哪种类别, 代码如下:
参数dim与keepdim这里max更好用, 它不仅返回索引,还会返回最大值
top-k 取前k个最值dim指定维度之前已经用过很多次了
keepdim的意思是保持之前的维度不变
largest=Flase 代表取前k个最小值
compare (tensor之间大小关系)kthvalue 表示第k个小的值
torch高阶操作 torch.whereeq返回01的tensor
equal返回True 或 False
torch.where(condition,x,y)
相当于遍历con 其中满足con>0.5的取xi,不满足的取yi
where的好处在于 如果cond,a,b等数据是网络训练的中间数据, torch.where的运行仍然可以在gpu上, 如果用循环的方式完成where函数的效果,就是在cpu上运行, 效率不高
gather函数也是便于操作 使得可以在gpu上运行
应用场景: 比如已知predict的结果以及原先的label表,要将其对应的结果输出, 如四张图像对应的最高概率索引为(0,2,3,5), 而其在label表中的实际含义可能是汽车,飞机,火车,自行车等含义
gather函数就是把idx与label的实际含义转化后输出



