基本数据类型和tensor
1 import torch 2 import numpy as np 3 4 #array 和 tensor的转换 5 array = np.array([1.1,2,3]) 6 tensorArray = torch.from_numpy(array) #array对象变为tensor对象 7 array1 = tensorArray.numpy()#tensor对象变为array对象 8 print(array,' ', tensorArray, ' ', array1 ) 9 10 #torch拥有和numpy一样的处理数据的能力 11 print(torch.sin(tensorArray)) 12 print(np.ones([2,5]))#两行五列 13 print(np.ones(2))#一行两个数字 14 a = torch.randn(2, 3)#两行三列的正态分布 15 print(a) 16 print(a.size(0),a.size(1),a.shape[1])#2,3,3 0代表行,1代表对应的列数 17 print(a.shape)#torch.Size([2,3]) 18 print(a.type())#torch.FloatTensor 19 isinstance(a, torch.DoubleTensor)#false 20 isinstance(a, torch.FloatTensor)#true 21 a1 = a.cuda() 22 print(isinstance(a1,torch.FloatTensor))#false 23 print(isinstance(a1,torch.cuda.FloatTensor))#true,#torch里面的数据不同于torch.cuda里面的数据 24 25 #torch的tensor对象 26 tensor1 = torch.tensor(1) 27 print(tensor1)#tensor(1) 28 tensor2 = torch.tensor(1.2) 29 print(tensor2)#tensor(1.2000) 30 print(tensor2.shape)#torch.Size([]) 31 print(len(tensor2.shape))#0,当tensor只是一个数字的时候,他的维度是0,所以他的size是[],shape为0 32 tensor3 = torch.tensor([1.1])#一维的列表,所以输出维度是1 33 print(tensor3,tensor3.shape)#tensor([1.1000]) torch.Size([1]) 34 tensor4 = torch.FloatTensor(1)#注意此时1代表随机返回一个FloatTensor对象 35 print(tensor4)#tensor([1.1000]) 36 tensor5 = torch.FloatTensor(3)#考虑一下tensor和FloatTensor的差别 37 print(tensor5)#tensor([0.0000e+00, 0.0000e+00, 6.8645e+36])
切片
1 import torch 2 import numpy as np 3 4 #tensor和随机数 5 a = torch.rand(2, 3, 28, 28) 6 print(a, a.shape)#随机生成一个2*3*28*28的四维矩阵(可以看成声明一个四维矩阵),torch.Size([2, 3, 28, 28]) 7 #四维适合做CNN ,三维适合RNN,二维适合batch 8 print(a.numel())#4707,计算元素个数 9 print(a.dim())#4 10 print(torch.tensor(1).dim())#0, 11 print(torch.empty(1))#一维数字0,tensor([0.]) 12 print(torch.Tensor(2,3).type())#默认是torch.FloatTensor 13 print(torch.IntTensor(2,3))#2*3 14 print(torch.tensor([1,1]).type())#torch.LongTensor 15 print(torch.tensor([1.2,1]).type())#torch.FloatTensor 16 print(torch.rand(3,3))#取值范围为0到1之间 17 print(torch.rand_like(torch.rand(3,3)))#rand_like直接继承了参数的行和列,生成3*3的0到1之间的随机矩阵 18 print(torch.randint(1,10,(3,3)))#取值在1到10之间(左闭右开)大小为3*3的矩阵 19 print(torch.randn(3,3))#3*3矩阵,服从均值为0,方差为1的正态分布 20 print(torch.normal(mean=torch.full([10],0),std = torch.arange(1,0,-0.1)))#均值为0方差递减的10*1一维矩阵 21 print(torch.full([2,3],7))#2*3全为7的二维矩阵 22 print(torch.full([],7))#数字7维度0 23 print([1],7)#一维1*1矩阵元素为7 24 print(torch.logspace(0,1,steps=10))#log(10^0)到log(10^1)中间取10个数 25 26 #切片 27 a = torch.rand(4,3,28,28) 28 print(a[0].shape)#torch.Size([3,28,28]) 29 print(a[0,0].shape)#torch.Size([28, 28]) 30 print(a[0,0,2,4])#tensor(0.6186) 31 print(a[:2].shape)#torch.Size([2, 3, 28, 28]) 32 print(a[:2,1:,:,:].shape)#torch.Size([2, 2, 28, 28]) 33 print(a[:2,-1:,:,:].shape)#torch.Size([2, 1, 28, 28]) 34 35 print(a[:,:,0:28:2,0:28:2].shape)#torch.Size([4, 3, 14, 14]) 36 print(a[:,:,::2,::2].shape)#torch.Size([4, 3, 14, 14]) 37 print(a.index_select(1,torch.arange(1)).shape)#torch.Size([4, 1, 28, 28]) 38 39 x = torch.randn(3,4) 40 mask = x.ge(0.5)#比0.5大的标记为true 41 print(mask) 42 torch.masked_select(x,mask)#把为true的选择出来 43 torch.masked_select(x,mask).shape 44 45 src =torch.tensor([[4,3,5],[6,7,8]]) 46 taa = torch.take(src, torch.tensor([0,3,5]))#展平后按照位置选数据 47 print(taa)
维度变换
1 import torch 2 import numpy as np 3 #维度变化 4 #View reshape 5 a = torch.rand(4,1,28,28)#四张图片,通道数是1,长宽是28*28 6 print(a.shape)#torch.Size([4, 1, 28, 28]) 7 print(a.view(4,1*28*28).shape)#torch.Size([4, 784]),把后三维展成一行 8 print(a.view(4*28,28).shape)#torch.Size([112, 28])变成112行28列的二维数据 9 print(a.view(4*1,28,28).shape)#torch.Size([4, 28, 28])要理解对应的图片的物理意义 10 b = a.view(4,784) 11 print(b.view(4,28,28,1).shape)#torch.Size([4, 28, 28, 1]),b变成的数据不是a(一定要注意) 12 #print(a.view(4,783))#尺寸不一致会报错 13 14 #unsqueeze,增加维度,但不会影响数据的变化 15 #数据的范围是[-a.dim()-1,a.dim()+1) 16 print()#下面例子是[-5,5) 17 print(a.unsqueeze(0).shape)#torch.Size([1, 4, 1, 28, 28]) 18 print(a.unsqueeze(-1).shape)#torch.Size([4, 1, 28, 28, 1]) 19 print(a.unsqueeze(4).shape)#torch.Size([4, 1, 28, 28, 1]) 20 print(a.unsqueeze(-4).shape)#torch.Size([4, 1, 1, 28, 28]) 21 print(a.unsqueeze(-5).shape)#torch.Size([1, 4, 1, 28, 28]) 22 #print(a.unsqueeze(5).shape) 23 a = torch.tensor([1.2,2.3])#a的shape是[2] 24 print(a.unsqueeze(-1))#tensor([[1.2000], 25 #[2.3000]])变成2行一列 26 print(a.unsqueeze(0))#tensor([[1.2000, 2.3000]])#shape变成[1,2],即一行二列 27 b = torch.rand(32) 28 f = torch.rand(4,3,14,14) 29 b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)#torch.Size([1, 32, 1, 1]) 30 print(b.shape) 31 32 #维度减少 33 print() 34 print(b.shape)#torch.Size([1, 32, 1, 1]) 35 print(b.squeeze().shape)#torch.Size([32]),所有为1的被挤压 36 print(b.squeeze(-1).shape)#torch.Size([1, 32, 1]) 37 print(b.squeeze(0).shape)#torch.Size([32, 1, 1]) 38 print(b.squeeze(1).shape)#torch.Size([1, 32, 1, 1]),因为不等于1 所以没有被挤压 39 print(b.squeeze(-4).shape)#torch.Size([32, 1, 1]) 40 41 #expand扩展数据,进行数据拷贝,但不会主动复制数据,只会在需要的时候复制,推荐使用 42 print() 43 print(b.shape)#torch.Size([1, 32, 1, 1]) 44 print(b.expand(4,32,14,14).shape)#torch.Size([4, 32, 14, 14]),只能对维度是1 的进行扩展 45 print(b.expand(-1,32,-1,-1).shape)#torch.Size([1, 32, 1, 1]),其他维度为-1,这样可以进行原维度不是一的进行扩展同样大小的维度 46 print(b.expand(-1,32,-1,-4).shape)#torch.Size([1, 32, 1, -4]) -4是无意义的 47 48 #repeat表示在原来维度上拷贝多少次,而不是扩展到多少,这个方法申请了新的空间,对空间使用加大 49 print() 50 print(b.shape)#torch.Size([1, 32, 1, 1]) 51 print(b.repeat(4,32,1,1).shape)#torch.Size([4, 1024, 1, 1]),第二维表示拷贝愿来的32倍 52 print(b.repeat(4,1,1,1).shape)#torch.Size([4, 32, 1, 1]) 53 print(b.repeat(4,1,32,32).shape)#torch.Size([4, 32, 32, 32]) 54 55 #transpose实现指定维度之间的交换 56 a = torch.rand(4,3,32,32) 57 print(a.shape)#torch.Size([4, 3, 32, 32]) 58 a1 = a.transpose(1,3).contiguous().view(4,3*32*32).view(4,32,32,3).transpose(1,3) 59 print(a1.shape)#torch.Size([4, 3, 32, 32]) 60 print(torch.all(torch.eq(a,a1)))#tensor(True) 61 62 #premute实现指定维度位置交换到指定位置 63 print(a.permute(0,2,3,1).shape)#torch.Size([4, 32, 32, 3])