pytorch中基本数据是一个tensor对象,类似于numpy中的ndarray。下面列举一些张量的简单使用方法。
#创建未初始化的张量
x1 = torch.Tensor(3,2)
#创建随机的张量
x2 = torch.rand(3,2)
#创建全为1的张量
x3 = torch.ones(3,2)
#创建全为0的张量
x4 = torch.zeros(3,2)
#四个结果如下
tensor([[1.3527e+13, 5.8294e-43],
[1.3153e+13, 5.8294e-43],
[0.0000e+00, 0.0000e+00]])
tensor([[0.9475, 0.3748],
[0.1038, 0.6830],
[0.6550, 0.1775]])
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
调用shape属性可以确定其形状
shape = x1.shape
print(shape[0])
print(shape[1])
#返回结果
3
2
x = torch.ones(3,2)
#tensor([[1., 1.],
[1., 1.],
[1., 1.]])
y = torch.ones(3,2)+2
#tensor([[3., 3.],
[3., 3.],
[3., 3.]])
z=torch.ones(2,1)
#tensor([[1.],
[1.]])
result = x*y@z
#tensor([[6.],
[6.],
[6.]])
其中符号 * 是点乘,指大小一样的tensor的相同位置进行乘法操作,@符号和matmul函数一样是矩阵乘积。
x = torch.ones(2,3,4)
print(x)
x1 = x[1,:,:]
print(x1)
x2 = x[1,1,1]
print(x2)
#结果:
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor(1.)
解释:创建了一个234的三维矩阵,x可以理解为2个34的二维矩阵,然后x2可以理解为选取了其中一个34的矩阵(第二个),x3表示选取了一个点
x = torch.rand(2,3)
print(x)
x1 = x[:,1:]
print(x1)
x2 = x[:-1,:]
print(x2)
#结果
tensor([[0.8884, 0.4229, 0.2552],
[0.5975, 0.2205, 0.8982]])
tensor([[0.4229, 0.2552],
[0.2205, 0.8982]])
tensor([[0.8884, 0.4229, 0.2552]])
解释:x是二维的随机张量,x1选取的是x的两行和从1开始的列(python是从0开始的),x2选取的是从第0行开始到-1行结束的值,-1表示倒数第一行,因为python是左闭右开的,所以选取了第一行。
不懂的可以看下下面这些操作,了解的可以跳过。
a='python'
b=a[::-1]
print(b) #nohtyp
c=a[::-2]
print(c) #nhy
#从后往前数的话,最后一个位置为-1
d=a[:-1] #从位置0到位置-1之前的数
print(d) #pytho
e=a[:-2] #从位置0到位置-2之前的数
print(e) #pyth
拼接操作,按行拼接和按列拼接
x = torch.rand(2,3)
print(x)
x1 = torch.cat((x,x))#x1等于torch.cat((x,x),dim=0)
print(x1)
x2 = torch.cat((x,x), dim=1)
print(x2)
#结果
tensor([[0.0787, 0.1899, 0.0054],
[0.8835, 0.0500, 0.5895]])
tensor([[0.0787, 0.1899, 0.0054],
[0.8835, 0.0500, 0.5895],
[0.0787, 0.1899, 0.0054],
[0.8835, 0.0500, 0.5895]])
tensor([[0.0787, 0.1899, 0.0054, 0.0787, 0.1899, 0.0054],
[0.8835, 0.0500, 0.5895, 0.8835, 0.0500, 0.5895]])
stack和split
x = torch.rand(2,3)
print(x)
x1 = torch.stack((x,x), dim=0)
print(x1)
x2 = x.split(split_size=2,dim=1)
print(x2)
#结果
tensor([[0.2641, 0.9174, 0.3424],
[0.7403, 0.8882, 0.6797]])
tensor([[[0.2641, 0.9174, 0.3424],
[0.7403, 0.8882, 0.6797]],
[[0.2641, 0.9174, 0.3424],
[0.7403, 0.8882, 0.6797]]])
(tensor([[0.2641, 0.9174],
[0.7403, 0.8882]]), tensor([[0.3424],
[0.6797]]))
squeeze与unsqueeze
x = torch.rand(3,2,1)
print(x)
x1 = x.squeeze()
print(x1)
x2 = torch.rand(3)
print(x2)
x3 = x2.unsqueeze(0)
print(x3)
#结果
tensor([[[0.4308],
[0.3849]],
[[0.8603],
[0.6125]],
[[0.7925],
[0.6389]]])
tensor([[0.4308, 0.3849],
[0.8603, 0.6125],
[0.7925, 0.6389]])
tensor([0.1343, 0.3331, 0.7231])
tensor([[0.1343, 0.3331, 0.7231]])