ML实践(Pytorch篇)

password
icon
AI summary
type
status
date
slug
summary
tags
category
Property
Oct 22, 2024 07:34 AM
本笔记参考土堆&李沐&吴恩达的视频
 
100 配置版本101 Pytorch安装102 Python两大法宝103 Pytorch加载数据1.Pytorch加载数据2.常用数据集3.路径直接加载数据4.Dataset加载数据104 Tensorboard使用1. Tensorboard使用2.Tensorboard写日志3.Tensorboard读日志4.Tensorboard读图片105 Transforms使用1. Transforms用途2. Transforms该如何使用2.1 transforms.Totensor()使用2.3 需要Tensor数据类型的原因106 torchvision使用1. torchvision数据集介绍2.torchvision数据集使用3.查看CIFAR10数据集内容4. Tensorboard查看内容107 Dataloader使用1. Dataloarder使用2. Tensorboard展示3. Dataloader多轮次108 nn.Module模块使用1. nn.Module模块使用2. super(Myclass, self)._init_()3. forward函数109 卷积原理1. 卷积原理2. 步幅、填充原理110 卷积层1. 卷积原理2. 搭建卷积层3. 卷积层处理图片4. Tensorboard显示111 最大池化层1. 池化层原理2. 池化层处理数据3. 池化层处理图片112 非线性激活1. 非线性激活2. Tensorboard显示113 线性层及其他层1. 神经网络2. 线性拉平3. 线性层114 搭建小实战和Sequential使用4 Sequential神经网络115 损失函数与反向传播1. L1loss损失函数2. MSE损失函数3. 交叉熵损失函数4. 数据集计算损失函数5 反向传播116 优化器1. 神经网络优化一轮2. 神经网络优化多轮117 网络模型使用及修改1. 下载网络模型2. 网络模型添加3. 网络模型修改118 网络模型保存与读取1. 方式12. 方式2119 完整模型训练套路打印准确率120 利用GPU训练121 完整的模型验证套路122 开源项目1. parser.add_argument201 机器学习的基本任务209 模型选择,过拟合、欠拟合1. 模型选择2. 过拟合、欠拟合3. 多项式解释欠拟合、过拟合211 丢弃法Dropout212 数值稳定性,模型初始化213 Kaggle房价预测214 Pytorch神经网络基础215 使用购买GPU216 卷积层217 卷积层里的填充和步幅218 卷积层里的多输入多输出219 池化层220 经典神经网络LeNet221 深度卷积神经网络AlexNet222 使用块的网络VGG223 网络中的网络NiN224 合并行连接的网络GooLeNet225 批量归一化226 残差神经网络ResNet227 深度学习硬件228 深度学习硬件TPU和其他229 单机多卡并行230 多GPU训练实现231 分布式训练232 数据增广233 微调234 实战Kaggle比赛图像分类CIFAR10235 实战Kaggle比赛狗的品种识别236 物体检测和数据集237 锚框238 树叶分类竞赛技术总结239 物体检测算法R-CNN、SSD、YOLOSSDYOLO240 SSD实现241 语义分割和数据集242 转置卷积243 RNN244 全连接卷积和神经网络245 样式迁移246 序列模型247 文本预处理248 语言模型250 变分自动编码器参考

100 配置版本

Pycharm中可以在设置中设置python解释器为conda,通过 conda create -n xxx python=xxx 新建相应的环境进行配置

101 Pytorch安装

激活conda环境后运行如下代码,可安装对应版本的

102 Python两大法宝

  • dir():打开,看见里面有多少分区,多少工具
  • help():说明书

103 Pytorch加载数据

1.Pytorch加载数据

① Pytorch中加载数据需要Dataset、Dataloader。
  • Dataset提供一种方式去获取每个数据及其对应的label,告诉我们总共有多少个数据。
  • Dataloader为后面的网络提供不同的数据形式,它将一批一批数据进行一个打包。

2.常用数据集

① 常用的第一种数据形式,文件夹的名称是它的label。
② 常用的第二种形式,文本名称为图片名称,文本中的内容为对应的label。

3.路径直接加载数据

4.Dataset加载数据

示例代码

104 Tensorboard使用

1. Tensorboard使用

① Tensorboad 可以用来查看loss是否按照我们预想的变化,或者查看训练到某一步输出的图像是什么样。
首先安装tensorboard pip install tensorboard

2.Tensorboard写日志

3.Tensorboard读日志

① 常规用法
② 为避免多人使用端口导致冲突,也可以在后面加上后缀,使得端口独立,tensorboard --logdir=xxx --port=6008
💡
若是在实验室的服务器上运行,firefox浏览器界面拉跨,可在xshell配置隧道,转为在本地查看
notion image

4.Tensorboard读图片

105 Transforms使用

1. Transforms用途

