分类
编程
创建时间
Sep 13, 2024 01:01 PM
状态
已完成🤠

PYTORCH 入门


💡
🤗欢迎大家来到我的博客🎉
首先,感谢 up 主 @我是土堆 讲授的 pytorch 入门课程,真的真的通俗易懂😭!!
如果大家想要学习机器学习/深度学习的课程(比如李沐大神的课程),建议大家先学学小土堆的 pytorch,一定会对你有所帮助的。本笔记是依照小土堆课程顺序写的,方便大家进行复习,希望大家能够在评论区多多讨论,一起进步!!
建议大家使用电脑进行阅读。

PYTORCH 环境配置

有关 pytorch 的配置方法可以看这篇博客 Anaconda + pytorch/tensorflow 的配置

PYTORCH 介绍

🔗 Relevant Information

 

💡 Key Words

  1. pytorch 的发展
    1. torch
    2. torch 7
    3. pytorch(+CAFFE2)
  1. 同类框架
    1. Theano
    2. TensorFlow
    3. Keras
    4. Pytorch
  1. pytorch 和 tensorflow 的区别
    1. 动态图优先——pytorch
    2. 静态图优先——tensorflow
 

📝 Class Notes

pytorch 的发展
notion image
在 2002 年的时候,torch 基于 lua 这个小众语言诞生,在 2011 年更新至 torch 7 ,2016 年时 facebook 在torch 7 的基础上开发了 pytorch。pytorch 早期的版本 (0.1 ~ 0.3)无法直接在 0.4 及以后的版本运行,需要将代码稍微调整后才可以,在 18 年后,pytorch 发布了正式的版本 1.0 并与 CAFFE2 强强联合。
 
同类框架
notion image
theano 是加拿大人开发的一个框架,但现在已经停止开发了,在theano 的基础上,google 开发了 tensorflow,并收购了 keras。keras 是一个高级的 api 规范,本身可以不做任何的实现,可以使用底层的计算库来实现,如 tensorflow 可以通过 tf.keras 调用 keras 的一部分功能。
keras 官方的实现也可以调用 tensorflow 的后端和 mxnet 的后端,快速完成网络的搭建。但由于是一个高级的接口,因此效率是一个很大的问题。
Facebook 阵营的主要是 caffe 1 和 caffe 2,目前主推的是 pytorch。
mxnet 和 caffe 都是由华人进行开发的,mxnet 目前成为了亚马逊的官方框架。
microsoft 阵营的是 cntk,比较小众。
chainer 是日本的一家公司研发的框架,而 pytorch 借鉴了 chainer 的 api 规范。
notion image
pytorch 和 tensorflow
pytorch 和 tensorflow 是目前主推的两个框架,他们的区别在于是静态图优先(tensorflow)还是动态图优先(pytorch)。
动态图优先:
notion image
动态图优先符合我们的思维习惯,在每完成一个计算过程的时候都会有一个符号链接的过程,同时也会得到该过程的计算结果。我们可以在运行的时候动态改变公式。
静态图优先:
notion image
静态图优先指的是先完成静态图的创建,但却并不会同时得到一个计算结果,在完成了图的创建后,需要另外的计算过程来计算输出结果。如上图,要想计算 x * y 的结果,就需要先创建一个乘法的过程,然后通过 run 代码代入数据计算结果。图的创建过程和图的运行过程是分离的。静态图中的静态体现在图一旦创建好,在 run 过程中是无法改变的。在具体的 run 的过程里,我们只能控制输入,运算过程是无法进行控制的。
 

 

PYTORCH 的使用(小土堆)

🔗 Relevant Information


📝 Class Notes

