PyTorch深度学习入门
2022-7-22
| 2023-11-11
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

1. Installation

2. Tensor Basics

  • tensor格式是专门为cuda准备的
  • tensor和np.ndarray 相互转换时, 变量的内存共享, eg: 使用add_, 都会变.
  • numpy格式无法放入显存
  • 选定显卡

    3. Autograd

    Pytorch autograd,backward详解
    平常都是无脑使用backward,每次看到别人的代码里使用诸如autograd.grad这种方法的时候就有点抵触,今天花了点时间了解了一下原理,写下笔记以供以后参考。 以下笔记基于Pytorch1.0 Pytorch中所有的计算其实都可以回归到Tensor上,所以有必要重新认识一下Tensor。如果我们需要计算某个Tensor的导数,那么我们需要设置其.requires_grad属性为 True。为方便说明,在本文中对于这种我们自己定义的变量,我们称之为 叶子节点(leaf nodes),而基于叶子节点得到的中间或最终变量则可称之为 结果节点。例如下面例子中的 x则是叶子节点, y 则是结果节点。 x = torch.rand(3, requires_grad=True) y = x**2 z = x + x 另外一个Tensor中通常会记录如下图中所示的属性: data: 即存储的数据信息 requires_grad: 设置为True则表示该Tensor需要求导 grad: 该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加,这个会在后面讲到。 grad_fn: 叶子节点通常为None,只有结果节点的grad_fn才有效,用于指示梯度函数是哪种类型。例如上面示例代码中的y.grad_fn= , z.grad_fn= is_leaf: 用来指示该Tensor是否是叶子节点。 *图片出处:[PyTorch Autograd](https:// towardsdatascience.com/ pytorch-autograd-understanding-the-heart-of-pytorchs-magic-2686cd94ec95 )* 有如下代码: 可以z是一个标量,当调用它的backward方法后会根据链式法则自动计算出叶子节点的梯度值。 tensor: 用于计算梯度的tensor。也就是说这两种方式是等价的:torch.autograd.backward(z) == z.backward() grad_tensors: 在计算矩阵的梯度时会用到。他其实也是一个tensor,shape一般需要和前面的tensor保持一致。 retain_graph: 通常在调用一次backward后,pytorch会自动把计算图销毁,所以要想对某个变量重复调用backward,则需要将该参数设置为True create_graph: 当设置为True的时候可以用来计算更高阶的梯度 grad_variables: 这个官方说法是grad_variables' is deprecated.
    Pytorch autograd,backward详解
    • 注意, loss必须是标量, 才能进行反向传播. 所以如果loss是向量, 需要用sum或mean将loss转换为标量.
    notion image
    • 每个epoch训练之后都要使w的grad清零:

    4. Backpropagation

    notion image
    notion image

    5. Gradient Descent With Autograd and Backpropagation

    Training Pipeline: Model, Loss, and Optimizer
    • 类里的super是干嘛的?
      • 可以调用基类里的方法, 如果调用C类的话, 会再super处自动调用A类

      6. Linear Regression

      notion image

      7. Logistic Regression

      8. Dataset

      8.1. DataLoader

      • 使用torch.utils.data.DataLoader()调用数据
        • DataLoader方法结合了数据集和取样器, 可以自动对数据进行shuffle, mini_batch, 多线程, 自定义预处理方法等功能, 非常方便.

      8.2. Dataset Transforms

      • 对数据进行预处理的时候该怎么做?
      • 特殊函数 __call__和__init__ 类似, 不同之处:
        • 在创建实例的时候__init__会被调用, __call__不会.
        • 对实例进行输入的时候, __call__才会被调用.

      9. 激活函数

      9.1. Sigmoid

      二分类问题可以用sigmoid函数(又称Logistic函数). 可以将范围的数值映射到之间. 所以可以表示为概率. 公示如下:

      9.2. Softmax

      多分类问题可以使用Softmax, 公示如下:

      9.4. Activation Functions

      常见的激活函数
      1. step function
      1. sigmoid
      1. tanh
      1. ReLU
      1. Leaky ReLU
      1. softmax

      10. Loss 损失函数

      10.1. Cross Entropy

      • 通常分类问题使用Softmax或Sigmoid函数获得每一个分类的可能的概率.
        • notion image
      • 如果使用nn.CrossEntropyLoss()就不要再网络最后加Softmax层, 但是如果使用nn.BCELoss(),网络最后要加上Sigmoid层.
        • notion image
      • 如果网络是多分类问题, 就是用nn.CrossEntropyLoss()
        • notion image
      • 如果网络是二分类问题, 就是用nn.BCELoss(), 网络最后需要使用sigmoid函数.
        • notion image

      11. Feed-Forward Neural Net

      notion image

      12. Convolutional Neural Net (CNN)

      13. Transfer Learning

      14. Tensorboard

      • 启动tensorboard
        • MAC终端连接ssh,将服务器的6006端口(或者其他没有被占用的端口都行,比如6007…)重定向到自己机器上来,在本地终端,输入以下命令:
          说明:16006:127.0.0.1代表自己机器上的16006号端口(这个端口号应该也是自己改的,只要是本地没有被占用的就可以),6006(或者其他服务器上没有被占用)是服务器上tensorboard使用的端口。username指的是服务器的用户名;remote_server_ip指的是服务器的IP。
          在服务器终端输入以下命令: 需要在工程文件夹下执行
          在本地浏览器输入以下地址便可访问: 127.0.0.1:16006/
      • code
        • show image
          notion image
          show model graph
          notion image
          show loss

      15. Save and Load Models

      • model.eval()的作用
        • 有些model中存在dropout layers或BatchNorm layers, 这些layers在evaluation的时候是不使用的, eval()函数可以关闭这些layers.
        • eval()在validation和test时都不会进行梯度下降.(无需使用torch.no_grad())
        • 如果之后还需要训练, 使用train()函数.
        • 查看model权重
           
        • 公开课
        • Deep Learning
        • PyTorch
        • 三维计算机视觉相机标定笔记深度之眼 迁移学习公开课
          • Giscus
          目录