① Transforms当成工具箱的话,里面的class就是不同的工具。例如像totensor、resize这些工具。
② Transforms拿一些特定格式的图片,经过Transforms里面的工具,获得我们想要的结果。

2. Transforms该如何使用

2.1 transforms.Totensor()使用

2.3 需要Tensor数据类型的原因

① Tensor有一些属性,比如反向传播、梯度等属性,它包装了神经网络需要的一些属性。

106 torchvision使用

1. torchvision数据集介绍

① torchvision中有很多数据集,当我们写代码时指定相应的数据集指定一些参数,它就可以自行下载。
② CIFAR-10数据集包含60000张32×32的彩色图片,一共10个类别,其中50000张训练图片,10000张测试图片。

2.torchvision数据集使用

① 在 Anaconda 终端里面,激活py3.6.3环境,再跳转到该项目的路径下。
② 运行python。导入torchvision包,输入train_set = torchvision.datasets.CIFAR10(root="./dataset",train=True,download=True)命令,即下载数据集到到该文件夹下。

3.查看CIFAR10数据集内容

4. Tensorboard查看内容

107 Dataloader使用

1. Dataloarder使用

① Dataset只是去告诉我们程序,我们的数据集在什么位置,数据集第一个数据给它一个索引0,它对应的是哪一个数据。
② Dataloader就是把数据加载到神经网络当中,Dataloader所做的事就是每次从Dataset中取数据,至于怎么取,是由Dataloader中的参数决定的。

2. Tensorboard展示

3. Dataloader多轮次

notion image

108 nn.Module模块使用

1. nn.Module模块使用

① nn.Module是对所有神经网络提供一个基本的类。
② 我们的神经网络是继承nn.Module这个类,即nn.Module为父类,nn.Module为所有神经网络提供一个模板,对其中一些我们不满意的部分进行修改。

2. super(Myclass, self)._init_()

① 简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的—__init__()的那些东西。
② Myclass类继承nn.Module,super(Myclass, self)._init_()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。
super().__init__()来通过初始化父类属性以初始化自身继承了父类的那部分属性;这样一来,作为nn.Module的子类就无需再初始化那一部分属性了,只需初始化新加的元素。
④ 子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。

3. forward函数

① 使用pytorch的时候,不需要手动调用forward函数,只要在实例化一个对象中传入对应的参数就可以自动调用 forward 函数。
② 因为 PyTorch 中的大部分方法都继承自 torch.nn.Module,而 torch.nn.Module 的__call__(self)函数中会返回 forward()函数 的结果,因此PyTroch中的 forward()函数等于是被嵌套在了__call__(self)函数中;因此forward()函数可以直接通过类名被调用,而不用实例化对象。
 

109 卷积原理

1. 卷积原理

① 卷积核不停的在原图上进行滑动,对应元素相乘再相加。
② 下图为每次滑动移动1格,然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据,如下图右所示。
notion image
notion image
 

2. 步幅、填充原理

① 步幅:卷积核经过输入特征图的采样间隔。设置步幅的目的:希望减小输入参数的数目,减少计算量。
② 填充:在输入特征图的每一边添加一定数目的行列。设置填充的目的:希望每个输入方块都能作为卷积窗口的中心,或使得输出的特征图的长、宽 = 输入的特征图的长、宽。
③ 一个尺寸 a * a 的特征图,经过 b * b 的卷积层,步幅(stride)= c,填充(padding)= d,若d等于0,也就是不填充,输出的特征图的尺寸 =(a-b)/ c+1;若d不等于0,也就是填充,输出的特征图的尺寸 =(a+2d-b)/ c+1。
 
notion image

110 卷积层

1. 卷积原理

① Conv1d代表一维卷积,Conv2d代表二维卷积,Conv3d代表三维卷积。
② kernel_size在训练过程中不断调整,定义为3就是3 * 3的卷积核,实际我们在训练神经网络过程中其实就是对kernel_size不断调整。
③ 可以根据输入的参数获得输出的情况,如下图所示。
notion image

2. 搭建卷积层

 

3. 卷积层处理图片

4. Tensorboard显示

111 最大池化层

1. 池化层原理

① 最大池化层有时也被称为下采样。
② dilation为空洞卷积,如下图所示。
③ Ceil_model为当超出区域时,只取最左上角的值。
④ 池化使得数据由5 * 5 变为3 * 3,甚至1 * 1的,这样导致计算的参数会大大减小。例如1080P的电影经过池化的转为720P的电影、或360P的电影后,同样的网速下,视频更为不卡。
notion image
 

2. 池化层处理数据

3. 池化层处理图片

 

112 非线性激活

1. 非线性激活

① inplace为原地替换,若为True,则变量的值被替换。若为False,则会创建一个新变量,将函数处理后的值赋值给新变量,原始变量的值没有修改。

2. Tensorboard显示

 

113 线性层及其他层

1. 神经网络

① 神经网络训练的就是函数系数 与d。

