zoukankan      html  css  js  c++  java
  • 有了它,一天学会 PyTorch!

    PyTorch 是一个基于 Torch 的 Python 开源机器学习库,它主要由 Facebook 的人工智能小组开发。该框架不仅能够实现强大的 GPU 加速,还支持动态的神经网络。

    因此,很多互联网的大厂在进行深度学习时,都会使用该框架,比如 Facebook、Twitter 等。

    本课程一共 15 章,从浅入深地为同学们阐述了 PyTorch 的语法结构和应用场景。

    以下为课程第一章:

    张量的定义


    介绍

    PyTorch 中的所有操作都是在张量的基础上进行的,本实验主要讲解了张量定义和相关张量操作以及 GPU 和张量之间的关系,为以后使用 PyTorch 进行深度学习打下坚实的基础。

    知识点

    • 张量的定义
    • 张量的运算
    • 张量的切片

    张量

    张量的定义

    PyTorch 中的所有内容都基于 Tensor(张量) 操作的。张量可以具有不同的尺寸,它可以是 1 维(标量),2 维(矢量),甚至 3 维(矩阵)或更高。让我们看一下如何在 PyTorch 中创建张量。

    import torch
    
    # 利用 torch.empty() 初始化指定大小的张量,如果不指定值的话,内容为随机值
    # 传入的参数为想创建的张量大小
    x = torch.empty(1) # scalar,大小为 1*1 的张量
    print(x.size())
    x = torch.empty(3) # vector, 1D,大小为 1*3 的张量
    print(x.size())
    x = torch.empty(2, 3) # matrix, 2D,大小为 2*3 的张量
    print(x.size())
    x = torch.empty(2, 2, 3) # tensor, 3D,大小为 2*2*3 的张量
    print(x.size())
    

    动手练习|如果你对课程所使用的实验楼 Notebook 在线环境并不熟悉,可以先学习  使用指南课程

    如果我们需要随机初始化值在 0-1 之间的张量(服从均匀分布),可以使用 torch.rand(size)

    # torch.rand(size)
    torch.rand(5, 3) # 初始化 5*3 大小的 0-1 之间的张量
    

    如果我们想初始化全为 1 或者全为 0 的张量,可以使用 torch.zeros(size) 和 torch.ones(size)

    x = torch.zeros(5, 3)
    y = torch.ones(5, 3)
    print(x)
    print(y)
    

    可以通过 x.size() 得到某个张量的大小:

    x.size()
    

    可以通过 x.dtype 查看 x 中值的具体类型:

    x.dtype
    

    当然,也可以在初始化时传入 dtype 参数,指定数组值的类型:

    x = torch.zeros(5, 3, dtype=torch.float16)
    print(x)
    
    # check type
    print(x.dtype)
    

    如果我们需要创建指定值的张量,我们可以使用 torch.tensor(list),list 可以为 NumPy 中的一个列表。

    #创建的张量中的值为 [5.5,3]
    x = torch.tensor([5.5, 3])
    print(x)
    print(x.size())
    

    如果想要定义的张量能够自动计算梯度(后面会说明用处),那么我们就需要将参数 requires_grad 置为 True

    torch.tensor([5.5, 3], requires_grad=True)
    

    张量的运算

    张量的加法:

    y = torch.rand(2, 2)
    x = torch.rand(2, 2)
    z = x + y
    z
    

    张量的减法:

    # 使用 - 或者 .sub 都可以表示张量减法
    z = x - y
    print(z)
    z = torch.sub(x, y)
    print(z)
    

    张量乘法(利用 * 或者 torch.mul表示):

    # 张量乘法
    z = x * y
    print(z)
    z = torch.mul(x, y)
    print(z)
    

    张量除法(使用 / 或者 torch.div 表示):

    # 张量除法
    z = x / y
    print(z)
    z = torch.div(x, y)
    print(z)
    

    张量的切片

    和 NumPy 的切片类似,如下:

    x = torch.rand(5, 3)
    print(x)
    print(x[1, 1]) # 第一个值表示第一维(即行号),第二个值表示第二维(即列号)
    print(x[:, 0]) # 所有的行中的第 1 列
    print(x[1, :]) # 第 2 行中所有的列

    张量的重塑

    重塑的意思就是将原张量的形状进行变换,即元素总个数不变的情况下改变行数和列数,使用 torch.view(size) 类似于 numpy.reshape

    x = torch.randn(4, 4)
    y = x.view(16) # 指定改变后的大小
    z = x.view(2, 8)
    print(x.size(), y.size(), z.size())
    

    当 x 的大小为 12 imes23 imes32
    12×23×32 ,而我们想把 x 转为 2 imes m
    m 的大小时,我们就必须手动算出 12 imes23 imes32
    12×23×32 的值,然后除以 2,进而得到 m 的值。
    为了避免这种情况,我们可以将 m 所在位置赋为 -1。计算机看到 -1 时,会自动使用 12 imes23 imes32 ÷ 2
    12×23×32÷2 的值来替换 -1:

    x = torch.randn(12, 23, 32)
    y = x.view(2, -1) # 将需要计算的那个维度直接用 -1 表示 12*23*32/2 的值
    x.size(), y.size()
    

    注意:一次切片中只能有一个位置值 -1 。

    NumPy 与 Tensor

    可以使用 tensor.numpy() 将 Tensor 类型的变量转为 NumPy 类型:

    a = torch.ones(5)
    print(a)
    
    b = a.numpy()
    print(b)
    print(type(b))
    

    可以使用 torch.from_numpy() 将 NumPy 类型的变量转为 Tensor:

    import numpy as np
    a = np.ones(5)
    b = torch.from_numpy(a)
    print(a)
    print(b)
    

    GPU 上创建张量

    默认情况下,所有的张量都是在 CPU 上创建的,但是你也可以使用 GPU 创建它,或者将 CPU 创建的向量移动到 GPU 中。

    当然,下面代码只有在你的电脑支持 GPU 的情况下才能运行。

    我们可以通过 torch.cuda.is_available() 命令,查看本地环境时候支持 GPU :

    torch.cuda.is_available()
    
    • True 表示支持
    • False 表示不支持

    由于 GPU 成本过高,本实验我们暂且不使用(将其用在刀刃上),所以线上环境会返回 False。

    由于本章节没有配置 GPU ,因此下面两段代码只能阐述一下了。

    将变量放到 GPU 中运行的方式有两种,如下:

    在定义时就指定参数 device

    # 如果支持 GPU 则传入字符串 cuda,否则传入 cpu
    device = torch.device("cuda")
    y = torch.ones_like(x, device=device) # 在 GPU 上直接创建张量
    

    创建张量后,将变量移动到 GPU 中

    x = torch.randn(4, 4)
    device = torch.device("cuda")
    x = x.to(device) # 将张量移动到 GPU
    

    实验总结

    本实验主要讲解了张量的定义,以及如何使用 PyTorch 完成张量的加、减、乘、除、切片和重塑等操作。在实验的最后,我们对张量进行了扩展,阐述了如何查看本地环境是否支持 GPU ,以及如何将变量定义到 GPU 之中。

    完整课程请点击链接《PyTorch 基础入门实战》,可免费试学前两节,新课上线近期优惠价哦!

  • 相关阅读:
    关于fragment点击能穿透问题
    Eclipse的PHP插件PHPEclipse安装和使用
    Eclipse的PHP插件PHPEclipse安装和使用
    解决在极光推送的时候会出现一个 JPush提示:缺少统计代码
    解决在极光推送的时候会出现一个 JPush提示:缺少统计代码
    Spring学习总结(17)——Spring AOP权限管理
    Gradle学习总结——抓重点学Gradle
    WebService学习总结(6)——WebService常用接口
    Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
    Spring学习总结(15)——Spring AOP 拦截器的基本实现
  • 原文地址:https://www.cnblogs.com/shiyanlou/p/13503878.html
Copyright © 2011-2022 走看看