torch.Tensor(3,2)
返回一个尺寸为3*2的未初始化的张量
torch.Tensor(data)
返回一个torch.FloatTensor
类型的data
torch.tensor(3, 2)
报错,tensor函数参数必须为一个基本数据类型或引用数据类型数据如整型、浮点型或列表
torch.tensor(data)
返回一个给定数值的张量
区别:
torch.tensor(data, dtype=None, device=None, requires_grad=False) → Tensor
Constructs a tensor with data.
示例代码:
data1 = torch.Tensor([2, 3])
data2 = torch.Tensor(2, 3)
data3 = torch.tensor([2, 3])
print(data1)
print(data2)
print(data3)
# 运行结果
tensor([2., 3.])
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([2, 3])
rand()
函数用于创建一个指定尺寸的随机矩阵
ones()
函数用于创建一个指定尺寸的元素全为1的矩阵
zeros()
函数用于创建一个指定尺寸的元素全为0的矩阵
示例代码
data4 = torch.rand(3, 2)
data5 = torch.ones(3, 2)
data6 = torch.zeros(3, 2)
print(data4)
print(data5)
print(data6)
# 运行结果
tensor([[0.6134, 0.3304],
[0.6353, 0.1127],
[0.9612, 0.8309]])
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
以下表格列出了PyTorch支持的数据类型及其创建函数
数据类型 | CPU张量 | GPU张量 |
---|---|---|
32位浮点型 | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点型 | torch.DouleTensor | torch.cuda.FloatTensor |
16位浮点型 | torch.HalfTensor | torch.cuda.HalfTensor |
8位整型(无符号) | torch.ByteTensor | torch.cuda.ByteTensor |
8位整型(有符号) | torch.CharTensor | torch.cuda.CharTensor |
16位整型(有符号) | torch.ShortTensor | torch.cuda.ShortTensor |
32位整型(有符号) | torch.IntTensor | torch.cuda.IntTensor |
64位整型(有符号) | torch.LongTensor | torch.cuda.LongTensor |
为了PyTorch API更加接近于NumpyAPI 以取得近似于Numpy数据处理包的强大功能,PyTorch在0.2版本后引入shape属性,用户不但可以像以前一样通过size()函数获取张量尺寸,也可以通过shape属性直接获取。
示例代码:
data2 = torch.Tensor(2, 3)
print(data2.size())
print(data2.shape)
# 运行结果
torch.Size([2, 3])
torch.Size([2, 3])
有时我们需要对已有张量进行一些变形,比如,三维张量平展成一维张量, 或者交换矩阵的某两个维度(转置)
view()
函数可对原张量进行任意形式的变形(前提是张量的参数个数保持不变)transpose()
函数可对原张量任意两个维度进行转置(交换)flatten()
函数可以指定任意连续维度进行“平铺”示例代码
import torch
data1 = torch.rand(2, 3, 4, 5)
data2 = data1.view(2, 4, 3, 5)
data3 = data1.view(-1) # -1 让python自己计算张量长度,按照整体长度不变的原则进行填充
data4 = data1.view(-1, 10)
print(data1[0, :, :, 0]) # 输出第2,3维张量
print(data2[0, :, :, 0])
print(data3.size())
print(data4.size())
data5 = data1.transpose(1, 2)
print(data5[0, :, :, 0])
print(data2.size())
print(data5.size())
# 运行结果
tensor([[0.6149, 0.0561, 0.6514, 0.8010],
[0.4063, 0.5112, 0.1584, 0.5826],
[0.0581, 0.5838, 0.8439, 0.1180]])
tensor([[0.6149, 0.0561, 0.6514],
[0.8010, 0.4063, 0.5112],
[0.1584, 0.5826, 0.0581],
[0.5838, 0.8439, 0.1180]])
torch.Size([120])
torch.Size([12, 10])
tensor([[0.6149, 0.4063, 0.0581],
[0.0561, 0.5112, 0.5838],
[0.6514, 0.1584, 0.8439],
[0.8010, 0.5826, 0.1180]])
torch.Size([2, 4, 3, 5])
torch.Size([2, 4, 3, 5])
# flatten
data1 = torch.rand(2, 3, 4, 5)
data2 = data1.flatten(1)
data3 = data1.flatten(1, 2)
print(data2.size())
print(data3.size())
# 运行结果:
torch.Size([2, 60])
torch.Size([2, 12, 5])
可以发现,view()的变形是将原张量按顺序填入新的尺寸张量,这容易改变原张量的数学意义。transpose()有点类似于“转置”,一定程度上保留了原张量的数学意义。
此外,注意到view(2, 4, 3, 5)最后和transpose(1, 2)取得了同样的维度结果,但是两者的数值结果是完全不一样的,原因正如第一点所述。
示例代码:
data10 = data6 + 5
data11 = data10 - 3
data12 = data10 * data11
data13 = torch.tensor([[1.],
[1.]])
data14 = data12 @ data13 # 注意* 和 @ 的区别
data15 = data12.matmul(data13)
print(data10)
print(data11)
print(data12)
print(data14)
# 运行结果
tensor([[5., 5.],
[5., 5.],
[5., 5.]])
tensor([[2., 2.],
[2., 2.],
[2., 2.]])
tensor([[10., 10.],
[10., 10.],
[10., 10.]])
tensor([[20.],
[20.],
[20.]])
tensor([[20.],
[20.],
[20.]])
split()
函数和chunk()函数用于在指定维度下按指定步长拆分张量cat()
函数用于连接只有一个维度大小不同的两个张量stack()
用于给张量添加新的维度,要求两个张量除了待添加的维度不同,其余维度相同sequeeze()
称为“挤压”,用于删除尺寸为1的维度,不仅可以用于匹配维度还可以大大减少运算时间unsequeeze()
称为“反挤压”,用于给张量增加一个虚拟的维度,并且与satck不同是,unsequeeze增加的虚拟维度不参与张量运算示例代码:
import torch
data1 = torch.rand(3, 2)
# 拆分
data2 = data1.split(1, 0) # 返回一个张量元组
print("data1: ", data1)
print("data2: ", data2)
print("data2[0]: ", data2[0])
# 连接
data3 = torch.ones(1, 2)
data4 = torch.cat((data1, data3), 0)
print("data3: ", data3)
print("data4: ", data4)
# 拼接
data5 = torch.ones(3, 2)
data6 = torch.stack((data1, data5), 0)
print("data5: ", data5)
print("data6: ", data6)
data7 = data1.unsqueeze(0)
print("data7: ", data7)
print("data1.size: ", data1.size())
print("data7.size: ", data7.size())
data8 = data7.squeeze()
print("data8.size: ", data8.shape)
# 运行结果
data1: tensor([[0.3280, 0.8911],
[0.4691, 0.9570],
[0.5510, 0.6604]])
data2: (tensor([[0.3280, 0.8911]]), tensor([[0.4691, 0.9570]]), tensor([[0.5510, 0.6604]]))
data2[0]: tensor([[0.3280, 0.8911]])
data3: tensor([[1., 1.]])
data4: tensor([[0.3280, 0.8911],
[0.4691, 0.9570],
[0.5510, 0.6604],
[1.0000, 1.0000]])
data5: tensor([[1., 1.],
[1., 1.],
[1., 1.]])
data6: tensor([[[0.3280, 0.8911],
[0.4691, 0.9570],
[0.5510, 0.6604]],
[[1.0000, 1.0000],
[1.0000, 1.0000],
[1.0000, 1.0000]]])
data7: tensor([[[0.3280, 0.8911],
[0.4691, 0.9570],
[0.5510, 0.6604]]])
data1.size: torch.Size([3, 2])
data7.size: torch.Size([1, 3, 2])
data8.size: torch.Size([3, 2])