2. 线性拉平

3. 线性层

114 搭建小实战和Sequential使用

notion image
 
notion image

4 Sequential神经网络

 

115 损失函数与反向传播

1. L1loss损失函数

2. MSE损失函数

一般MSE用于回归,crossentropy用于分类

3. 交叉熵损失函数

4. 数据集计算损失函数

5 反向传播

116 优化器

① 损失函数调用backward方法,就可以调用损失函数的反向传播方法,就可以求出我们需要调节的梯度,我们就可以利用我们的优化器就可以根据梯度对参数进行调整,达到整体误差降低的目的。
② 梯度要清零,如果梯度不清零会导致梯度累加。

1. 神经网络优化一轮

2. 神经网络优化多轮

 

117 网络模型使用及修改

1. 下载网络模型

vgg16的out_features=1000

2. 网络模型添加

3. 网络模型修改

118 网络模型保存与读取

1. 方式1

2. 方式2

119 完整模型训练套路

打印准确率

120 利用GPU训练

① GPU训练主要有三部分,网络模型、数据(输入、标注)、损失函数,这三部分放到GPU上。
② 电脑上有两个显卡时,可以用指定cuda:0、cuda:1。

121 完整的模型验证套路

122 开源项目

1. parser.add_argument

① 像运行Tensorboar一样,在Terminal终端,可以命令运行.py文件。
② 如下图所示,Terminal终端运行.py文件时,--变量 后面的值是给变量进行赋值,赋值后再在.py文件中运行。例如 ./datasets/maps 是给前面的dataroot赋值,maps_cyclegan是给前面的name赋值,cycle_gan是给前面的model赋值。
③ required表示必须需要指定参数,default表示有默认的参数了。Terminal终端命令语句,如果不对该默认变量新写入,直接调用默认的参数;如果对该默认变量新写入,则默认的参数被新写入的参数覆盖。
notion image

201 机器学习的基本任务

notion image
监督学习和无监督学习,GPT的回答:
监督学习和无监督学习是机器学习的两种主要类型。
  1. 监督学习(Supervised Learning):
      • 在监督学习中,我们有一个标记的数据集,也就是说,我们知道输入数据和对应的输出(也称为目标或标签)。
      • 目标是训练一个模型,使其能够根据输入预测出正确的输出。
      • 一旦模型被训练,我们就可以用它来预测新的、未标记的数据的输出。
      • 例如,一个常见的监督学习任务是垃圾邮件过滤。在这个任务中,我们有一组电子邮件和它们是否为垃圾邮件的标签。我们的目标是训练一个模型,使其能够根据电子邮件的内容预测出它是否为垃圾邮件。
  1. 无监督学习(Unsupervised Learning):
      • 在无监督学习中,我们只有输入数据,没有对应的输出或标签。
      • 目标是训练一个模型,使其能够发现输入数据中的模式或结构。
      • 无监督学习通常用于聚类、降维或者异常检测等任务。
      • 例如,一个常见的无监督学习任务是客户细分。在这个任务中,我们有一组关于客户的数据,如年龄、性别、购买历史等,但我们没有关于客户属于哪个细分市场的标签。我们的目标是训练一个模型,使其能够根据客户的数据将他们分组,这样相似的客户会被分到同一组。
总的来说,监督学习和无监督学习的主要区别在于我们是否有目标或标签。在监督学习中,我们知道正确的答案,并试图训练一个模型来预测这些答案;而在无监督学习中,我们试图让模型自己发现数据中的模式或结构。
强化学习,GPT的回答:
强化学习是机器学习的一种类型,它的目标是训练一个智能体(agent),使其能够在一个环境中通过执行一系列的动作来最大化某种奖励信号。
以下是强化学习的一些关键概念:
  1. 智能体(Agent):智能体是进行决策的实体,它可以观察环境,基于观察结果选择动作,并接收奖励。
  1. 环境(Environment):环境是智能体所处的世界,它根据智能体的动作改变状态,并给出奖励。
  1. 状态(State):状态是环境在某一时刻的描述,它是智能体决策的基础。
  1. 动作(Action):动作是智能体在某一状态下可以选择执行的操作。
  1. 奖励(Reward):奖励是环境对智能体动作的反馈,它是一个信号,用于指导智能体的学习。智能体的目标是最大化总奖励。
  1. 策略(Policy):策略是智能体选择动作的规则,它可以是确定性的,也可以是随机的。
强化学习的过程通常涉及到探索(exploration)和利用(exploitation)的权衡。探索是指智能体尝试新的动作以发现可能的好策略,利用是指智能体使用已知的最佳策略以获得最大的奖励。
强化学习的应用非常广泛,包括游戏、机器人、自动驾驶、资源管理等许多领域。例如,DeepMind 的 AlphaGo 就是通过强化学习训练出来的,它在围棋比赛中击败了世界冠军。
notion image
notion image

