4. PyTorch中的数据类型—张量

本文中所有代码的前提是调用PyTorch包

import torch

1. 张量的理解

标量:0维张量;向量:1维张量;矩阵:2维张量。扩展至高维数据,统称为张量。

2. PyTorch的张量创建

2.1 列表类型转变为张量类型

torch.tensor([1,2,3,4])

2.2 PyTorch包内置方法创建

torch.rand(l,m,n)  # [l,m,n]维的向量,内部元素在[0,1]区间分布
torch.randn(l,m,n) # [l,m,n]维的向量,内部元素在[0,1]区间服从标准正态分布
torch.zeros(l,m,n) # [l,m,n]维的向量,内部元素全是0
torch.ones(l,m,n)  # [l,m,n]维的向量,内部元素全是1
torch.eye(n)       # [n,n]维的单位矩阵

2.3 通过已有张量来创建新的张量

已知t为一个张量,那么

torch.zeros_like(t)   # 生成一个形状和t张量相同,但内部元素全是0的新张量
torch.ones_like(t)    # 生成一个形状和t张量相同,但内部元素全是1的新张量
torch.rand_like(t)    # 生成一个形状和t张量相同,但内部元素在[0,1]区间分布的新张量
torch.randn_like(t)   # 生成一个形状和t张量相同,但内部元素在[0,1]区间标准正态分布的新张量

3. 张量的常用操作

3.1 查看张量的维度

t.shape     #  返回张量t的维度[l,m,n]
t.size()    #  返回张量t的维度[l,m,n]

3.2 索引与切片—— 与列表类似

正向索引从0开始,逆向索引从-1开始;

t[i,j,k]     # 截取第(i,j,k)的元素
t[i][j][k]   # 截取第(i,j,k)的元素

3.3 张量的运算

3.3.1 张量中的加法

a + b             # 张量中对应位置的元素相加
torch.add(a,b)    # 张量中对应位置的元素相加

3.3.2 张量中的减法

a - b             # 张量中对应位置的元素相减
torch.sub(a,b)    # 张量中对应位置的元素相减

3.3.3 张量中的乘法

a * b             # 对应位置的元素相乘
orch.mul(a,b)     # 对应位置的元素相乘
a @ b             # 矩阵乘法
torch.mm(a,b)     # 矩阵乘法
torch.matmul(a,b) # 矩阵乘法

3.3.3 张量中的除法

a / b            # 对应位置的元素相除
torch.div(a,b)   # 矩阵除法

3.4 张量的变换

已知t是一个[l,m,n]维的张量,那么

3.4.1 张量的维度互换

t.transpose(index1,index2)   #  将[l,m,n]索引index1和index2的维度互换
t.t()                        #  矩阵的转置(只适用2位矩阵张量)
>>> import torch
>>> t = torch.randn(1,2,3)
>>> t.transpose(0,2).shape
torch.Size([3, 2, 1])
>>> t = torch.randn(1,2)
>>> t.transpose(0,1).shape
torch.Size([2, 1])
>>> t.t().shape
torch.Size([2, 1])

3.4.2 张量的拼接

torch.cat([a,b],dim=index) #将a,b两个张量按[l,m,n]中索引index维度来拼接在一起
>>> a = torch.zeros([2,3])
>>> b = torch.ones([2,3])
>>> torch.cat([a,b],dim=0)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [1., 1., 1.],
        [1., 1., 1.]])
>>> torch.cat([a,b],dim=1)
tensor([[0., 0., 0., 1., 1., 1.],
        [0., 0., 0., 1., 1., 1.]])

3.4.3 张量的维度变换

t.view(l*m,n)     #  将3维[l,m,n]转换为2维[l*m,n]
t.reshape(l*m,n)  #  将3维[l,m,n]转换为2维[l*m,n]
>>> t = torch.randn(2,3,4)
>>> t
tensor([[[ 1.0335,  1.0147, -1.3945,  1.6790],
         [-3.3516,  0.2724, -0.2280, -0.6264],
         [ 1.2656, -0.2339,  0.1558, -1.0012]],

        [[ 0.9168, -0.6912, -0.7835,  1.2702],
         [ 0.0952,  0.1173, -0.2743, -0.4733],
         [ 0.6820, -1.2333, -0.5377, -1.6138]]])
>>> t.view(6,4)
tensor([[ 1.0335,  1.0147, -1.3945,  1.6790],
        [-3.3516,  0.2724, -0.2280, -0.6264],
        [ 1.2656, -0.2339,  0.1558, -1.0012],
        [ 0.9168, -0.6912, -0.7835,  1.2702],
        [ 0.0952,  0.1173, -0.2743, -0.4733],
        [ 0.6820, -1.2333, -0.5377, -1.6138]])
>>> t.reshape(6,4)
tensor([[ 1.0335,  1.0147, -1.3945,  1.6790],
        [-3.3516,  0.2724, -0.2280, -0.6264],
        [ 1.2656, -0.2339,  0.1558, -1.0012],
        [ 0.9168, -0.6912, -0.7835,  1.2702],
        [ 0.0952,  0.1173, -0.2743, -0.4733],
        [ 0.6820, -1.2333, -0.5377, -1.6138]])

 3.4.4 张量维度的增加

t.unsqueeze(index) # 在列表[l,m,n]索引index的位置增加维度
>>> t = torch.randn(1,2,3)
>>> t0 =  t.unsqueeze(0)
>>> t1 =  t.unsqueeze(1)
>>> t2 =  t.unsqueeze(2)
>>> t.shape
torch.Size([1, 2, 3])
>>> t0.shape
torch.Size([1, 1, 2, 3])
>>> t1.shape
torch.Size([1, 1, 2, 3])
>>> t2.shape
torch.Size([1, 2, 1, 3])

注:index看成索引,也可以存在逆向索引。

3.4.5 张量维度的删除

t.squeeze(index) # 在列表[l,m,n]索引index的维度,但该维度的size必须为1.
>>> t = torch.randn(1,2,3)
>>> t0 = t.squeeze(0)
>>> t1 = t.squeeze(1)
>>> t2 = t.squeeze(2)
>>> t.shape
torch.Size([1, 2, 3])
>>> t0.shape
torch.Size([2, 3])
>>> t1.shape
torch.Size([1, 2, 3])
>>> t2.shape
torch.Size([1, 2, 3])

3.4.6 张量维度的扩展

t.expand(i,j,k) # 对[l,m,n]中size=1的维度变换对应的[i,j,k]

 若i,j,k为-1,表示该维度的size不变。

>>> t = torch.randn(1,2,3,1)
>>> t.expand(2,-1,-1,3).shape
torch.Size([2, 2, 3, 3])

 3.4.7 张量的分割

t.split(i, dim=index)  # 将张量按照i的指定长度在index维进行拆分
t.chunk(i, dim=index)  # 将张量在index维进行拆分成i个张量
>>> t = torch.randn(4,2)
>>> t1,t2 = t.split(2,dim=0)
>>> t1
tensor([[-0.0380, -0.8659],
        [ 0.0554, -0.9546]])
>>> t2
tensor([[-0.0887, -0.5898],
        [-0.0952, -0.5161]])
>>> t3,t4 = t.chunk(2,dim=0)
>>> t3
tensor([[-0.0380, -0.8659],
        [ 0.0554, -0.9546]])
>>> t4
tensor([[-0.0887, -0.5898],
        [-0.0952, -0.5161]])

你可能感兴趣的:(图神经网络算法学习笔记,pytorch,深度学习,机器学习)