数据类型
pytorch是一个gpu加速库,不是一个完备的语言库,面向数据计算,面向数据计算的tensor前面表示类型,不同维度表示不同的数据类型
如果遇到处理string的情况,但是又没有自带的表示方法,就用one-hot编码或者embedding来表示
one-hot编码,如果要表示3类,就制造一个三类的向量,但是由于每一个位置,不能表现单词之间的相关性,表达一个意思如果表示较大的单词、汉字等,矩阵会变得非常稀疏,大部分都是0
embedding可以用数字的编码表示一个语言,编码的方式表示string
数据类型的识别比较常用的就是floattensor、bytetensor、inttensor,在gpu里面,数据需要加上cuda,同一个tensor部署在cpu和gpu上是不一样的
用data = data.cuda()可以把数据搬运到gpu上面,进行一个gpu上面的运用
创建tensor
import torch#根据list数据生成Tensortorch.Tensor([1,2,3,4,5,6])#根据指定形状生成Tensortorch.Tensor(2,3)#根据给定的Tensor的形状t=torch.Tensor([[1,2,3],[4,5,6]])#查看Tensor的形状,size()t.size()#shape与size()等价方式t.shape#根据已有形状创建Tensortorch.Tensor(t.size())#生成一个单位矩阵,eye(row,column),Tensortorch.eye(2,2)#自动生成全是0的矩阵torch.zeros(2,3)#根据规则生成数据,linspace(start,end,steps),从start到end均匀且分成steps份torch.linspace(1,10,4)#生成满足[0,1)均匀分布随机数torch.rand(2,3)#生成满足标准正态分布随机数torch.randn(2,3)#返回所给数据形状相同,值全为0的张量torch.zeros_like(torch.rand(2,3))
torch.tensor(从数据中推断数据类型)
torch.Tensor(默认使用FloatTensor)
import torch
t1=torch.Tensor(1)
t2=torch.tensor(1)
#t1的值tensor([3.5731e-20]),t1的数据类型torch.FloatTensor,返回大小为1的张量,随机初始化的值
#t2的值1,t2的数据类型torch.LongTensor
修改tensor形状
import torch#生成一个形状为2x3的矩阵x = torch.randn(2, 3)#查看矩阵的形状x.size()# 结果为 torch.Size([2, 3])#查看x的维度x.dim()# 结果为 2#把x变为3x2的矩阵,view(*shape),修改Tensor的shapex.view(3,2)#把x展平为1维向量y=x.view(-1)y.shape#添加一个维度z=torch.unsqueeze(y,0)#查看z的形状,返回张量的shape属性值z.size()# 结果为 torch.Size([1, 6])#计算Z的元素个数,计算Tensor的元素个数z.numel()# 结果为 6
选择操作
import torch#设置一个随机种子torch.manual_seed(100)#生成一个形状为2x3的矩阵x = torch.randn(2, 3)#根据索引获取第1行,所有数据x[0,:]#获取最后一列数据x[:,-1]#生成是否大于0的Byter张量mask=x>0#获取大于0的值torch.masked_select(x,mask)#获取非0下标,即行,列索引torch.nonzero(mask)
广播机制
import torchimport numpy as np#arrange(start,end,step),在区间star和end之间,以step为间隔生成一个序列张量A = np.arange(0, 40,10).reshape(4, 1)B = np.arange(0, 3)#把ndarray转换为TensorA1=torch.from_numpy(A) # 形状为 4x1B1=torch.from_numpy(B) # 形状为 3#Tensor自动实现广播C=A1+B1#我们可以根据广播机制,手工进行配置#根据规则1,B1需要向A1看齐,把B变为(1,3)B2=B1.unsqueeze(0) #B2 的形状为 1x3#使用expand函数重复数组,分别的4x3的矩阵A2=A1.expand(4,3)B3=B2.expand(4,3)# 然后进行相加
逐个元素操作
import torcht = torch.randn(1, 3)t1 = torch.randn(3, 1)t2 = torch.randn(1, 3)#t+0.1*(t1/t2)torch.addcdiv(t, 0.1, t1, t2)#计算sigmoid,激活函数torch.sigmoid(t)#将t限制在[0,1]之间,clamp(t,min,max)torch.clamp(t,0,1)#t+2进行就地运算t.add_(2)
归并操作
import torch#生成一个含6个数的向量,从一到十均匀分成6个数a=torch.linspace(0,10,6)#使用view方法,把a变为2x3矩阵a=a.view((2,3))#沿y轴方向累加,即dim=0,维度为0b=a.sum(dim=0)#b 的形状为 [3]#沿y轴方向累加,即dim=0,keepdim说明输出结果中是否保留维度1b=a.sum(dim=0,keepdim=True)#b 的形状为 [1,3]
比较操作
import torchx=torch.linspace(0,10,6).view(2,3)#求所有元素的最大值torch.max(x) # 结果为 10#求y轴方向的最大值,max(t,axis),指定axis额外返回下标torch.max(x,dim=0)# 结果为 [6,8,10]#求最大的2个元素,指定的axis维度上取最高的k个值,topk(t,k,axis)torch.topk(x,1,dim=0)# 结果为 [6,8,10], 对应索引为 tensor([[1, 1, 1]
矩阵操作
import torch#根据list数据生成tensora=torch.tensor([2, 3])b=torch.tensor([3, 4])#dot(t1,t2),计算张量的内积,Torch中的dot是对两个为1D张量进行点积运算torch.dot(a,b)# 运行结果为 18x=torch.randint(10,(2,3))y=torch.randint(6,(3,4))#mm(mat1,mat2),计算矩阵乘法,mm是对2D的矩阵进行点积torch.mm(x,y)x=torch.randint(10,(2,2,3))y=torch.randint(6,(2,3,4))#bmm对含batch的3D进行点积运算。torch.bmm(x,y)
numpy和pytorch的对照表
参考文献
吴茂贵《python深度学习基于pytorch》