209 模型选择,过拟合、欠拟合

1. 模型选择

 
notion image

2. 过拟合、欠拟合

 
notion image

3. 多项式解释欠拟合、过拟合

① 使用以下三阶多项式来生成训练和测试数据的标签:
② 这个式子只是一个三次多项式,并不是哪个函数的泰勒展开。

211 丢弃法Dropout

在深度学习中,Dropout 是一种常用的正则化技术,用于防止模型过拟合。过拟合是指模型在训练数据上表现得很好,但在未见过的测试数据上表现得很差,这通常是因为模型过于复杂,学习到了训练数据中的噪声而非真实的模式。
Dropout 的工作原理是在训练过程中随机地“丢弃”(即,设置为0)神经网络中的一部分神经元。这意味着在每次训练迭代中,网络的一部分都会被随机地关闭,因此每次迭代的网络都是原始网络的一个子集。这样可以防止神经元之间的复杂共适应关系,使得每个神经元都能够独立地学习到有用的特征。
Dropout 的比例(即,每次迭代中被丢弃的神经元的比例)是一个可以调整的参数。如果 Dropout 的比例过高,可能会导致模型欠拟合;如果 Dropout 的比例过低,可能无法有效地防止过拟合。
需要注意的是,Dropout 只在训练过程中使用,在测试或者预测过程中,所有的神经元都会被保留,但是它们的输出会被乘以 Dropout 的比例,以保持网络的总体输出不变。
总的来说,Dropout 是一种简单而有效的正则化技术,可以帮助我们训练出更健壮的深度学习模型。

212 数值稳定性,模型初始化

合理的权重初始值和激活函数的选取可以提升数值稳定性

213 Kaggle房价预测

214 Pytorch神经网络基础

自定义模型和层都是通过继承nn.Module,自定义层时使用nn.Parameter使得参数加上梯度

215 使用购买GPU

确认GPU
查看GPU使用情况的精简指令

216 卷积层

  • 图像的平移不变性使我们以相同的方式处理局部图像,而不在乎它的位置。
  • 局部性意味着计算相应的隐藏表示只需一小部分局部图像像素。
  • 在图像处理中,卷积层通常比全连接层需要更少的参数,但依旧获得高效用的模型。
  • 卷积神经网络(CNN)是一类特殊的神经网络,它可以包含多个卷积层。
  • 多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征
 
notion image
  • 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置。
  • 我们可以设计一个卷积核来检测图像的边缘。
  • 我们可以从数据中学习卷积核的参数。
  • 学习卷积核时,无论用严格卷积运算或互相关运算,卷积层的输出不会受太大影响。
  • 当需要检测输入特征中更广区域时,我们可以构建一个更深的卷积网络。

217 卷积层里的填充和步幅

  • 填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
  • 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的1/n(n是一个大于1的整数)。
  • 填充和步幅可用于有效地调整数据的维度。
这段Python代码使用了PyTorch库,主要演示了如何使用nn.Conv2d类进行二维卷积操作。以下是一些关键点:
  • comp_conv2d函数接受一个nn.Conv2d对象和一个输入张量X,然后对X进行卷积操作,并返回卷积后的结果。在进行卷积操作之前,它会先将X的形状改变为(1, 1) + X.shape,这是因为nn.Conv2d需要一个四维的输入张量,其中前两个维度分别是批量大小和通道数。
  • nn.Conv2d类的构造函数接受三个参数:输入通道数、输出通道数和卷积核的大小。它还可以接受两个可选参数:填充的大小和步幅的大小。
  • 在这段代码中,创建了四个不同的nn.Conv2d对象,并对同一个输入张量X进行了卷积操作。这四个对象的卷积核大小、填充大小和步幅大小都不同,因此卷积后的结果也不同。
  • 最后,打印了每次卷积后结果的形状。这可以帮助你理解卷积操作是如何改变输入张量的形状的。
这段代码的主要目的是帮助你理解二维卷积操作的基本概念,包括卷积核的大小、填充的大小和步幅的大小。

218 卷积层里的多输入多输出

1×1卷积
notion image

219 池化层

  • 池化层返回窗口中最大或平均值
  • 缓解卷积层对位置的敏感性
  • 同样有窗口大小、填充和步幅作为超参数

220 经典神经网络LeNet

  • LeNet-5 由两个部分组成,卷积编码器和全连接层密集块
