Pytorch数据类型(CPU上的):torch.IntTensor,torch.FloatTensor,torch.ByteTensor(比较两种类型用)
Pytorch数据类型(GPU上的):torch.cuda.IntTensor,torch.cuda.FloatTensor,torch.cuda.ByteTensor(比较两种类型用)
表示string的话一般常用独热法(让结果与数值和string无关)
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)随机一个两行三列的数据
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
linspcae(0,10,steps=4) [0,10]里面等分切出四份
logspace(0,-1,steps=10) 10的0到10的-1次方里面分出十个
a[:2] [0,2) 取标号为0,1的两张图片
a[:2,:1,:,:] 取标号为0,1的两张图片的第一个通道上面的数据,后面两个:可写可不写
a[:2,1:,:,:] 取标号为0,1的两张图片的第二第三个通道上面的数据,后面两个:写可不写
a[:2,-1:,:,:] 取标号为0,1的两张图片的第三个通道上面的数据,后面两个:写可不写
一个单独“:” 表示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)两个一采
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]
view的形式不同理解的意义不同
假如view后之前的存储结构丢失,那么可能返回不回去原来的数据结构(看b)
view后如果tensor的sieze变了会报错
参数范围[-a.dim()-1,a.dim()+1) 此例子为[-5,5)
0a.dim():是在之前插入;-a.dim()-1-1:是在之后插入 只用正数范围就ok
一次只能改加一维且不能保存,要加多维几个unqueeze加点连用
不指定参数dimention为1的全部压没,参数的使用同unsqueeze
不能挤压掉不是1的维度
expand常用:不会主动的复制出去,只会在有需要的时候复制出去,速度快节约内存
原来为1的维度可以扩张成N维,但是原来不是1的扩张不了
保持不动的维度参数写-1
repeat不常用:它必须要复制数据
参数是要cope的次数
原来的位置放到要放的位置,看截图就懂了(In[98]) [b C H W]->[b H W C]
五、Broadcasting(类似于expand但是是自动的)首先要补全后面的维度才可以。后面为小维度,前面为大维度
六、合并与分割 1.cat(合并)第一个参数是列表,表示要合并的tensor;第二个参数是维度,在哪个维度上合并
除了要合并的维度数量可以不一样,其它维度的数量必须一样才能cat
第一个参数是列表,表示要合并的tensor;第二个参数是维度,在哪个维度上合并
合并以后在合并维度之前出现一个维度控制,比如统计年级总成绩(每个班相加)时使用
所有维度必须都完全一致才可以使用
根据长度来拆分,第一个参数是列表,里面元素个数表示要拆分出的块数,数值表示每个块的长度;第二个参数是维度,在哪个维度上拆分
5.chunk(拆分)根据数量来拆分,第一个参数表示要拆分出来几个,第二个参数表示要在哪个维度上拆分
七、矩阵的运算 1.加减乘除(±/,add sub mul div //整除) 此为每个对应元素相乘,不是矩阵相乘 2.矩阵相乘(torch.matmul/@)(torch.mm只能二维)eg1:
纬度变化矩阵w,第一个参数是要降维度,第二个参数是原来维度,然后转置w
eg2:
大于二维的话,只有最后两维相乘
求平方pow(2)== **2 开根sqrt()== **0.5
4.关于e的运算exp log 5.几个小函数floor()向下取整,ceil()向上取整,trunc()取整数部分,frac()取小数部分
round()四舍五入,
1范数:所有元素绝对值加和 .norm(1)实现
2范数:所有元素绝对值的平方加和再开根号 .norm(2)实现
mean均值 max最大值 min最小值 prod连乘 sum求和 argmax返回最大值的索引
argmin返回最小值的索引
min max argmax argmin都是要把数据打平成dimention为1以后再求
argmax(dim=1)可以在第二维求最大且返回索引
3.dim与keepdima.max(dim=1) 返回维度为1上的各数据的最大值及对应索引
a.argmax(dim=1)返回维度为1上的各数据的最大值的索引
a.max(dim=1,keepdim=True)返回维度为1上的各数据的最大值并且保持输出数据与原来维度一样
返回最大的k个元素及其索引(最小的话就是直接largest参数设置为false)
5.kthvalue返回第i小的数据
6.compare九、高阶操作 1.where;>=;<;<=;!=;==返回0,1(真为1,假为0)
torch.eq(a,b)返回每个位置相不相等,相等为1不相等为0
torch.equal(a,b){a,b相等返回true,不等返回false}
在GPU上加速完成循环任务
2.gather快速完成对应任务
十、梯度 1.导数、偏微分是标量;梯度是向量,向量的方向代表函数在当前点增长的方向,向量的模代表函数在当前点增长的速率 2.找函数的极小值解 3.局部最小值 4.鞍点:在同一个点,可能是对于一个变量的局部最大值,对于另一个变量的局部最小值 5.会影响梯度下降的因素(1)初始值的不同
(2)learning rate(学习率lr),一定要小
(3)局部最小值 如何逃离:增加一个惯量(惯性)
注意区分2范数与MSE的区别
2范数:所有元素绝对值的平方加和再开根号 .norm(2)实现MSE:2范数的平方
2.MSE梯度求解


