• &2_PyTorch神经网络基础


    Torch 或 Numpy

    Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor 放在 GPU 中加速运算 (前提是你有合适的 GPU), 就像 Numpy 会把 array 放在 CPU 中加速运算。

    torch和numpy互相转换

    import torch
    import numpy as np
    
    np_data = np.arange(6).reshape((2, 3))
    # numpy转换为torch
    torch_data = torch.from_numpy(np_data)
    
    # torch转换为numpy
    tensor2array = torch_data.numpy()
    print(
        '\nnumpy', np_data,
        '\ntorch', torch_data,
        '\ntensor2array', tensor2array,
    )
    
    # 运算符号
    # abs
    data = [-1, -2, 1, 2]
    tensor = torch.FloatTensor(data)  # 32bit
    print(
        '\nabs',
        '\nnumpy:', np.abs(data),
        '\ntorch:', torch.abs(tensor),
    )
    
    # sin
    print(
        '\nsin',
        '\nnumpy:', np.sin(data),
        '\ntorch:', torch.sin(tensor),
    )
    
    # mean平均值
    print(
        '\nmean',
        '\nnumpy:', np.mean(data),
        '\ntorch:', torch.mean(tensor),
    )
    
    
    # 矩阵运算
    data_t = [[1, 2], [3, 4]]
    tensor_t = torch.FloatTensor(data_t)
    
    print(
        '\n矩阵相乘',
        '\nnumpy:', np.matmul(data_t, data_t),
        '\ntorch:', torch.mm(tensor_t, tensor_t),
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    变量

    在 Torch 中的 Variable 就是一个存放会变化的值的地理位置. 里面的值会不停的变化;如果用一个 Variable 进行计算, 那返回的也是一个同类型的 Variable

    import torch
    from torch.autograd import Variable
    
    tensor = torch.FloatTensor([[1, 2], [3, 4]])
    # requires_grad是参不参与误差反向传播, 要不要计算梯度
    variable = Variable(tensor, requires_grad=True)
    
    print(tensor)
    print(variable)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    梯度

    Variable 计算时, 它在背景幕布后面一步步默默地搭建着一个庞大的系统, 叫做计算图, computational graph。
    将所有的计算步骤 (节点) 都连接起来, 最后进行误差反向传递的时候, 一次性将所有 variable 里面的修改幅度 (梯度) 都计算出来, 而 tensor 则不行。

    v_out = torch.mean(variable*variable) 就是在计算图中添加的一个计算步骤
    eg.

    v_out.backward()    # 模拟 v_out 的误差反向传递
    
    # 下面两步看不懂没关系, 只要知道 Variable 是计算图的一部分, 可以用来传递误差就好.
    # v_out = 1/4 * sum(variable*variable) 这是计算图中的 v_out 计算步骤
    # 针对于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2
    
    print(variable.grad)    # 初始 Variable 的梯度
    '''
     0.5000  1.0000
     1.5000  2.0000
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    获取Variable数据

    在运用时需要转换为tensor或numpy形式

    print(variable)     #  Variable 形式
    """
    Variable containing:
     1  2
     3  4
    [torch.FloatTensor of size 2x2]
    """
    
    print(variable.data)    # tensor 形式
    """
     1  2
     3  4
    [torch.FloatTensor of size 2x2]
    """
    
    print(variable.data.numpy())    # numpy 形式
    """
    [[ 1.  2.]
     [ 3.  4.]]
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    51单片机学习:定时器0实验
    REVV Racing 指定赛车赛事,发挥最大潜力吧!
    小满nestjs(第七章 RESTful 风格设计)
    菜鸟 CPaaS 平台微服务治理实践
    java动态代理
    基于SSM的宿舍管理系统(有报告)。Javaee项目。
    Webstorm使用解决ESlint问题合集
    Kafka基础与核心概念
    element关于form表单其他参数+upload文件 一起提交
    Android ANR问题定位 实战
  • 原文地址:https://blog.csdn.net/weixin_45427596/article/details/127123749