这段Python代码定义了一个名为train_ch6的函数,它用于在GPU上训练一个神经网络模型。以下是关于这段代码的一些详细解释:
  • train_ch6函数接受六个参数:一个神经网络模型net,一个训练数据迭代器train_iter,一个测试数据迭代器test_iter,训练的轮数num_epochs,学习率lr,和一个设备对象device
  • 在函数内部,首先定义了一个名为init_weights的函数,用于初始化模型的权重。然后调用net.apply(init_weights)方法将这个函数应用到模型的每一层。
  • 然后将模型移动到device指定的设备上,创建一个优化器对象optimizer,定义损失函数loss,并创建一个动画对象animator用于显示训练过程。
  • 接下来,进入一个循环,对每一轮训练,首先创建一个d2l.Accumulator对象metric用于累积总的损失和正确预测数,然后将模型设置为训练模式。
  • 对训练数据迭代器train_iter进行迭代,对每一批数据X和标签y,首先将它们移动到device指定的设备上,然后使用模型对X进行预测,计算损失,进行反向传播,更新参数,然后将损失和正确预测数添加到metric中。
  • 在每一轮训练结束后,计算测试集上的精度,并将其添加到动画中。
  • 最后,打印训练的结果,包括最后一轮的损失、训练精度和测试精度,以及每秒处理的样本数。
这个函数的主要目的是帮助你理解如何使用GPU来加速神经网络模型的训练过程。
输出:
 
notion image

221 深度卷积神经网络AlexNet

notion image
notion image
notion image
notion image

222 使用块的网络VGG

notion image
notion image
notion image
notion image

223 网络中的网络NiN

① 在全局平均池化层(GAP)被提出之前,常用的方式是将feature map直接拉平成一维向量,但是GAP不同,是将每个通道的二维图像做平均,最后也就是每个通道对应一个均值。
② 假设卷积层的最后输出是h × w × d 的三维特征图,具体大小为6 × 6 × 3,经过GAP转换后,变成了大小为 1 × 1 × 3 的输出值,也就是每一层 h × w 会被平均化成一个值,如下图所示。
③ GPA优势:
  1. 抑制过拟合。直接拉平做全连接层的方式依然保留了大量的空间信息,假设feature map是32个通道的10 * 10图像,那么拉平就得到了32 * 10 * 10的向量,如果是最后一层是对应两类标签,那么这一层就需要3200 * 2的权重矩阵,而GAP不同,将空间上的信息直接用均值代替,32个通道GAP之后得到的向量都是32的向量,那么最后一层只需要32 * 2的权重矩阵。相比之下GAP网络参数会更少,而全连接更容易在大量保留下来的空间信息上面过拟合。
  1. 输入尺寸更加灵活。在第1点的举例里面可以看到feature map经过GAP后的神经网络参数不再与输入图像尺寸的大小有关,也就是输入图像的长宽可以不固定。
notion image

网络中的网络(Network in Network,NiN)是一种深度学习模型,由Min Lin, Qiang Chen, Shuicheng Yan在2013年的论文《Network In Network》中提出。NiN的主要思想是在传统的卷积层后面加入一个微型的多层感知机(MLP),以增强模型的表达能力。
以下是NiN的一些关键特性:
  1. 微型多层感知机(MLP):在传统的卷积神经网络(CNN)中,卷积层的作用是学习局部的空间特征。在NiN中,每个卷积层后面都跟着一个微型的MLP,这个MLP由多个全连接层组成,用于对卷积层的输出进行非线性变换。这样可以增强模型的表达能力,使模型能够学习更复杂的特征。
  1. 全局平均池化(Global Average Pooling):在传统的CNN中,通常会在最后的卷积层后面加入一个或多个全连接层,然后输出预测结果。在NiN中,最后的全连接层被替换为全局平均池化层。全局平均池化层的作用是对每个特征图进行平均池化,然后输出预测结果。这样可以减少模型的参数数量,降低过拟合的风险。
  1. 多尺度特征学习:NiN的结构可以很容易地扩展到多尺度特征学习。通过在不同的层级上添加微型的MLP和全局平均池化层,NiN可以同时学习不同尺度的特征。
NiN的这些特性使其在一些深度学习任务中表现出优秀的性能,例如图像分类和物体检测。然而,NiN的训练过程可能比传统的CNN更复杂,因为微型的MLP和全局平均池化层可能会增加模型的训练难度。

224 合并行连接的网络GooLeNet

notion image
在 1x1 的卷积层中,每个卷积核的大小是 1x1xC,其中 C 是输入的通道数。这意味着每个卷积核都会在输入的每个通道上进行卷积运算,然后将结果相加,得到一个单一的输出值。因此,每个 1x1 的卷积核都会将输入的 C 个通道减少到 1 个通道。
如果我们有 C 个输入通道,我们可以通过使用 K 个 1x1 的卷积核来将输出通道数降低到 K。这就是为什么 1x1 的卷积层可以降低通道数的原因。
此外,1x1 的卷积层还可以增加网络的非线性。因为每个 1x1 的卷积后通常会接一个非线性激活函数,如 ReLU。这使得网络可以学习更复杂的特征表示。
notion image
notion image
 

225 批量归一化

