pytorch张量数据基础操作

pytorch数据操作

文章目录

    • pytorch数据操作
      • 入门和数据构建
      • 张量的运算符
      • 张量的广播机制
      • 索引和切片

入门和数据构建

  1. 导包
import torch
  1. 创建一个行向量(一种特殊的张量)
    什么是张量: 张量表示由一个数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix); 具有两个轴以上的张量没有特殊的数学名称。
    行向量属于张量的一种。
x = torch.arange(12)       # 包含 0-11 12个整数
  1. 访问张量的形状
x.shape
  1. 得到张量的元素总数
x.numel()
  1. 更改张量形状
    x.reshape(高度,宽度)
X = x.reshape(3, 4)     #修改的目标张量大小必须与修改前总数相对应
X = x.reshape(-1, 4)     # 给出宽度,自动计算高度
X = x.reshape(3, -1)     # 给出高度,自动计算宽度
  1. 常规矩阵构建方法构建方法(全是0、1和随机数构建)

构建全部元素是0的矩阵张量:

torch.zeros( 3, 4)      # 构建4*3的矩阵

输出:

tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
torch.zeros( 2, 3, 4)   # 可看做创建2*(4*3)的矩阵

输出:

tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])

以此可类推:torch.zeros(3, 2, 3, 4) # 可看做创建3*(2*(4*3))的矩阵,与多维数组类似
构建全是1的矩阵:torch.ones((2, 3, 4))
构建内部元素是随机数的矩阵:torch.randn(3, 4)
***注意:***上述随机数矩阵,中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
输出示例:

tensor([[ 0.4315, -0.8804, -0.1730, -1.2925],
        [ 0.3317, -1.1386, -0.6625,  0.3001],
        [ 0.0371, -0.4246,  0.0326,  0.1565]])
  1. 使用列表构建
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

使用元组与其结果一致

张量的运算符

简单运算符的按元素运算
普通运算符
张量(tensor)的运算符运算前提条件为具备相同shape(同高同宽),将两个张量的各个元素进行一一对应的按元素运算

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算

结果:

(tensor([ 3.,  4.,  6., 10.]),
 tensor([-1.,  0.,  2.,  6.]),
 tensor([ 2.,  4.,  8., 16.]),
 tensor([0.5000, 1.0000, 2.0000, 4.0000]),
 tensor([ 1.,  4., 16., 64.]))

逻辑运算
逻辑运算在两个相同shape的张量间同样适用,按元素运算,符合置True否则置False

X == Y
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])

对张量元素进行求和
对张量中的所有元素进行求和,会产生一个单元素张量,此处要注意,最后的结果是一个单元素张量而不是一个值

X.sum()
结果:tensor(66.)

张量的连接
两个相同形状的张量可以横向连接也可以纵向连接

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

使用cat函数进行连接

纵向连接
torch.cat((X, Y), dim=0)
tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [ 2.,  1.,  4.,  3.],
         [ 1.,  2.,  3.,  4.],
         [ 4.,  3.,  2.,  1.]])

横向连接
torch.cat((X, Y), dim=1)
tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])

张量的广播机制

张量可将长度为1的轴(行或是列)进行扩展,也就是广播,前提必须为长度为1,其实也就是向量格式,这个向量可以是只有一列(宽度为1),比如shape为(3,1)或(5,1)等,又或是只有一行(高度为1),比如(1,3)或(1,5),如果两个不一样shape的张量可以通过广播变成相同shape,那么就可以进行运算符运算

t2 = torch.arange(4).reshape(1,4) + torch.arange(6).reshape(6,1)         #可广播,可运行
t2 = torch.arange(4).reshape(1,4) + torch.arange(6).reshape(1,6)         #可广播,但无法通过广播变成相同shape,不可运行
t2 = torch.arange(4).reshape(1,4) + torch.arange(8).reshape(2,4)         #可广播,可运行
t2 = torch.arange(12).reshape(3,4) + torch.arange(8).reshape(2,4)        #报错,不可广播,shape不同

索引和切片

就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。可将张量看做多维的列表。

X[-1], X[1:3]
(tensor([ 8.,  9., 10., 11.]),
 tensor([[ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]]))

X[1, 2] = 9     #向元素写入值
X[1, 2] = 9
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  9.,  7.],
        [ 8.,  9., 10., 11.]])
#用法与多维列表相同

如果我们想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。 例如,[0:2, :]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。 虽然我们讨论的是矩阵的索引,但这也适用于向量和超过2个维度的张量。

X[0:2, :] = 12
X:
tensor([[12., 12., 12., 12.],
        [12., 12., 12., 12.],
        [ 8.,  9., 10., 11.]])

内容来自:李沐老师的动手学深度学习(个人学习笔记,如有侵权请联系删除)

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