DataWhales深入浅出Pytorch-第二章

Posted Paul-Huang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataWhales深入浅出Pytorch-第二章相关的知识,希望对你有一定的参考价值。

1. Pytorch的基本操作

1.1 建立tensor类型(2种方法)

  1. torch.tensor(data,*,dtype=)
    int类型默认是int32
    import torch
    # 创建tensor,用dtype指定类型。注意类型要匹配
    a = torch.tensor(1.0, dtype=torch.float)
    b = torch.tensor(1 , dtype=torch.long)
    c = torch.tensor(1.0 , dtype=torch.int8)
    print(a, b, c)
    
  2. torch.FloatTensor;torch.IntTensor;torch.IntTensor
    # 使用指定类型函数随机初始化指定大小的tensor
    d = torch.FloatTensor(2,3)
    e = torch.IntTensor(2)
    f = torch.IntTensor([1, 2, 3, 4])
    print(d,'\\n' ,e, '\\n', f )
    

1.2 tensor 与 numpy(array)之间的转换

  1. array to numpy
    # tensor 和 numpy array 之间的相互转换
    import numpy as np
    g = np.array([[1, 2, 3],[4, 5, 6]])
    h = torch.tensor(g)
    print(h)
    i = torch.from_numpy(g)
    print(i)
    
  2. torch to array
    # tensor 和 numpy array 之间的相互转换
    import numpy as np
    g = np.array([[1, 2, 3],[4, 5, 6]])
    h = torch.tensor(g)
    j = h.numpy()
    print(j)
    
    [[1 2 3]
     [4 5 6]]
    

1.3 tensor常见的构造函数(4个函数)

arange是左开右闭。

rand; ones; zeros; arange
# 常见的构造Tensor的函数
k = torch.rand(2,3)
l = torch.ones(2,3)
m = torch.zeros(2,3)
n = torch.arange(0,10,2)
print(k, '\\n', l, '\\n', m, '\\n', n)
tensor([[0.9137, 0.4723, 0.5141],
        [0.0574, 0.3423, 0.1671]]) 
tensor([[1., 1., 1.],
        [1., 1., 1.]]) 
tensor([[0., 0., 0.],
        [0., 0., 0.]]) 
tensor([0, 2, 4, 6, 8])

2. Tensor的基本操作

2.1 查看tensor的维度信息(2种方式)

# 查看tensor的维度信息(两种方式)
print(k.shape)
print(k.size())

2.2 tensor的运算

与矩阵计算类似。

# tensor的运算
o = torch.add(1,k)
print(o)
tensor([[1.9137, 1.4723, 1.5141],
        [1.0574, 1.3423, 1.1671]])

2.3 tensor索引

  1. numpy类似,用 中括号 \\textbf中括号 中括号,是 从第0个时开始计数 \\textbf从第0个时开始计数 从第0个时开始计数
    # 索引方式,与numpy类似
    print(o[:,1])
    print(o[0,:])
    
    tensor([1.4723, 1.3423])
    tensor([1.9137, 1.4723, 1.5141])
    

2.4 改变形状(view)

  1. 固定特定的行与列 \\textbf固定特定的行与列 固定特定的行与列

    print(o.view((3,2)))
    
    tensor([[1.9137, 1.4723],
            [1.5141, 1.0574],
            [1.3423, 1.1671]])
    
  2. 只固定行/列 \\colorblue\\textbf只固定行/列 只固定行/,另外 不确定的列/行用-1表示 \\colorblue\\textbf不确定的列/行用-1表示 不确定的列/行用-1表示,torch会 自动计算出对应的列/行 \\colorblue\\textbf自动计算出对应的列/行 自动计算出对应的列/

    print(o.view(-1,2))
    
    tensor([[1.9137, 1.4723],
            [1.5141, 1.0574],
            [1.3423, 1.1671]])
    

2.5 扩展&压缩tensor的维度:unsqueeze/squeeze

因为unsqueeze/squeeze 只对维度为1 \\colorblue\\textbf只对维度为1 只对维度为1的进行操作。

  1. 先进性扩展unsqueeze

    print(o)
    r = o.unsqueeze(1)
    print(r)
    print(r.shape)
    
    tensor([[1.2652, 1.0650, 1.5593],
            [1.7864, 1.0015, 1.4458]])
    tensor([[[1.2652, 1.0650, 1.5593]],
    
            [[1.7864, 1.0015, 1.4458]]])
    torch.Size([2, 1, 3])
    
  2. 在对tensor进行压缩squeeze 只对维度为1 \\colorblue\\textbf只对维度为1 只对维度为1的进行操作。

    s = r.squeeze(0)
    print(s)
    print(s.shape)
    
    tensor([[[1.2652, 1.0650, 1.5593]],
    
            [[1.7864, 1.0015, 1.4458]]])
    torch.Size([2, 1, 3])
    
  3. 只对维度为1 \\colorblue\\textbf只对维度为1 只对维度为1的进行操作。

    t = r.squeeze(1)
    print(t)
    print(t.shape)
    
    tensor([[1.2652, 1.0650, 1.5593],
            [1.7864, 1.0015, 1.4458]])
    torch.Size([2, 3])
    

3. 自动求导

自动求导主要用于反向传播,Tensor数据结构是实现自动求导的基础。

3.1 数学基础

  • 多元函数求导的雅克比矩阵
    J = ( ∂ y 1 ∂ x 1 ⋯ ∂ y 1 ∂ x n ⋮ ⋱ ⋮ ∂ y m ∂ x 1 ⋯ ∂ y m ∂ x n ) (1) J=\\left(\\beginarrayccc \\frac\\partial y_1\\partial x_1 & \\cdots & \\frac\\partial y_1\\partial x_n \\\\ \\vdots & \\ddots & \\vdots \\\\ \\frac\\partial y_m\\partial x_1 & \\cdots & \\frac\\partial y_m\\partial x_n \\endarray\\right)\\tag1 J=x1y1x1ymxny1xnym(1)
  • 复合函数求导的链式法则 若 h ( x ) = f ( g ( x ) ) h(x)=f(g(x)) h(x)=f(g(x)),则 h ′ ( x ) = f ′ ( g ( x ) ) ⋅ g ′ ( x ) h^\\prime(x)=f^\\prime(g(x)) \\cdot g^\\prime(x) h(x)=f(g(x))g(x)
  • 假设是一层神经网络,则 PyTorch自动求导提供了计算雅克比乘积的工具 \\textbfPyTorch自动求导提供了计算雅克比乘积的工具 PyTorch自动求导提供了计算雅克比乘积的工具