批量归一化(Batch Normalization,简称 BN)是一种用于提高神经网络性能和稳定性的技术。它是由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出的。
批量归一化的主要思想是:在每一层的激活函数之前,对每个小批量(mini-batch)的数据进行归一化,使得结果的均值为 0,标准差为 1。这样做可以减少内部协变量偏移(Internal Covariate Shift),即减少训练过程中层与层之间输入数据分布的变化。
批量归一化通常在卷积层或全连接层与激活函数之间进行,具体步骤如下:
  1. 计算小批量的均值和方差。
  1. 使用均值和方差对小批量进行归一化。
  1. 对归一化的结果进行缩放和平移。这里的缩放因子和平移因子是模型的参数,需要在训练过程中学习。
批量归一化有以下优点:
  • 可以使得网络对初始化权重不那么敏感。
  • 可以使用较大的学习率进行训练,加速模型的收敛速度。
  • 可以起到一定的正则化效果,减少模型过拟合。
  • 可以让更深的网络更容易训练。
在 PyTorch 中,你可以使用 torch.nn.BatchNorm1dtorch.nn.BatchNorm2dtorch.nn.BatchNorm3d 来进行批量归一化。
BatchNorm1dBatchNorm2dBatchNorm3d 是 PyTorch 中用于批量归一化的三个函数,它们分别用于处理 1D,2D 和 3D 数据。
  • BatchNorm1d:用于处理形状为 (batch_size, num_features)(batch_size, num_features, length) 的数据。这通常用于全连接层的输出或一维卷积层的输出。
  • BatchNorm2d:用于处理形状为 (batch_size, num_features, height, width) 的数据。这通常用于二维卷积层的输出。
  • BatchNorm3d:用于处理形状为 (batch_size, num_features, depth, height, width) 的数据。这通常用于三维卷积层的输出。
在这些函数中,num_features 是你的特征数量(例如,对于卷积层,这将是输出通道的数量)。batch_size 是每个小批量的大小。lengthheightwidthdepth 是你的数据的空间维度。
这些函数的工作方式是在每个特征(即每个通道)上独立地进行批量归一化。也就是说,它们会计算每个特征的均值和方差,然后使用这些均值和方差对每个特征进行归一化。

226 残差神经网络ResNet

notion image

227 深度学习硬件

notion image
notion image

228 深度学习硬件TPU和其他

notion image
notion image

229 单机多卡并行

notion image

230 多GPU训练实现

test acc: 0.89, 16.7 sec/epochon [device(type='cuda', index=0)]
notion image
test acc: 0.80, 11.8 sec/epochon [device(type='cuda', index=0), device(type='cuda', index=1)]
notion image

231 分布式训练

notion image
  • 每个计算服务器读取小批量中的一块
  • 进一步将数据切分到每个GPU上
  • 每个worker从参数服务器那里获取模型参数
  • 复制参数到每个GPU上
  • 每个GPU计算梯度
  • 将所有GPU上的梯度求和
  • 梯度传回服务器
  • 每个服务器对梯度求和,并更新参数
  • 同步SGD
    • notion image

232 数据增广

notion image
notion image
 
notion image
notion image
notion image
notion image

233 微调

notion image
notion image
notion image
 
 
loss 0.364, train acc 0.886, test acc 0.938 560.9 examples/sec on [device(type='cuda', index=0), device(type='cuda', index=1), device(type='cuda', index=2)]
notion image
loss 0.368, train acc 0.840, test acc 0.851 1351.2 examples/sec on [device(type='cuda', index=0), device(type='cuda', index=1), device(type='cuda', index=2)]
notion image

234 实战Kaggle比赛图像分类CIFAR10

235 实战Kaggle比赛狗的品种识别

236 物体检测和数据集

notion image
notion image

237 锚框

notion image
notion image
notion image
notion image
 
notion image
notion image
① 锚框的宽度和高度分别是。我们只考虑组合:
② s表示锚框的大小,锚框占图片的百分之多少,r表示锚框的高宽比。
在目标检测中,锚框(Anchor box)是一种预定义的矩形框,它们用于对物体的位置和大小进行预测。每个锚框都有一个固定的大小和宽高比(aspect ratio)。
在这段代码中,sizes是一个列表,它包含了所有可能的锚框的大小;ratios是一个列表,它包含了所有可能的锚框的宽高比。对于每个像素,我们都会生成一系列的锚框,这些锚框的大小和宽高比分别取自sizesratios
boxes_per_pixel是每个像素的锚框数量。它的计算方式是num_sizes + num_ratios - 1。这是因为对于每个像素,我们首先为每个大小生成一个锚框(共num_sizes个),然后我们为除了第一个大小之外的每个大小和每个宽高比生成一个锚框(共(num_sizes - 1) * num_ratios个)。所以总的锚框数量就是num_sizes + (num_sizes - 1) * num_ratios = num_sizes + num_ratios - 1
这种生成锚框的方式可以确保我们对每个像素都有一系列大小和形状各异的锚框,这样可以提高目标检测的准确性,因为我们可以预测出各种大小和形状的物体。
在生成锚框时,我们通常会为每个预定的大小(sizes)生成一个锚框,然后再为每个预定的宽高比(ratios)和除第一个大小之外的每个大小生成一个锚框。这样做的目的是为了避免重复。
如果我们为每个大小和每个宽高比都生成一个锚框,那么当宽高比为1时,就会和某个大小生成的锚框重复。为了避免这种重复,我们通常会选择一个基准大小(通常是sizes中的第一个元素),然后只为这个基准大小生成宽高比为1的锚框,而对于其他的大小,我们就生成宽高比不为1的锚框。
这样,我们就可以生成一系列大小和形状各异的锚框,而不会有重复。这可以提高目标检测的准确性,因为我们可以预测出各种大小和形状的物体。

