Pytorch基础(一)数据类型和创建数据
数据类型
Pytorch中的数据类型主要是tensor:
这种数据类型与python解释器本身数据类型可以对应。但str
类型有所不同。一般用一下几种方式表示字符串:
- One-hot
- Embedding
- Word2vec
- glove
在python解释器中,数据无论在cpu还是gpu数据类型是相同的。但在pytorch中cpu和gpu中的数据有所不同:
类型检验:
a = torch.randn(2, 3)
# 输出a的类型
# 法1
print(a.type()) # 'torch.FloatTensor'
# 法2
print(type(a)) # torch.FloatTensor
# 在程序中做数据类型的合法化检验可以用isinstance函数
isinstance(a, torch.FloatTensor) # True
##########放在CPU和GPU上的数据类型会不同##########
isinstance(a, torch.cuda.FloatTensor) # False
a = a.cuda()
isinstance(a, torch.cuda.FloatTensor) # True
标量(Dim 0),常用于LOSS的值:
- pytorch0.3之后的版本才有Dim0的tensor
# 标量在pytorch中是零维的tensor
a = torch.tensor(2.2)
print(a.shape) # torch.Size([])
print(len(a.shape)) # 0
print(a.size()) # torch.Size([])
Dim为1的张量,常用于Bias的值或batch为1的全连接层的输入输出:
a = torch.tensor([1.1, 2.2]) # tensor接受的这个向量具体的数据
a = torch.FloatTensor(2) # 带数据类型的,比如FloatTensor,接收的是这个向量的长度,这里长度为2,具体数据为随机初始化
# 也可从numpy中引入
a = np.ones(2)
torch.from_numpy(a)
Dim为2的张量,常用于batch size不为1的全连接层
a = torch.randn(2, 3)
print(a.shape) # torch.Size([2, 3])
print(a.shape(0)) # 2
print(a.shape(1)) # 3
Dim为3的张量,常用于RNN的input batch
a = torch.rand(1, 2, 3)
print(a.shape) # torch.Size([1, 2, 3])
list(a.shape) # [1, 2, 3]
Dim为4的张量,常用于CNN的input batch
补充:
a.numel() # 返回a所占的内存数量大小(各个维度相乘)
a.dim() # 返回a的维度
创建tensor
方法1: from numpy
a = np.array([2.2, 3.3]) # 在np中创建一个张量
torch.from_numpy(a) # 将这个array转化为torch中的tensor(从numpy导入的float会变成double)
方法2:from list
a = torch.tensor([2.2, 3.3]) # 直接将list放入tensor中
# 注意,torch.tensor与torch.Tensor不同
# torch.tensor接收的是张量的data
# torch.Tensor接收的是张量的shape,在特殊情况下也会接收data
a = torch.Tensor(2, 3) # 这种格式是创建两行三列的一个二维张量,随机初始化
a = torch.Tensor([2,3]) # 这种格式是创建一个数据为[2,3]的张量。
# 为了避免混淆,一般只用torch.tensor接收具体数据,只用torch.Tensor/torch.FloatTensor接受shape
torch.tensor
或torch.Tensor
默认创建的数据类型是Float Tensor- 可以使用
torch.set_default_tensor_type(torch.DoubleTensor)
将默认类型改变为double(增强学习中常用DoubleTensor)
方法3:uninitialized tensor
- 未初始化的tensor一定要在后续填入数据,否则可能在运行时造成麻烦(直接喂给网络容易出现nan或inf)
a = torch.empty(2, 3) # 接收shape
# 下面这种接收shape的方式也是会创建未初始化的张量
a = torch.IntTensor(2, 3)
a = torch.Tensor(2, 3)
方法4:随机初始化
# 范围为[min,max)的均匀采样的随机张量
a = torch.rand(2, 3) # 接收shape,均匀采样随机创建0到1之间的数据(不包括1)
b = torch.rand_like(a) # 以rand的方式创建一个shape与a相同的tensor
a = troch.randint(1, 10, [2, 3]) # 整型的随机张量,均匀采样范围1到10(不包括10),shape为[2,3]
#范围为[min,max)的正态分布的随机张量
a = torch.randn(3, 3) # 均值为0标准差为1的正态分布随机量,shape为[3,3]
方法5:将张量中的元素全部赋值为一个数值
a = torch.full([2 ,3], 4) # shape为[2,3]的张量,数据全部赋值为4
方法6:等差数列
a = torch.arange(0, 6, 2) # 返回tensor([0,2,4]),前两个参数是范围,范围包括左边不包括右边,最后一个参数是公差
# 返回tensor([0.,1.,2.,3.])。前两个参数是范围,范围左右两边都能包括,最后一个参数是等分的数量
a = torch.linspace(0, 3, steps = 4)
# 生成10^1到10^2的,5个数构成的等比数列
a = torch.logspace(1,2,base = 10, steps = 5)
补充
a = torch.ones(2, 3) # 全部是1的张量
a = torch.zeros(2, 3) # 全部是0的张量
a = torch.eye(2, 3) # 单位矩阵
# 将两组有对应关系的tensor进行打乱,但不改变对应关系,这时候可以用torch.randperm()
a = torch.tensor([[100,99,98], [61,62,63]])
b = troch.tensor([[1, 2, 3], [6, 7, 8]])
idx = torch.tensor([1, 0])
a = a[idx]
b = b[idx]