一、pytorch数据类型
1.pytorch数据类型
Pytorch数据类型(CPU上的):torch.IntTensor,torch.FloatTensor,torch.ByteTensor(比较两种类型用)
Pytorch数据类型(GPU上的):torch.cuda.IntTensor,torch.cuda.FloatTensor,torch.cuda.ByteTensor(比较两种类型用)
表示string的话一般常用独热法(让结果与数值和string无关)
2.Type check(类型检验,常用isinstance)
3.标量:torch.tensor(2.2){经常用它表示loss用}
4.标量的dimention检查
5. Dimention为1的张量(向量)
Dimention为1的张量:torch.tensor([1.1]);torch.FloatTensor(2){随机生成一个长度为2向量}{bias(神经元的输入),LinearInput常用}
6. 向量的dimention检查(同标量)
7.dimention size/shape tensor的区别
Dimention是维度用dim输出,size/shape是维度和宽度(具体形状),numel可以看数据的个数,tensor是里面的具体值,size/shape可以索引
二、创建Tensor
1.数据在numpy中了
2.数据在list中了
FloatTensor()=Tensor,tensor()里面只能放一个list
FloatTensor([ ])里面可以放list和tensor一样{别用},FloatTensor(2,3)随机一个两行三列的数据
3.未初始化数据
4.未初始化的问题:数据非常不规则,大的大,小的小
5.Tensor按设置不同可能代表FloatTensor也可能代表IntTensor等等
6.随机初始化(解决未初始化的问题)
rand():[0,1]内取,rand_like()接受tensor把tensor读出来再rand,randint(1,10)在1,10内random[1,10)
正态分布randn(3,3)三行三列,每个元素都是正态分布里面的值,torch.normal()自定义均值方差
7.把tensor全部赋值成1个值(full)
注意dimention是1与标量的区别
8.arange/range等差数列
arange(0,10) [0,10)
arrange(0,10,2) 0开始间隔为2
9.linspace/logspace
linspcae(0,10,steps=4) [0,10]里面等分切出四份
logspace(0,-1,steps=10) 10的0到10的-1次方里面分出十个
10.ones/zeros/eye eye只能接受一个或两个参数
11.randperm 协同shuffle
三、索引与切片
1.Indexing(从前往后默认)
2.select fist/last N
a[:2] [0,2) 取标号为0,1的两张图片
a[:2,:1,:,:] 取标号为0,1的两张图片的第一个通道上面的数据,后面两个:可写可不写
a[:2,1:,:,:] 取标号为0,1的两张图片的第二第三个通道上面的数据,后面两个:写可不写
a[:2,-1:,:,:] 取标号为0,1的两张图片的第三个通道上面的数据,后面两个:写可不写
3.间隔取样
一个单独“:” 表示all,“:n” 表示[0,n),“n:”表示[n,末尾),“n:m”表示[n,m)
“0:28”=“0:28:1”,“0:28:2”=“::2”(数据为28列时) “::1”=“:”
a[:,:,0:28:2,0:28:2] 两个冒号隔行采样 [0,28)两个一采
4.选择具体的索引号
Code:
In:a.shape
Out:torch.Size(4,3,28,28)
In:a.index_select(0,torch.tensor([0,2])).size() 针对第一个维度选择第一和第三个
Out:[2,3,28,28]
In:a.index_select(1,torch.tensor([1,2])).size() 针对第二个维度选择第二和第三个
Out:[4,2,28,28]
5. “…”任意多维度(根据实际情况确定)
6.select by mask
7.select by flatten index
四、维度变换
1.view/reshape( 变前后size不变 prod(a.size)=prod(a.size) )
view的形式不同理解的意义不同
假如view后之前的存储结构丢失,那么可能返回不回去原来的数据结构(看b)
view后如果tensor的sieze变了会报错
2.unsqueeze(加维度)
参数范围[-a.dim()-1,a.dim()+1) 此例子为[-5,5)
0a.dim():是在之前插入;-a.dim()-1-1:是在之后插入 只用正数范围就ok
一次只能改加一维且不能保存,要加多维几个unqueeze加点连用
3.squeeze(减维度)
不指定参数dimention为1的全部压没,参数的使用同unsqueeze
不能挤压掉不是1的维度
4.expand(维度不变扩张数据)
expand常用:不会主动的复制出去,只会在有需要的时候复制出去,速度快节约内存
原来为1的维度可以扩张成N维,但是原来不是1的扩张不了
保持不动的维度参数写-1
5.repeat(维度不变扩张数据)
repeat不常用:它必须要复制数据
参数是要cope的次数
6.转置(只能2D).t()
7.Transpose(维度交换)(不用)
8.permute(维度交换)
原来的位置放到要放的位置,看截图就懂了(In[98]) [b C H W]->[b H W C]
五、Broadcasting(类似于expand但是是自动的)
首先要补全后面的维度才可以。后面为小维度,前面为大维度
六、合并与分割
1.cat(合并)
第一个参数是列表,表示要合并的tensor;第二个参数是维度,在哪个维度上合并
除了要合并的维度数量可以不一样,其它维度的数量必须一样才能cat
2.stack(合并,但是在合并的维度前插入一个新的维度)
第一个参数是列表,表示要合并的tensor;第二个参数是维度,在哪个维度上合并
合并以后在合并维度之前出现一个维度控制,比如统计年级总成绩(每个班相加)时使用
所有维度必须都完全一致才可以使用
4.split(拆分)
根据长度来拆分,第一个参数是列表,里面元素个数表示要拆分出的块数,数值表示每个块的长度;第二个参数是维度,在哪个维度上拆分
5.chunk(拆分)
根据数量来拆分,第一个参数表示要拆分出来几个,第二个参数表示要在哪个维度上拆分
七、矩阵的运算
1.加减乘除(±/,add sub mul div //整除) 此为每个对应元素相乘,不是矩阵相乘
2.矩阵相乘(torch.matmul/@)(torch.mm只能二维)
eg1:
纬度变化矩阵w,第一个参数是要降维度,第二个参数是原来维度,然后转置w
eg2:
大于二维的话,只有最后两维相乘
3.求平方与开根
求平方pow(2)== **2 开根sqrt()== **0.5
4.关于e的运算exp log
5.几个小函数
floor()向下取整,ceil()向上取整,trunc()取整数部分,frac()取小数部分
round()四舍五入,
6.gradient clipping(用到再说)
八、属性统计
1.norm(求范数)返回tensor 不能用整型运算,要用float
1范数:所有元素绝对值加和 .norm(1)实现
2范数:所有元素绝对值的平方加和再开根号 .norm(2)实现
2.mean/sum/min/max/prod/argmax/argmin
mean均值 max最大值 min最小值 prod连乘 sum求和 argmax返回最大值的索引
argmin返回最小值的索引
min max argmax argmin都是要把数据打平成dimention为1以后再求
argmax(dim=1)可以在第二维求最大且返回索引
3.dim与keepdim
a.max(dim=1) 返回维度为1上的各数据的最大值及对应索引
a.argmax(dim=1)返回维度为1上的各数据的最大值的索引
a.max(dim=1,keepdim=True)返回维度为1上的各数据的最大值并且保持输出数据与原来维度一样
4.Top-k
返回最大的k个元素及其索引(最小的话就是直接largest参数设置为false)
5.kthvalue
返回第i小的数据
6.compare
;>=;<;<=;!=;==返回0,1(真为1,假为0)
torch.eq(a,b)返回每个位置相不相等,相等为1不相等为0
torch.equal(a,b){a,b相等返回true,不等返回false}
九、高阶操作
1.where
在GPU上加速完成循环任务
2.gather
快速完成对应任务
十、梯度
1.导数、偏微分是标量;梯度是向量,向量的方向代表函数在当前点增长的方向,向量的模代表函数在当前点增长的速率
2.找函数的极小值解
3.局部最小值
4.鞍点:在同一个点,可能是对于一个变量的局部最大值,对于另一个变量的局部最小值
5.会影响梯度下降的因素
(1)初始值的不同
(2)learning rate(学习率lr),一定要小
(3)局部最小值 如何逃离:增加一个惯量(惯性)
十一、常见函数梯度
1.线性函数
2.二次函数
3.指数函数
4.答案错了,都加个负号
十二、激活函数
1.激活函数
2.sigmoid/logistic函数
3.sigmoid/logistic函数求导(梯度)
4.Tanh函数
5.Tanh函数求导(梯度)
6.ReLU函数(Z>0时梯度永远是1,可以减少梯度离散和梯度爆炸的情况)
十三、LOSS及其梯度
1.均方差(MSE Mean Squared Error){是一种loss函数}
注意区分2范数与MSE的区别
2范数:所有元素绝对值的平方加和再开根号 .norm(2)实现
MSE:2范数的平方