包括:数据类型 和 创建Tensor
Python 与PyTorch基本类型对比如下图,可以看到数据可以一一对应,不同的维度表示了不同的类型。不过应该注意的是,PyTorch中没有类键string支持的,不过可以采用编码的方式,例如One-hot来表示,如 [0,1,0,0…]. 除此之外,也可以用Embedding可以用来表示常用的语言,不多介绍。
在PyTorch中,我们只需要记住常用的类型就行,如下图所标准的类型,torch.ByteTensor用来比较两个元素是否相等,并且应该注意torch的CPU和GPU的类型是不一样的 中间要加cuda。可以用data=data.cuda()进行CPU到GPU类型的转换
我们可以使用一下方法来检验tensor的类型:
Dim 0张量:(标量)建立一个dimension(维度)为零的tensor,这种类型在loss函数中常用。可以用下图的语句得到标量的shape。
Dim 1 张量 (向量,一维),定义是需要在tensor()中加[],还可以使用FloatTensor(),但是要注意,tensor()指定的就是tensor的数据,而FloatTensor()初始参数即可向量的长度。用nump.ones(2)生成一个长度为2的长度,常用于Bias、Linear Input的数据。
Dim 2 张量 (矩阵),经常使用于带有batch的Linear Input,可以用下面方法实现:
Dim 3 张量 按下面的方法定义3阶张量,常用于 RNN.
Dim 4 张量 4阶张量,特别适合图像处理,四个参数如(2,3,28,28),代表两张图片,3个通道(RGB),高度28,宽度28的图片。
另,除此之外,已用numel()来计算整个张量的个数多少,如下图 2×3×28×28=4704,还可以用dim()来计算张量的阶数。
引入Tensor
第一种方式,通过numpy引入,直接导进来,数据不变,为什么要转呢,因为要使用Tensor在GPU上加速运算,具体实现如下图:
第二种方式,直接通过list创建,具体如下图,需要注意的是torch.tensor()和torch.FloatTensor()是不一样的,tensor的T大小写含义不同,小写代表数据直接传入,大写如果不加list[],(2,3)代表创建一个两行三列的矩阵。所以尽量少用大写的创建数据直接传入。
生成数据:
#下面三种均可生成未初始化的数据:
torch.empty()
torch.FloatTensor(d1,d2,d3) #使用前要把数据写进来
torch.IntTensor(d1,d2,d3)
#初始化方式,没有初始化的可能存在隐患,推荐使用随机初始化
torch.rand(3,3) #使用均匀的伪随机的[0,1]之间的随机数
torch.randint(1,10) #从1-10中间随机的整数(不包含10)
torch.randn(3,3) #正态分布的随机初始化,均值为0,方差为1
#还可以用torch.normal,前一个参数mean是生成长度为10的向量[0,0,0..],方差是1到0慢慢的减小,如1,0.9,0.8...
torch.normal( mean = torch.full([10],0), std=torch.arange(1,0,-0.1) )
#把所有的tensor赋值为同一个元素:
torch.full([2,3],7) #生成两行三列的矩阵,元素全为7,类型为FloatTensor
torch.full([],7) #生成一个标量,也就是维度为零的数
torch.full([1],7) #生成一个向量,一维向量
#torch支持arange,不支持range
torch.arange(0,10) #也是包前不包后
torch.arange(0,10,2) #也是包前不包后,步长为2
#linspace / logspace
torch.linspace(0,10,steps=4) #将0~10(包含头尾),平均分成4份,输出[0.0000,3.3333,6.6667,10.0000]
torch.logspace(0,-1,steps=4) #将0~-1(包含头尾)分成10份,输出结果为10的多少次方,比如第一个数据为1.000,即10的0次方,其余类推。
生成数据:
生成0、 1 、 对角线的矩阵方法,应注意eye()只能接受一个或两个参数,不能接受三个参数,一个参数代表输出一个对角方阵,两个参数输出如下:
相对于numpy中的随机打乱数据函数random.shuffle(),torch中有torch.randperm(),比如: