目录
随机梯度下降(Stochastic Gradient Descent,SGD)
torch.nn.CrossEntropyLoss(),交叉损失函数
Mini-batch
Mii-batch是一种在机器学习中常用的训练算法。它是将大的数据集分成一些小的数据集,每次只用一个小的数据集来训练模型。通常情况下,训练数据集中的数据越多,训练出的模型越准确,但是如果数据集太大,就会导致计算量过大,训练时间过长。因此,使用Mini-batch的方法可以在保证模型训练准确性的同时,降低计算时间和内存的消耗。在mini-batch中,每个小的数据集被称为一个patch,通常情况下,每个batch的大小是相同的。在训练过程中,每个batch都会被输入到模型中进行训练,模型的参数会根据每个batch的误差进行更新。这样,在训练过程中,每个batch都会为模型提供一些不同的信息,从而增强模型的泛化能力。
使用mini-batch的方法可以在保证模型训练准确性的同时,降低计算时间和内存的消耗,同时还可以带来更好的泛化性能。因此,mini-batchi已经成为了深度学习中的一种常用的训练算法。
链接:https://wenku.csdn.net/answer/7e8ca99bbfd84184b4ba9957911f4ccd
魔法函数
魔法函数指的是Python中的特殊函数,它们以双下划线开头和结尾,如__init__、__str__等。这些函数在Python内部被调用,它们可以实现一些特殊的功能,比如重载运算符、创建对象、打印对象等。
DataLoader与DataSet
DataLoader与DataSet是PyTorch数据读取的核心,是构建一个可迭代的数据装载器,每次执行循环的时候,就从中读取一批Batchsize大小的样本进行训练。
- Dataset:负责可被Pytorch使用的数据集的创建
- Dataloader:向模型中传递数据
链接:Python中的Dataset和Dataloader详解_python_脚本之家
transformers的简介
transformers提供了数千个预先训练好的模型来执行不同模式的任务,如文本、视觉和音频。这些模型可应用于:
- 文本:用于文本分类、信息提取、问题回答、摘要、翻译、文本生成等任务,支持100多种语言。
- 图像:用于图像分类、对象检测和分割等任务。
- 音频:用于语音识别和音频分类等任务。
transformer模型还可以在几种组合模式上执行任务,例如表格问题回答、光学字符识别、从扫描文档中提取信息、视频分类和视觉问题回答。
transformer提供了api,可以快速下载并在给定文本上使用这些预训练的模型,在您自己的数据集上对它们进行微调,然后在我们的模型中心上与社区共享。同时,每个定义架构的python模块都是完全独立的,可以进行修改以进行快速研究实验。
transformer由三个最流行的深度学习库——Jax、PyTorch和TensorFlow——支持,并在它们之间无缝集成。在加载模型进行推理之前,先用一个模型训练它们是很简单的。您可以从模型中心直接在它们的页面上测试我们的大多数模型。我们还提供私有模型托管、版本控制和公共和私有模型的推理API。
链接:Py之transformers:transformers的简介、安装、使用方法、案例应用之详细攻略_python transformers-CSDN博客
torchvision简介
torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。以下是torchvision的构成:
torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
torchvision.utils: 其他的一些有用的方法。
torch.no_grad()
torch.no_grad() 是 PyTorch 中的一个上下文管理器,用于在进入该上下文时禁用梯度计算。
这在你只关心评估模型,而不是训练模型时非常有用,因为它可以显著减少内存使用并加速计算。当你在 torch.no_grad() 上下文管理器中执行张量操作时,PyTorch 不会为这些操作计算梯度。这意味着不会在 .grad 属性中累积梯度,并且操作会更快地执行。
激活函数:
激活函数通常作用于神经元的加权输入/激活前的值(weighted sum),并产生一个非线性的输出值,作为神经元的激活状态,用于传递给下一层神经元或作为输出层的最终输出。
常用的非线性函数包括:
-
Sigmoid函数:将输入映射到[0, 1]之间,常用于二分类问题或者作为输出层的激活函数。
-
Tanh函数:将输入映射到[-1, 1]之间,也常用于二分类问题或者作为输出层的激活函数。
-
ReLU函数(Rectified Linear Unit):将负数输入映射为0,保留正数输入,常用于隐藏层的激活函数。
-
Softmax函数:将输入映射为概率分布(输出的向量的每一个值都为正而且元素之和为一)。常用于多分类问题的输出层。
Q:为什么一定要做非线性变换?
A:激活函数引入了非线性操作,使得神经网络可以更好地拟合复杂的非线性关系。如果神经网络只使用线性激活函数,那么整个网络将只是多个线性操作的组合,无法处理非线性数据或者学习非线性映射。
Softmax
Softmax是一种激活函数,它可以将一个数值向量归一化为一个概率分布向量,且各个概率之和为1。Softmax可以用来作为神经网络的最后一层,用于多分类问题的输出。Softmax层常常和交叉熵损失函数一起结合使用。
对于二分类问题,我们可以使用Sigmod函数(又称Logistic函数)。将(−∞,+∞)范围内的数值映射成为一个(0,1)区间的数值,一个(0,1)区间的数值恰好可以用来表示概率。对于多分类问题,一种常用的方法是Softmax函数,它可以预测每个类别的概率。
链接:三分钟读懂Softmax函数 - 知乎 (zhihu.com)
ReLu
ReLu,全称是Rectified Linear Unit,中文名称是线性整流函数,是在神经网络中常用的激活函数。通常意义下,其指代数学中的斜坡函数,即
引入非线性激活函数的目的是提高神经网络的非线性拟合能力,增强模型的表达能力。因此,在表述过程中,在没有明确指明的情况下,激活函数指代非线性激活函数。经过严格的数学推导,如果网络中没有使用激活函数,每一层的节点的输入都是上层输出的线性函数,无论神经网络中的隐含层有多少,最后的输出结果都是网络输入的线性拟合,即隐含层没有发挥其作用。为此,引入非线性函数作为激活函数来提高模型的表达能力。
隐层
在人工神经网络 ANN中,隐层(Hidden Layer)是位于输入层和输出层之间的一层或多层神经元的集合。作为神经网络中的中间层,隐层负责对输入数据进行特征提取和转换,从而实现复杂的非线性映射关系。
神经网络的训练
前向传播(Forward Propagation)
前向传播(Forward Propagation)是一种在神经网络中进行信息传递的过程,它是神经网络训练的第一步。在前向传播中,输入数据通过神经网络的多个层(包括输入层、隐藏层和输出层)按照预定的权重和偏置进行计算,从输入层传递到输出层,最终得到神经网络的预测结果。
梯度下降
梯度下降法:是寻找极小值的一种方法。通过向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索,直到在极小点收敛。
随机梯度下降(Stochastic Gradient Descent,SGD)
optim.SGD
是PyTorch中的一个优化器,其实现了随机梯度下降(Stochastic Gradient Descent,SGD)算法。在深度学习中,我们通常使用优化器来更新神经网络中的参数,以使得损失函数尽可能地小。
在PyTorch中使用optim.SGD
优化器,一般需要指定以下参数:
params
:需要更新的参数,通常为模型中的权重和偏置项。lr
:学习率,即每次参数更新时的步长。momentum
:动量,用来加速模型收敛速度,避免模型陷入局部最优解。dampening
:动量衰减,用来控制动量的衰减速度。weight_decay
:权重衰减,用来防止模型过拟合,即通过对权重的L2正则化来约束模型的复杂度。nesterov
:是否使用Nesterov动量。
损失函数
损失函数(Loss Function),也称为目标函数、成本函数或目标损失函数,是在监督式学习中用来度量模型预测值与真实标签之间差异的函数。
torch.nn.CrossEntropyLoss(),交叉损失函数
- 交叉熵损失函数会自动对输入模型的预测值进行softmax。因此在多分类问题中,如果使用nn.CrossEntropyLoss(),则预测模型的输出层无需添加softmax。
- nn.CrossEntropyLoss()=nn.LogSoftmax()+nn.NLLLoss()。
- 交叉熵损失函数用于分类任务,均方误差损失函数用于回归任务。
# Construct loss and optimizer, using PyTorch API
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)# Training cycle: forward, backward, update
# 前馈算loss,反馈计算关于loss的梯度,更新是用梯度下降算法利用的梯度进行更新
def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
# 获得一个批次的数据和标签
inputs, target = data
optimizer.zero_grad()
# forward + backward + update
outputs = model(inputs)
loss = criterion(outputs, target)
loss.backward()
optimizer.step()
running_loss += loss.item()
if batch_idx % 300 == 299:
print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
running_loss = 0.0
传送门:torch.nn.CrossEntropyLoss() 参数、计算过程以及及输入Tensor形状 - 知乎
反向传播
反向传播(Backpropagation)用于计算神经网络中各层权重和偏置的梯度,从而实现模型参数的更新。它是前向传播的逆过程,通过计算损失函数对神经网络输出的梯度,逐层向后传播,从输出层到输入层,计算每一层的梯度,并用于更新模型参数。
梯度消失问题(Gradient Vanishing)是指在深度神经网络中,反向传播算法中计算的梯度在网络的较深层逐渐变得非常小,甚至趋近于零,从而导致这些层的权重更新变得非常缓慢或停止更新,使得这些层的参数无法得到有效的训练。
梯度爆炸是要经过多次的连乘,每次乘法操作都可能将梯度放大,从而导致梯度值变得非常大,从而导致梯度爆炸(Gradient Explosion)。
优化算法
优化算法:优化算法就是决定在更新参数时如何调整步长、方向等因素,以最小化损失函数的值。随机梯度下降是最常见的优化算法。
Transformer模型
Transformer 的整体结构
原版的Transformer有六个编码器和六个解码器
Transformer本义为变压器,变换器,读作/trænsˈfɔːmə(r)/ 。2017年6月,谷歌团队发表的论文《Attention Is All You Need》中,Transformer第一次出现在人工智能的语境中,当时他被解释为一种基于注意力的编码器/解码器模型。今天,当我们再谈论Transformer时,他已经是人工智能的经典框架,形成了一个大家族。
Transformer模型的设计解决了传统循环神经网络(RNN)和卷积神经网络(CNN)在处理长序列数据时的一些限制。其中,最重要的特性是自注意力机制(Self-Attention)和多头注意力机制(Multi-Head Attention)。Transformer 模型通过自注意力机制(self-attention)来建立输入序列中不同位置之间的依赖关系,从而有效地捕捉序列中的长程依赖关系。
Tensor:张量
# In PyTorch, Tensor is the important component in constructing dynamic computational graph
w = torch.tensor([1.0]) # w的初值为1.0
w.requires_grad = True # 需要计算梯度
# If autograd mechanics are required, the element variable requires_grad of Tensor has to be set to True.
# Tensor:张量(Tensor):是一个多维数组,它是标量、向量、矩阵的高维拓展。
# tensor即张量,它是一种数据结构,用来表示或者编码神经网络模型的输入、输出和模型参数等。
Tensor:张量(Tensor):是一个多维数组,它是标量、向量、矩阵的高维拓展。
tensor即张量,它是一种数据结构,用来表示或者编码神经网络模型的输入、输出和模型参数等。
F.avg_pool2d()函数
avg_pool2d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
执行2D平均池化操作,入参:
- input:输入tensor, [batch_size,channels,height,width]
- kernel_size: 池化区域尺寸,可以是一个数n,kernel=(n,n),或者形如(kh,kw)
- stride: 池化操作的步长,标量或者(sh,sw).默认和kernel一致,这是个二维的,所以在height和width上均和kernerl一致,越界同样丢弃。
- padding:默认是在输入input的四周补以0,可以指定为一个标量或(padh,padw)
- ceil_mode: true(use ceil), false(use floor)
- count_include_pad: true(计算平均数时包含补边0
pytorch中的F.avg_pool2d()平均池化操作用于二维,input是维度是4维;
pytorch中的F.avg_pool1d()平均池化操作用于一维,input的维度是三维。
torch.nn.MaxPool2d
作用:对邻域内特征点取最大,减小卷积层参数误差造成估计均值的偏移的误差,更多的保留纹理信息。
传送门:Pytorch学习笔记(四):nn.MaxPool2d()函数详解-CSDN博客
torch.cat
torch.cat(tensors, dim=0, *, out=None),也就是有两个参数,一个是要合并的张量,一个是在哪个维度上进行合并。函数将两个张量(tensor)按指定维度拼接在一起,注意:除拼接维数dim数值可不同外其余维数数值需相同,方能对齐。
dim = 0:按列对其
dim = 1:按行对其
传送门:Pytorch中torch.cat()函数解析-CSDN博客
torch.nn.Conv2d
nn.Conv2d:对由多个输入平面组成的输入信号进行二维卷积;
传送门:pytorch中的torch.nn.Conv2d()函数图文详解_python_脚本之家
GoogLeNet网络
一、GoogLeNet网络的背景
想要更好的预测效果,就要从网络深度和网络宽度两个角度出发增加网络的复杂度。
但这个思路有两个较为明显的问题:
首先,更复杂的网络意味着更多的参数,也很容易过拟合;
其次,更复杂的网络会消耗更多的计算资源,而且卷积核个数设计不合理,导致了卷积核中参数没有被完全利用(多数权重都趋近0)时,会造成大量计算资源的浪费。因此GoogLeNet在专注于加深网络结构的同时,引入了新的基本结构——Inception模块,以增加网络的宽度。GoogLeNet一共22层,没有全连接层,在2014年的ImageNet图像识别挑战赛中获得了冠军。
二、Inception模块
GooLeNet 的Inception模块的基本组成结构有四个:1x1卷积,3x3卷积,5x5卷积,3x3最大池化。
ResNets 残差网络
ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。
残差网络从一定程度上解决了模型退化问题(由于优化困难而导致,随着网络的加深,训练集的准确率反而下降了),它在一个块的输入和输出之间引入一条直接的通路,称为跳跃连接。
跳跃连接的引入使得信息的流通更加顺畅:一是在前向传播时,将输入与输出的信息进行融合,能够更有效的利用特征;二是在反向传播时,总有一部分梯度通过跳跃连接反传到输入上,这缓解了梯度消失的问题。【引自:《PyTorch深度学习实践9》——卷积神经网络-高级篇(Advanced-Convolution Neural Network)_advanced convolutional neural network-CSDN博客】
如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。
但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。有人甚至在1000多层的神经网络中做过实验,这样就让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越深,网络连接会变得臃肿,但是ResNet确实在训练深度网络方面非常有效。
传送门:残差网络(Residual Network)-CSDN博客
对于一张黑白的手写的数字,我们应该以什么作为它的特征,输入给机器让他学习呢?
答案是,构成这张图的28*28=784个像素点的灰度!对于每一个像素,我们都给他赋一个从0到1的值。一个像素点越黑,他就越接近0;一个像素点越白,他就越接近1。