238 树叶分类竞赛技术总结

notion image
notion image
notion image
notion image
notion image

239 物体检测算法R-CNN、SSD、YOLO

notion image
notion image
notion image
Fast R-CNN是一种用于目标检测的深度学习模型,由Ross Girshick在2015年提出。它是R-CNN(Regions with CNN features)的一个改进版本,解决了R-CNN的一些问题,如训练速度慢、检测速度慢等。
Fast R-CNN的主要特点和步骤如下:
  1. 输入和卷积层:Fast R-CNN的输入是整个图像和一组提议的区域(也称为区域提议或RoIs),这些区域提议可以用任何方法生成,例如Selective Search或EdgeBoxes。然后,整个图像通过一些卷积层和最大池化层,生成一个特征图。
  1. RoI Pooling:对于每个区域提议,我们在特征图上找到对应的区域,然后使用RoI Pooling将这个区域转换为固定大小的特征向量。RoI Pooling是一种特殊的最大池化,它可以处理不同大小的区域。
  1. 全连接层和输出:然后,我们将所有的特征向量通过一些全连接层,生成两个输出:一个是物体的类别,一个是物体的边界框的位置。类别是通过softmax分类器预测的,位置是通过线性回归预测的。
Fast R-CNN的一个主要优点是它可以在整个图像上一次性计算卷积,而不是像R-CNN那样对每个区域提议分别计算,这大大提高了计算效率。此外,Fast R-CNN还引入了RoI Pooling和多任务损失,使得模型可以同时学习分类和回归,进一步提高了性能。
然而,Fast R-CNN仍然依赖于传统的区域提议方法,这些方法通常是计算密集型的,并且不能端到端训练。这个问题在后来的Faster R-CNN中得到了解决,Faster R-CNN引入了区域提议网络(RPN),使得区域提议也可以用深度学习生成,并且整个模型可以端到端训练。
notion image
notion image
notion image
notion image

SSD

notion image
notion image
notion image
notion image

YOLO

notion image
notion image

240 SSD实现

输出的类别预测个数:w * h * num_anchor * (num_class + 1)

241 语义分割和数据集

notion image
应用有:背景虚化,路面分割、实例分割
最重要的语义分割数据集之一是http://host.robots.ox.ac.uk/pascal/VOC/voc2012/

242 转置卷积

转置卷积是一种变化了输入和核的卷积,来达到上采用的目的
转置卷积(Transpose Convolution),也称为反卷积(Deconvolution),是卷积神经网络(CNN)中的一种操作。它与常规的卷积操作相反,用于将低维特征图(如特征图的高度和宽度)扩展为更高维度的特征图。
在传统的卷积操作中,通过使用卷积核对输入特征图进行滑动窗口计算,生成较小的输出特征图。而转置卷积则是通过使用转置卷积核(也称为反卷积核)对输入特征图进行类似的滑动窗口计算,但是输出的特征图尺寸会比输入的特征图尺寸更大。
转置卷积的计算过程可以看作是将输入特征图中的每个像素值进行扩展,并在输出特征图中的相应位置进行加权累加。这样可以实现特征图的上采样,即将低分辨率的特征图转换为高分辨率的特征图。
转置卷积在深度学习中常用于图像分割、图像生成和语义分割等任务中,可以帮助恢复丢失的细节信息,还原图像的细节和空间结构。

243 RNN

随时间反向传播(Backpropagation Through Time,BPTT)是一种用于训练循环神经网络(RNN)的算法。由于RNN的输出不仅依赖于当前的输入,还依赖于过去的输入,因此传统的反向传播算法不能直接应用于RNN。BPTT算法通过将RNN“展开”为一个深度神经网络,使我们能够使用反向传播算法来训练RNN。
以下是BPTT算法的基本步骤:
  1. 前向传播:从输入层开始,通过隐藏层,直到输出层,计算并存储每一层的输出。
  1. 计算误差:在输出层,计算目标值和实际输出值之间的误差。
  1. 反向传播误差:从输出层开始,向输入层方向,计算每一层的误差。这一步需要使用链式法则来计算误差的梯度。
  1. 更新权重:使用计算出的梯度来更新网络的权重。