pytorch 的两大法宝函数
dir() 函数和 help() 函数。
dir 函数能够让我们打开“工具箱”,并取出其中的物件,如果对“工具箱”中物件的使用方法不清楚,则可以通过 help() 函数理解。
dir 函数能够让我们打开“工具箱”,并取出其中的物件,如果对“工具箱”中物件的使用方法不清楚,则可以通过 help() 函数理解。
notion image
python 文件、控制台和 jupyter notebook 的区别
notion image
python 中路径的表示方法
python 中主要有以下三种路径的表示方法:
  1. 使用双反斜杠:在路径中使用 \\ 来表示反斜杠,Python 会识别为单个反斜杠。
    1. 使用原始字符串:通过在字符串前加 r,Python 会将字符串当作“原始”文本,不进行转义处理。
      1. 使用正斜杠 /:Python 支持在路径中使用正斜杠,即使在 Windows 上也可以正确处理。
        使用正斜杠 / 或原始字符串 r"" 通常是推荐的做法,能避免转义字符带来的潜在问题。
        数据加载(dataloader
        数据加载需要了解两个概念 dataset dataloader(在后面的课程中会介绍)。
        dataset 指的是数据集,在数据集中,会存储着数据的编号,数据本身和数据的标签。
        dataloader 是用于载入数据集的工具,数据不一定是一个一个进入的,可以是几个数据作为一组进入到处理器中。
        数据集保存的两种方式:
        第一种方式:
        通过不同的文件夹将数据的标签和数据本身分开储存。
        通过不同的文件夹将数据的标签和数据本身分开储存。
        第二种方式:
        文件夹的名称即为 label,文件夹内是数据和编号。
        文件夹的名称即为 label,文件夹内是数据和编号。
        导入 Dataset 模块
        from torch.utils.data import Dataset 通过这段代码导入 Dataset 类。
        图片数据处理库 —— PIL
        PIL 是指 Python Imaging Library,是一个用来打开、操作和保存许多不同格式图像文件的库。PIL 提供了许多图像处理的功能,如图像裁剪、旋转、颜色调整、滤镜等。
        需要注意的是,目前PIL 已经被 Pillow 所取代,Pillow 原先是 PIL 的一个分支,目前仍在积极维护和开发。因此我们可以直接安装 Pillow,可以通过下面的代码安装:
        虽然安装的时候安装的是 pillow 库,但是在实际使用的时候仍然可以使用下面的代码将 PIL 作为源,并导入其他模块,也就是说 Pillow 具有与 PIL 相同的功能。
        这条代码的意思是从 PIL 库中导入 Image 模块。Image 模块是 PIL 中最主要的模块,用于处理图像。
        下面是一个简单的例子,展示如何使用 PIL 打开和显示一张图像:
        在这个例子中,Image.open("example.jpg") 用于打开名为 example.jpg 的图像文件,然后 image.show() 用于显示这张图像。
        os 库的介绍
        os 即 operating system。
        import os 语句用于在 Python 中导入 os 模块。os 模块提供了非常丰富的方法,用于处理文件和目录等操作系统相关的任务。

        os 模块介绍

        os 模块是 Python 的标准库模块之一,提供了许多与操作系统交互的功能。主要用于文件和目录操作、环境变量操作、进程管理等。以下是一些常用的功能:
        1. 文件和目录操作
            • os.getcwd():获取当前工作目录。 # get current work directory
            • os.chdir(path):改变当前工作目录。 # change directory
            • os.listdir(path):列出指定目录中的文件和子目录。 # list directory
            • os.mkdir(path):创建目录。 # make directory
            • os.makedirs(path):递归创建目录。 # make directories
            • os.remove(path):删除文件。 # remove (file)
            • os.rmdir(path):删除目录。 # remove directory
            • os.rename(src, dst):重命名文件或目录。 # rename (file)
        1. 路径操作
            • os.path.basename(path):获取路径中的文件名部分。
            • os.path.dirname(path):获取路径中的目录部分。
            • os.path.join(path, *paths):将多个路径组合后返回。
            • os.path.split(path):将路径分割为目录和文件名。
            • os.path.exists(path):判断路径是否存在。
            • os.path.isabs(path):判断是否为绝对路径。
            • os.path.isfile(path):判断是否为文件。
            • os.path.isdir(path):判断是否为目录。
        1. 环境变量
            • os.getenv(key):获取环境变量的值。
            • os.putenv(key, value):设置环境变量的值。
            • os.environ:获取所有环境变量的字典。
        1. 进程管理
            • os.system(command):运行系统命令。
            • os.popen(command):执行命令并获取输出。
            • os.getpid():获取当前进程 ID。
            • os.getppid():获取父进程 ID。

        示例代码

        下面是一些使用 os 模块的示例代码:
        通过这些示例,你可以了解如何使用 os 模块执行常见的操作系统任务。os 模块的强大功能使得 Python 在跨平台开发中具有很大的优势。
        示例
        实战练习
        题目
        在土堆老师提供的“练手数据集”中, train 文件夹里的 图像 和 label 是分开存放的,图像存放在 ants_image 和 bees_image 两个文件夹中;label 存放在 ants_label 和 bees_label 两个文件夹中,文件夹的名字本身并不是标签,图像的标签存放在 txt 文本文档中,文本文档的名字就是图像的名字。需要通过代码来显示对应的图像。
        notion image
        notion image
        求解过程
         
        如何快速了解一个类或函数
        比如,我想要查看 dataset 的作用和使用方法,有三种方式可以查看 Dataset 类,第一种是使用法宝函数 help(Dataset),第二种方式是使用 Dataset?? ,第二种方式生成的文档如下图所示:
        notion image
        图中一些符号的解释
        在 Python 的文档中,特别是使用 Sphinx 文档生成器时,会使用一些特殊符号来进行标注和链接。以下是对这些符号的解释:

        1. :xx: 符号

        这些符号用于标注和链接不同类型的文档元素。
        • :class::用于表示类。例如,:class:Dataset 表示一个类。
        • :meth::用于表示方法。例如,:meth:__getitem__ 表示一个方法。
        • :func::用于表示函数。
        • :attr::用于表示属性。
        • :mod::用于表示模块。
        这些标注符号的目的是在生成文档时创建超链接,方便读者点击查看相关的详细信息。

        2. ..xx:: 符号

        这些符号用于插入特殊的文档元素,比如注释、代码块等。
        • .. note:::用于插入一个注释块,通常用于给出额外的信息或提示。例如:
          • .. warning:::用于插入一个警告块,通常用于强调需要注意的事项。
          • .. code-block:::用于插入代码块。例如:

            3. ~ 符号

            在文档中,~ 符号用于简化模块路径显示。通常用于缩短全路径,只显示最后的名称部分。例如:
            • ~torch.utils.data.DataLoader:在生成的文档中,只显示 DataLoader,但仍然链接到 torch.utils.data.DataLoader 的完整路径。

            4. → 符号

            __getitem__(self, index) -> +T_co__getitem__ 方法接受一个索引,并返回一个类型为 T_co 的数据。T_co 是泛型类型。
            第三种方法是直接在 pycharm 内部进行跳转,如下图所示:
            上面是关于 dataset 这个类的查找方式
            上面是关于 dataset 这个类的查找方式
            第一个蓝框表示函数的作用; 第二个篮框是参数的说明; 第三个篮框是官方给出的函数使用示例。
            如上图 gif 所示,按下 ctrl 键的同时鼠标左键点击想要了解的类或函数,进入相应类或函数的帮助文档,在帮助文档中有对类或函数很详细的介绍,有些方法会有代码示例帮助我们理解,我们主要关注函数的输入和输出,函数具体需要哪些参数,哪些是默认参数以及函数的返回值。
            同时,对于 torch 相关函数的更多信息可以通过 pytorch.org 这个网站(可能需要科学才能打开)的 DOCS 页面获取。
            Tensorboard 的使用
            Tensorboard 是用于机器学习的一个常用的库,主要是用于记录机器学习的学习过程并通过图像方式表达出来。
            图像数据格式的一些理解
            在计算机中,图像可以以 HWC、CHW 等格式存储,H 和 W 分别表示图像的高和宽, C 表示图像的通道,如果图像以 RGB 的形式存储,那么通道数有 3 个,RGB 分别表示 红色、绿色和蓝色;如果是灰度图像,那么通道数就只有 1 个。
            一般来说,图像的分辨率指的就是图像的 W*H,图像 W 表示图像的宽度是多少个像素点,H 表示图像的高度是多少个像素点。比如图像的分辨率是 512*300,那么图像的宽就是 512 个像素,高是 300 个像素。
            图像的 H 和 W 可以表示所有的像素点的个数,每个像素点都有三个通道的值,三个通道的值都确定后,R、G、B 的强度才能够知道。
            对于灰度图像而言,像素值的大小表示的是该像素点亮度的大小,0 表示是黑色,255 表示白色。
            Transform 的使用
            Transform 主要是用于图像变换的操作,可以对图像进行裁剪、标准化等,在使用前需要先将图像转换成张量的形式。 Transform 属于 torchvision 这个库,torchvision 是专门用于计算机视觉的库,所谓的计算机视觉就是让计算机能够读取图像和视频数据并进行相关的处理,如图像识别、图像分类等。
            一些常用的方法的介绍:
             
            数据集的下载和使用
            pytorch 数据集相关内容的了解如上图所示。
            pytorch 数据集相关内容的了解如上图所示。
            notion image
            数据的训练集和测试集可以通过 pycharm 进行下载。
            Dataloader
            前向传播算法
            前向传播,顾名思义,就是将数据向前传播,将数据输入到网络中处理后得到输出。
            前向传播算法原理代码示例
            卷积层操作
            卷积操作的内部原理
            notion image
            reshape 方法的具体介绍

            函数功能

            reshape 函数的主要功能是将输入的张量 input 重新调整为指定的 shape 形状。当可能的时候,返回的张量将是输入张量的一个视图(view),否则将是一个拷贝。

            参数

            • input (Tensor): 需要重新调整形状的张量。
            • shape (tuple of int): 新的形状。形状可以包含一个维度为 1,此时该维度的大小将从剩余的维度和元素数量推断出来。

            视图与拷贝

            • 视图:如果输入张量是连续的(contiguous)且其步幅(strides)是兼容的,reshape 可以返回一个视图,这意味着数据不会被复制,输出的张量和输入的张量共享数据。
            • 拷贝:在某些情况下,reshape 需要复制数据以实现新的形状。

            什么是“步幅是兼容的“?

            步幅兼容:如果一个张量在内存中的排列方式(即步幅)允许它被重新解释为另一个形状,而不需要重新排列数据,这样的步幅就是兼容的。在这种情况下,重塑后的张量可以是原张量的一个视图(view),这意味着没有实际的数据拷贝,重塑操作是非常高效的。 人性化的理解方式:假设通过积木搭建了一个正方形的相框,从正面看,它是正方形的,但是从另一个角度看,它就是一条直线,也就是说,不同视角下看待数据会有不同的表现形式。数据在内存条中的存放方式是连续的,如果我定义了一个 3x3 的矩阵,那么在内存条中的长度就是 9 个字节,因此我也可以将它看作是 1 x 9 的或是 9 x 1 的矩阵,因为它们在内存条中的存在形式相同。因此,reshape 就是在保证数据在内存条中的存在形式不变的情况下,改变我们观察的视角。
            卷积的应用
            最大池化
            最大池化(Max Pooling)是一种常用的下采样(subsampling)或降采样(downsampling)操作,主要用于卷积神经网络(Convolutional Neural Networks, CNNs)中。它通过取局部区域内的最大值来减少特征图的尺寸,同时保留重要的特征,从而达到降低计算量和防止过拟合的目的。
            notion image
            与卷积操作类似,池化操作也是通过一个核来扫描数据的,这个核称为 池化核,只不过,在扫描的过程中,不是在池化核内部做相乘求和的操作,而是在池化核的内部取出数据的最大值作为该区域的主要特征。
            最大池化主要用到的类是 MaxPool2d(→针对二维图像数据),其中需要着重注意一下 ceil_mode 参数和 dilation 参数。
            关于 ceil_mode 参数:
            • ceil_mode=False(默认):使用向下取整(floor)来计算输出特征图的尺寸。这意味着如果池化窗口在输入特征图上滑动时,最后一部分窗口可能会覆盖不完全的区域,直接忽略这部分数据。
            • ceil_mode=True:使用向上取整(ceil)来计算输出特征图的尺寸。这意味着即使池化窗口在输入特征图上滑动时,最后一部分窗口覆盖的区域不完整,也会将其考虑在内,并进行池化操作。
            关于 dilation 参数:
            notion image
            dilation 表示的是池化核内部各个元素之间的 stride,也就是 步幅。
            最大池化的代码:
            非线性
            非线性过程的解释
            ReLU,全称为 Rectified Linear Unit(修正线性单元),是一种在神经网络中常用的激活函数。ReLU 的数学表达式是 ,即当输入值小于 0 时输出为 0,当输入值大于等于0时输出为输入值本身。
            ReLU 的名字来源
            ReLU 的名字来源于它的数学表达式中的“修正”操作(Rectified)和它是一个线性单元(Linear Unit)。“修正”指的是输入值小于0时被修正为 0,而“线性单元”指的是输入值大于等于 0 时保持线性关系。
            ReLU 在神经网络中的作用
            在神经网络中,ReLU 的主要作用是引入非线性。非线性激活函数使神经网络能够学习和表示复杂的模式和特征。如果没有非线性激活函数,神经网络无论有多少层,最终都会退化为一个线性模型,无法解决复杂的任务。
            ReLU 具有以下优点:
            1. 计算简单:ReLU 的计算非常简单,只需要判断输入是否大于0。
            1. 缓解梯度消失问题:相比于传统的 Sigmoid 和 Tanh 激活函数,ReLU 能有效缓解梯度消失问题,因为它的梯度在正区间是常数1。
            ReLU 与卷积和池化的先后关系
            在卷积神经网络(CNN)中,通常的操作顺序是:
            1. 卷积层(Convolutional Layer):应用卷积核对输入进行卷积操作,提取特征。
            1. 激活层(Activation Layer):在卷积操作之后,通常会应用 ReLU 激活函数对卷积层的输出进行非线性变换。
            1. 池化层(Pooling Layer):对激活后的输出进行下采样,减少数据量,提取主要特征,常见的池化方法有最大池化(Max Pooling)和平均池化(Average Pooling)。
            这个顺序通常是卷积 -> 激活(ReLU)-> 池化。这种结构可以重复多次,形成深层的卷积神经网络。在具体实现时,也可以根据需求调整顺序或组合方式。
            通过这种结构,卷积层负责提取特征,激活层引入非线性,池化层则负责下采样,减少计算量和模型复杂度,使得网络能够在复杂的任务中表现良好。
            非线性的代码示例
            线性层
            在神经网络中,线性层(Linear Layer)通常是指全连接层(Fully Connected Layer)。其主要作用是对输入数据进行线性变换,即执行矩阵乘法和加法操作。具体来说,对于输入向量 和权重矩阵 ,线性层的输出是 ,其中 是偏置向量。
            线性层的作用
            1. 特征变换: 线性层可以将输入特征映射到一个新的特征空间,这对特征提取和表示学习非常重要。
            1. 维度变化: 通过指定不同的输入和输出维度,线性层可以调整数据的维度。
            1. 参数学习: 线性层中的权重和偏置是可训练参数,可以通过反向传播算法进行优化。
            卷积神经网络(CNN)中各个层的作用
            1. 卷积层 (Convolutional Layer):
                • 对输入进行卷积操作,提取局部特征。
                • 例如:torch.nn.Conv2d
            1. 非线性激活函数 (Non-linear Activation Function):
                • 引入非线性,使得网络能够表示更复杂的函数。
                • 例如:torch.nn.ReLU
            1. 池化层 (Pooling Layer):
                • 对特征图进行降采样,减少尺寸和计算量,防止过拟合。
                • 例如:torch.nn.MaxPool2d
            重复上述三步多次,逐步提取高层次特征。
            1. 展平层 (Flatten Layer):
                • 将多维的特征图展开为一维向量,以便输入到全连接层。
                • 例如:torch.flatten()
            1. 线性层 (Linear Layer):
                • 对特征进行线性变换,通常用于分类或回归任务的最后几层。
                • 例如:torch.nn.Linear
            1. 输出层 (Output Layer):
                • 最后一层通常是一个线性层,后接适当的激活函数(如 softmax 用于分类)。
                • 例如:torch.nn.Softmax
            线性层的代码示例:
             
            简单的过程实战
            将前面的卷积、池化、线性等操作结合起来。
            操作整合后的代码:
            下面的示例是参照这张图的过程进行的:
            notion image
            下面代码中 conv2d 的 padding 参数的值:
            结合反向传播算法和损失函数
            反向传播算法就是利用损失函数反向更新训练的参数,由于与原来的训练过程是相反的,因此称为反向传播。
            优化器
            与反向传播算法结合起来优化每一步的梯度值。基本过程是先定义一个优化器,然后在循环的内部对上一步的梯度值清零,利用反向传播算法计算参数,利用优化器对下一步的参数进行优化。
            现有网络模型的使用和修改
            有时候,我们需要利用 pytorch 官网提供的数据集进行训练,或是将他们的数据集进行修改。
            模型的训练和加载
            神经网络完整的训练套路
            以下代码参照的是这张图片:
            notion image
            使用 GPU 对网络进行训练
            ⚠️
            如果电脑没有 GPU 的配置或是配置过低,可以使用谷歌的 google colab 来进行训练(网站链接:

            GPU 训练模式一:利用 .cuda() 方法
            想要使用 GPU 对网络进行训练,需要利用 .cuda() 方法,需要将 网络模型、数据(输入,标注)和损失函数 都转换为GPU 训练的模式。
            GPU 训练模式 1 代码

            GPU 训练模式二:利用 .to(device) 方法
            首先需要定义设备,之后也需要将 网络模型、数据(输入,标注)和损失函数 连接到设备上。
            GPU 训练模式 2 代码
             
            完整的模型验证套路(demo)
            本部分是从网上搜索一张飞机的图片,并利用前面保存的模型对飞行图片进行预测,返回输出值。
            传入的图片为:
            notion image
             

            我的博客链接:博客链接
            如果本篇内容对你有用,能否『请我吃根棒棒糖🍭 』🤠…
             
            Loading...
            df
            df
            我的学习笔记
            最新发布
            2025 · 电子系统综合设计
            2025-6-12
            阅读论文前
            2025-5-30
            Anaconda + Pytorch/Tensorflow 的安装教程
            2025-5-30
            遥感数字图像处理笔记
            2025-5-30
            区块链的应用与技术笔记
            2025-5-30
            模拟电子技术笔记
            2025-5-30
            公告
            🎉欢迎来到我的笔记分享网站🎉
            『 👉🏾 我的所有博客 👈🏾 』
            『❤️‍🔥请我吃根棒棒糖🍭❤️‍🔥』
            笔记内容可用于知识检索和复习!
            ¬_¬ 善用【Ctrl+K & Ctrl+F
            笔记仅供学习交流,
            请在引用时注明来源🫂
            笔记疏漏之处望大家在评论区指出!
            尽量用电脑来查看,显示效果最好🥰
            希望和大家一起进步!!🥳