1、创建tensor数据,随机数,运算
tensor(张量)是PyTorch的一种数据类型,可以是标量、一维向量、多维矩阵等。
上图中types可以不同(dtype不设定就是同类型),并没有严格界限,不过最好按推荐的情况去使用。
tensor.*中tensor就是带有数据的具体对象了,如下述案例中x、y等。
1、Tensor与tensor区别
import torch as t x=t.Tensor(2,3) #2行3列 x=t.Tensor([2,3]) #浮点型,输出 tensor([2., 3.]) #tensor里是已存在的数据,标量、向量、矩阵等。注意与Tensor区别 x=t.tensor([2,3]) #与元素同类型,整型 x=t.tensor([2.,3.]) #浮点型
torch.Tensor()是python类,更明确地说,是默认张量类型torch.FloatTensor()的别名,torch.Tensor([1,2])会调用Tensor类的构造函数__init__,生成单精度浮点类型的张量。
torch.tensor()是函数,返回的张量类型与元素同类型。
详解链接https://blog.csdn.net/tfcy694/article/details/85338745
2、torch.*
#未初始化的,里面是垃圾值 x=t.empty(2,3) x #类似的还有ones x=t.zeros(2,3,dtype=t.long) x #[0,1]均匀分布,randn是高斯分布 x=t.rand(2,3) x
3、torch.*_like、torch.new_*
#与x等大,类型不同(若设定) y=t.zeros_like(x,dtype=t.float) y #y与x不等大,同类型(若不设定) y=x.new_zeros(3,2) #y.type() #y.size() y
注意,如果报错,一般是因为类型不是Tensor默认的浮点型,转换下就可以了
其他总结:
import torch as t a=t.arange(0,5,2) #步长为2的等差数列,左闭右开 b=t.linspace(0,5,3) #指定间隔范围内返回均匀间隔的数字 c1=t.randn(2,3) #标准正太分布 c2=t.rand(2,3) #0-1的均匀随机分布 d=t.randperm(3) #长度为3的随机排列,从0开始 e=t.eye(2,3) #对角线为1的矩阵,行列数可以不一致 print("a",a) print("b",b) print("c1",c1) print("c2",c2) print("d",d) print("e",e)
view调整形状:
a=t.arange(0,6) print(a) b=a.view(2,-1) #调整形状,-1自动计算列数。注意b与a同一内存 print(b) c=b.view(1,1,2,-1) #2维变4维 print(c) c.size()
索引:
a=t.randn(3,4) a[0] #第1行 a[:,0] #第1列 a[0,2] #第1行3列的元素 a[0,-1] #第1行最后1列的元素 a[:2] #前2行,左闭右开,即0、1行 #都是第1行前2列,但形状不同 print(a[0,:2]) #1维 print(a[0:1,:2]) #2维,1*2 x=t.arange(0,27).view(3,3,3) #3*3*3 x[[1,2],[1,2],[2,0]] # x[[1,1,2],[2,2,0]] x[[2,1,0],[0],[1]] #x[[2,0,1],[1,0,1],[0,0,1]]
按条件选取元素
a=t.randn(3,4) a[a>1] #选取大于1的元素 a[a!=0]
tensor函数
a=t.arange(0.,6.).view(2,-1) #注意浮点型 t.cos(a) #余弦,整型会报错 t.fmod(a,3) #取余,a%3 t.pow(a,2) #次幂,a**2 t.clamp(a,min=3) #低于3的置为3 t.clamp(a,min=2,max=4) #低于2的置为2,高于4的置为4 #类似函数还有,abs、sqrt、ceil/round/floor/trunc上取整/四舍五入/下取整/只留整数部分
归并操作:
mean/sum/median/mode 均值/和/中位数/众数
norm/dist 范数/距离
std/var 标准差/方差
cumsum/cumprod 累加/累乘
以上函数大多有dim这个参数,dim设置规律如下:
对于形状(m,n,k),
dim=0,则输出形状(1,n,k)或(n,k)
dim=1,则输出形状(m,1,k)或(m,k)
dim=2,则输出形状(m,n,1)或(m,n)
有无1,取决于参数keepdim,keepdim=True则保留维度1,默认是False。
b=t.ones(2,3) print(b.sum(dim=0,keepdim=True)) #1*3,二维 print(b.sum(dim=0)) #3,注意不是1*3,一维 print(b.sum(dim=1)) #对于二维矩阵:dim=0累加列。dim=1累加行。
矩阵运算:
注意,转置会使得内存空间不连续。
a=t.linspace(0,15,6).view(2,-1) b=a.t() print(b.is_contiguous()) #转置后b的内存空间是不连续的 c=b.contiguous() #重新分配新的连续的空间c,b依然是不连续的。 print(b.is_contiguous()) print(c.is_contiguous())