这个过程会在每个时间步重复进行,因此被称为“随时间反向传播”。
需要注意的是,BPTT算法的一个主要挑战是梯度消失和梯度爆炸问题。当RNN的序列长度很长时,梯度可能会变得非常小(梯度消失)或非常大(梯度爆炸),导致网络难以训练。为了解决这个问题,人们提出了一些改进的RNN结构,如长短期记忆网络(LSTM)和门控循环单元(GRU)。

244 全连接卷积和神经网络

notion image
notion image

245 样式迁移

notion image
notion image
 
notion image

246 序列模型

notion image
notion image
notion image
notion image
notion image
序列模型是一类用于处理序列数据的统计模型。在序列模型中,马尔可夫假设和潜变量模型是两个常见的概念。
  1. 马尔可夫假设(Markov Assumption):马尔可夫假设是指在序列模型中,当前时刻的状态只依赖于前一个时刻的状态,与更早的状态无关。换句话说,当前状态的条件概率只与前一个状态有关,与其他历史状态无关。这个假设简化了序列模型的建模和计算,使得模型更加可行和高效。常见的马尔可夫模型包括隐马尔可夫模型(Hidden Markov Model,HMM)和马尔可夫链(Markov Chain)。
  1. 潜变量模型(Latent Variable Model):潜变量模型是一种统计模型,用于描述观测数据背后的潜在结构或隐藏变量。在序列模型中,潜变量模型可以用于表示序列中的未观测到的状态或特征。通过引入潜变量,可以更好地捕捉序列数据中的复杂关系和变化。常见的潜变量模型包括隐马尔可夫模型(HMM)、潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)等。
潜变量模型和马尔可夫假设在序列模型中经常结合使用。例如,隐马尔可夫模型是一种潜变量模型,它基于马尔可夫假设,通过观测到的输出序列来推断隐藏的状态序列。这种模型在语音识别、自然语言处理、生物信息学等领域中得到广泛应用。

247 文本预处理

文本预处理是指在自然语言处理(NLP)任务中对原始文本进行一系列的清洗、转换和规范化操作,以准备文本数据用于后续的分析和建模。
文本预处理的目标是消除文本中的噪声、规范化文本的格式,并提取出有用的特征,以便更好地理解和处理文本数据。常见的文本预处理步骤包括:
  1. 文本清洗:去除文本中的特殊字符、标点符号、HTML标签、URL链接等无关信息。
  1. 文本分词:将文本划分为单词、词组或字符等更小的单位,以便进行后续的分析和处理。
  1. 停用词去除:去除常见的停用词,如"the"、"is"、"and"等,这些词对于文本分析而言通常没有太多的信息量。
  1. 大小写转换:将文本中的字母统一转换为大写或小写,以消除大小写带来的差异。
  1. 词干提取和词形还原:将单词转换为其原始形式,如将"running"转换为"run",以减少词形的变化对文本分析的影响。
  1. 特征编码:将文本转换为数值或向量表示,如使用词袋模型、TF-IDF、词嵌入等方法将文本转换为机器学习算法可以处理的形式。
文本预处理的具体步骤和方法取决于任务的需求和文本数据的特点。通过文本预处理,可以提高文本数据的质量和一致性,减少噪声和冗余信息,从而为后续的文本分析和建模提供更好的基础。

248 语言模型

notion image
  • 语言模型估计文本序列的联合概率
  • 使用统计方法时采用n元语法

250 变分自动编码器

变分自动编码器(Variational Autoencoder,简称VAE)是一种生成模型,它使用深度学习技术来学习输入数据的潜在表示,并能够从这个潜在表示中生成新的数据。
VAE的结构包括两部分:编码器(Encoder)和解码器(Decoder)。
  1. 编码器:编码器的任务是将输入数据(例如图像)编码为一个潜在表示。在VAE中,这个潜在表示通常是一个概率分布的参数(例如高斯分布的均值和方差)。这是VAE与普通自动编码器的主要区别,普通的自动编码器直接编码为一个潜在向量。
  1. 解码器:解码器的任务是从编码器得到的潜在表示中生成新的数据。在VAE中,解码器从编码器得到的概率分布中采样一个点,然后将这个点解码为一个新的数据。
VAE的训练目标是最大化输入数据的重构概率,并最小化潜在表示与先验分布(通常是标准正态分布)之间的差异。这个目标可以通过变分推断和重参数化技巧来实现。
VAE的一个主要优点是它能够生成新的数据,这使得它在图像生成、文本生成等任务中有很好的应用。同时,由于VAE学习的是数据的潜在分布,因此它能够生成与训练数据类似但并非完全相同的新数据,这使得它在数据增强、异常检测等任务中也有很好的表现。

参考

上一篇
初见Rust:编程界的原神
下一篇
Python语法
Loading...
目录