赞
踩
本文记录了我在学习深度学习的过程中遇到过的不懂的知识点,为了方便翻阅,故将其发表于此,随时更新,供大家参考。
在深度学习中,测试精度和训练精度是两个重要的指标,它们分别代表了模型在测试集上的分类正确率和训练集上的分类正确率。测试集是用来评估模型泛化能力的数据集,它不参与模型的训练过程。训练集是用来训练模型参数的数据集,它直接影响模型的学习效果。
测试精度和训练精度之间的大小关系,可以反映出模型是否存在过拟合或欠拟合的问题。过拟合是指模型在训练集上表现很好,但在测试集上表现很差,说明模型过于复杂,学习了训练集的噪声或特异性,导致泛化能力下降。欠拟合是指模型在训练集和测试集上都表现不好,说明模型过于简单,没有学习到数据的内在规律,导致预测能力不足。
一般来说,我们希望测试精度和训练精度都尽可能高,且相差不大。
如果测试精度远低于训练精度,说明存在过拟合,可以通过增加数据量、使用正则化、dropout等方法来缓解。如果测试精度和训练精度都很低,说明存在欠拟合,可以通过增加特征、使用更复杂的模型、减小正则化系数等方法来改善。
如果测试精度高于训练精度,这种情况比较少见,可能有以下几种原因:
超参数是一些用来控制模型结构、功能、效率等的调节旋钮,它们不能直接从数据中学习,而需要人为预先设定或优化。超参数的不同选择会影响模型的性能和效果。一些常见的超参数有:
在深度学习中,训练数据集、验证数据集和测试数据集是三种不同的数据集,它们各自有不同的作用和区别。
三种数据集之间的区别主要有以下几点:
在深度学习中,K-则交叉验证是一种评估模型性能和选择最优超参数的方法。它的基本思想是将原始数据集分成K个子集,每次选择一个子集作为验证集,其余的K-1个子集作为训练集,进行K次训练和验证,然后取K次验证结果的平均值作为模型的最终评估指标。这样可以充分利用数据集,避免数据划分的随机性对模型评估的影响,提高模型的泛化能力。
具体来说,假设我们有一个数据集D,包含m个样本,我们想要训练一个深度学习模型M,并且选择合适的超参数H(例如学习率、批大小、正则化系数等)。我们可以按照以下步骤进行K-则交叉验证:
在深度学习中,模型容量是指模型的拟合能力或复杂度的度量,它反映了模型可以表示的函数族的大小和多样性。
一般来说,模型容量越大,模型可以拟合的函数越复杂,模型的表达能力越强。但是,模型容量也会影响模型的泛化能力,即在未见过的数据上的表现。
如果模型容量过小,模型可能会欠拟合,即在训练集上表现不佳;如果模型容量过大,模型可能会过拟合,即在训练集上表现很好,但在测试集上表现很差。
因此,在深度学习中,选择合适的模型容量是一个重要的问题,需要在拟合能力和泛化能力之间找到一个平衡点。有一些方法可以用来控制或调节模型容量,例如:
在深度学习中,过拟合和欠拟合是两种常见的模型训练问题,它们都会影响模型的泛化能力,即在新数据上的表现。
**过拟合(overfitting)**是指模型在训练数据集上表现很好,但在测试数据集或未见过的数据上表现很差,说明模型学习了训练数据中的噪声或无关信息,而没有捕捉到数据背后的真实规律。过拟合通常发生在模型复杂度过高、训练数据量过少或训练时间过长的情况下。
**欠拟合(underfitting)**是指模型在训练数据集上表现不佳,也无法在测试数据集或未见过的数据上表现好,说明模型没有学习到足够的信号或有用信息,而只是做了一些简单的拟合。欠拟合通常发生在模型复杂度过低、训练数据量过大或训练时间过短的情况下。
为了解决过拟合和欠拟合的问题,我们需要在模型复杂度和数据量之间找到一个平衡点,使得模型既能够充分学习数据中的信号,又能够避免学习数据中的噪声。一些常用的方法有:
注:一点点的过拟合并不是坏事。
深度学习中,激活函数是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。**激活函数可以增加神经网络的非线性,使得神经网络可以逼近任何非线性函数,从而提高网络的表达能力和泛化能力。**激活函数还可以影响网络的训练效率和稳定性,例如避免梯度消失或爆炸、缓解过拟合等问题。
深度学习中常用的激活函数有很多种,例如Sigmoid、Tanh、ReLU、Leaky ReLU、ELU等。不同的激活函数有各自的优缺点和适用场景,需要根据具体的问题和数据来选择合适的激活函数。
在深度学习中,Dropout是一种防止过拟合的技术,它的原理是在训练过程中,**随机地将一些神经元的输出置为零,从而减少神经元之间的依赖性,增强网络的泛化能力。**Dropout可以看作是一种模型集成的方法,它相当于同时训练了多个不同的子网络,并在测试时对它们取平均。Dropout可以有效地提高模型的性能和稳定性,特别是在深层神经网络中。
Dropout只是在训练中把神经元进行丢弃并训练,在预测时网络中的神经元并没有被丢弃。
Dropout前后,输入的期望值是相同的。
被正确识别为正样本的比例。
召回率是在深度学习中评估模型性能的一个指标,它表示模型能够正确识别正类样本的比例。例如,如果我们的模型是用来识别猫的图片,那么召回率就是在所有真正是猫的图片中,有多少被模型预测为猫的图片。召回率越高,说明模型越能覆盖正类样本,但也可能导致更多的误报。召回率的计算公式是:
其中,真正类是指模型正确预测为正类的样本数,假负类是指模型错误预测为负类的样本数(总的来说,就是检测的所有样本中为正确的预测的百分率)。
TP(True positives):正样本被正确识别为正样本。
TN(True negatives):负样本被正确识别为负样本。
FP(False positives):假的正样本,即负样本被错误识别为正样本。
FN(False negatives):假的负样本,即正样本被错误识别为负样本。
Precision就是在识别出来的正样本中,True positives所占的比率。
Precision=TP/(TP+FP)
F1 score为精确率与召回率的调和均值,是用来衡量二分类模型精确度的一种指标。
F1=2*(Precision*Recall) / (Precision+Recall)
F1是一种用来评估分类模型性能的指标,它是精确率(precision)和召回率(recall)的调和平均数。
精确率表示预测为正类的样本中真正属于正类的比例,召回率表示真正属于正类的样本中被预测为正类的比例。
F1的取值范围是0到1,越接近1表示模型的性能越好,越接近0表示模型的性能越差。
F1可以用来衡量二分类或多分类问题的效果,也可以用来考虑类别不平衡的情况。
在深度学习中,F1可以作为一个优化目标或一个评价指标,帮助我们选择更合适的模型
侧监督(side supervision)是一种在深度学习中使用额外的监督信息来辅助训练模型的方法。侧监督的目的是利用一些与主任务相关但不完全相同的辅助任务,来提高模型的泛化能力和解释性。侧监督的一种常见形式是在每个隐藏层添加一个分类器,这样就可以为每个隐藏层提供直接的反馈,促进特征的学习。
在深度学习中,消融分析(ablation analysis)是一种用来评估模型性能的方法,它通过移除或替换模型中的某些部分,来观察这些部分对模型结果的影响。消融分析可以帮助我们理解模型的工作原理,找出模型中最重要或最不重要的部分,以及优化模型的结构和参数。消融分析有狭义和广义之分,狭义的消融分析是指去除模型中的某个模块或层,广义的消融分析是指改变模型中的任何一个因素,比如超参数、输入特征、训练数据等。消融分析通常会设计一个表格,列出不同的实验设置和对应的评价指标,以便比较和分析。
统一通道(uniform channel)是一种在深度学习中使用相同的通道数来构建卷积神经网络的方法。统一通道的优点是可以减少模型的参数量,降低计算复杂度,提高模型的效率和泛化能力。统一通道的缺点是可能会损失一些特征的多样性和表达能力,导致模型的性能下降。统一通道的应用场景是一些对计算资源和时间有限制的任务,比如图像分类、目标检测、语音识别等
批量归一化层(Batch Normalization,BN)是一种深度学习中常用的数据归一化方法,它可以加快模型的训练速度,提高模型的泛化能力,减少对初始化和正则化的依赖,缓解梯度消失或爆炸的问题。
批量归一化层的作用是对每个小批量(mini-batch)的数据进行归一化处理,使得每层的输入数据都服从均值为0,方差为1的正态分布。这样可以减少数据之间的差异性,降低数据分布的变化对网络训练的影响,也就是缓解了内部协变量偏移(Internal Covariate Shift)的问题。
批量归一化层通常位于卷积层或全连接层与激活函数之间,它需要学习两个参数:一个是缩放因子gamma,用于调整数据的数值范围;另一个是平移因子beta ,用于调整数据的偏移量。这两个参数可以保留数据原有的分布特征,增强网络的表达能力。
批量归一化层在训练和推理时使用的均值和方差是不同的。在训练时,使用当前小批量的均值和方差进行归一化;在推理时,使用训练时所有小批量的均值和方差的期望值进行归一化。这样可以保证推理时数据的稳定性。
在图像处理中,每个颜色通道中的像素值通常具有不同的分布和范围,这种不一致性可能会导致训练出错或网络不收敛等问题。
通过使用Normalize操作,可以将每个通道的像素值标准化为均值为0、标准差为1的分布,使得所有通道的像素值范围和分布一致。
BN层在模型中使用的节点
加入了一个残差块。
当然,可以将残差块放在不同的位置。
一共有两种不同的ResNet块:
总结
·残差块使得很深的网络更加容易训练
·甚至可以训练一千层的网络
·残差网络对随后的深层神经网络设计产生了深远影响,无论是卷积类网络还是全连接类网络。
在深度学习中,参数数量是指模型中需要训练的参数的个数,也就是模型的复杂度和大小的一种衡量指标。参数数量的多少会影响模型的性能、内存占用、训练速度和泛化能力等方面。参数数量的计算方法取决于模型的结构和层类型,一般来说,有以下几种常见的情况:
对于全连接层(FC),**参数数量等于输入神经元的个数乘以输出神经元的个数,再加上输出神经元的个数(偏置项)。**例如,如果一个全连接层的输入是78400维的向量,输出是4096维的向量,那么该层的参数数量为(78400+1)*4096=321126400。
对于卷积层(Conv),**参数数量等于输入通道数乘以卷积核的宽度、高度和输出通道数,再加上输出通道数(偏置项)。**例如,如果一个卷积层的输入是3通道的图像,卷积核的大小是11×11,输出通道数是96,那么该层的参数数量为(3*11*11+1)*96=34944。
对于池化层(Pool),参数数量为零,因为池化层不涉及可训练的参数,只是对输入进行下采样或者最大值、平均值等操作。
对于批量归一化层(BN),参数数量等于输出通道数的两倍,因为该层需要学习每个通道的缩放因子和平移因子。
如果要计算整个模型的参数数量,只需要将各个层的参数数量相加即可。有些深度学习框架(如PyTorch)可以自动计算模型的参数数量。如果要将参数数量换算成模型大小(MB),还需要考虑每个参数所占用的字节。一般来说,深度学习中使用32位浮点数来存储参数,那么每个参数占用4个字节。例如,如果一个模型有6000万个参数,那么它占用的内存大小为6000万*4/1024/1024=228.88MB。
**Flops是一种用来衡量深度学习模型的计算复杂度和速度的指标,它表示模型在前向传播时进行的浮点运算次数。**浮点运算包括加法、减法、乘法和除法等操作。**Flops的计算方法取决于模型的结构和层类型,不同的层有不同的计算公式。**一般来说,卷积层和全连接层是最耗费计算资源的层,它们的Flops可以根据输入输出通道数、卷积核大小、特征图大小等因素来计算。
Flops可以用来评价模型的性能、内存占用、训练速度和泛化能力等方面。**一般来说,Flops越高,模型越复杂,需要的计算资源越多,但也可能表示更高的表达能力和精度。Flops越低,模型越简单,需要的计算资源越少,但也可能表示更低的表达能力和精度。**Flops的选择需要根据具体的任务和数据集来确定,一般需要通过实验来调整。
在深度学习中,卷积核和滤波器是两个相关但不完全相同的概念。
卷积核是指一个二维的权重矩阵,它用于对输入数据进行逐元素的乘法和加法运算,从而提取特征。
滤波器是指一个三维的结构,它由多个卷积核堆叠而成,每个卷积核对应输入数据的一个通道。滤波器可以看作是一个三维的卷积核,它可以对输入数据的高度、宽度和深度进行卷积运算,从而生成一个输出通道。
例如,如果输入数据是一个RGB图像,那么它有三个通道,分别表示红色、绿色和蓝色。如果我们想要对这个图像进行卷积运算,我们需要一个滤波器,它由三个卷积核组成,每个卷积核的大小是3×3,分别对应输入图像的三个通道。这样,我们就可以将这个滤波器看作是一个3×3×3的三维卷积核,它可以在输入图像上滑动,并在每个位置执行乘法和加法运算,得到一个输出值。这个输出值就是输出通道中的一个元素。如果我们有多个滤波器,那么我们就可以得到多个输出通道,从而形成输出层。
在深度学习框架中,**池化层的步幅和池化窗口的大小一般是相同的。**当然,也可以自己指定。
在深度学习中,池化层是一种用于对输入数据进行降采样的操作,它可以减少数据量和计算复杂度,同时保留重要的特征信息。池化层通常位于卷积层之后,可以提高模型的平移和旋转不变性,防止过拟合。
池化层的常见类型有最大值池化、均值池化、随机池化、中值池化和分数阶最大值池化等,它们有不同的计算方式和优缺点。
最大值池化是最常用的一种池化方式,它选择每个区域中的最大值作为输出,可以学习到图像的边缘和纹理结构。
均值池化是计算每个区域中的平均值作为输出,可以减小估计均值的偏移,提高模型的鲁棒性。
随机池化是根据每个区域中元素的概率随机选择一个值作为输出,可以增加模型的多样性和泛化能力。
中值池化是选择每个区域中的中位数作为输出,可以抗噪和保留边缘信息。
分数阶最大值池化是一种灵活的池化方式,它可以根据给定的比例因子生成不规则的区域,并进行最大值池化。
ResNet34是一种深度残差神经网络,它是ResNet的一种变体,由34层卷积层和快捷连接组成。
它和ResNet的联系是,它都使用了残差模块,即在每个卷积层后面添加一个快捷连接,将输入和输出相加,从而缓解了梯度消失和退化问题,提高了模型的训练效率和泛化能力。
ResNet34的主要特点是:
在深度学习中,全连接层是一种常用的神经网络层类型,它可以将输入特征与每个神经元之间的连接权重进行矩阵乘法和偏置加法操作,从而得到输出结果。**全连接层通常位于网络的最后一层,用于输出预测结果,如分类、回归等任务。**全连接层的参数数量非常大,因此容易出现过拟合的情况。为了避免过拟合,可以使用一些正则化方法,如Dropout、L1/L2正则化等。
**全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器"的作用。**如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示′映射到样本标记空间的作用。
简单来说:它把特征值整合到一起,输出为一个值。这样做有一个什么好处:就是大大减少特征位置对分类带来的影响。
注:样本标记空间也叫样本输出空间
逐点卷积(pointwise convolution)是一种使用1x1的卷积核对输入特征图进行卷积操作的方法,主要作用是对特征图进行升维或降维,以增加或减少通道数。逐点卷积可以与深度卷积(depthwise convolution)结合,形成深度可分离卷积(depthwise separable convolution),这种卷积方式可以减少参数量和计算量,提高网络的效率。
在深度学习中,binary focal loss是一种用于解决分类问题中的类别不平衡的损失函数。它是基于交叉熵损失的一种改进,通过增加一个调节因子,使得模型对于难以分类的样本给予更大的权重,而对于容易分类的样本给予更小的权重。这样可以减少模型对于多数类别的过拟合,提高对于少数类别的识别能力。
在深度学习中,**动量(momentum)是一种用于加速梯度下降算法的技术,它可以克服高曲率、小梯度或噪声梯度等问题,提高优化的效率和稳定性。**动量的思想是在更新参数时,不仅考虑当前的梯度,还考虑之前的梯度的累积效果,类似于物理中的动量守恒,使得参数在一个方向上持续移动,避免在其他方向上的震荡。动量的数学表达式为:
在深度学习中,投影头(projection head)是一种用于提取特征或表征的网络结构,它通常是一个或多个全连接层,将输入的高维特征映射到一个低维的向量空间,以便于进行后续的任务,如对比学习、聚类、分类等。投影头的目的是将输入的特征转换为一个更有意义或更有区分度的表征,以提高模型的性能。投影头的设计和参数取决于具体的应用场景和目标,没有统一的标准。
在深度学习中,**parties一般是指参与分布式训练( 比如联邦学习)的不同节点或实体,它们之间需要通过通信来协调和同步模型的参数或梯度。**parties的数量、位置、连接方式等都会影响通信效率和模型性能。一般来说,parties越多,通信开销越大,训练速度越慢,但是可能会提高模型的泛化能力和鲁棒性。parties之间的连接方式可以是全连接、环形、星形、树形等,不同的拓扑结构有不同的优缺点。parties的位置也会影响通信延迟和带宽,例如跨地域或跨机构的分布式训练会面临更大的挑战。
在深度学习中,**异质性(heterogeneity)**是指不同的数据或模型之间存在的差异或多样性。异质性可以有不同的来源和表现,比如:
准确率(Accuracy):模型(分类器)到底分对了多少?
sum(y == y_hat) / y.size
精确率(Precision):返回的图片中正确的有多少?
sum((y_hat == 1) & (y == 1)) / sum(y_hat == 1)
召回率(Recall):正确的图片里共有多少被返回了?
sum((y_hat == 1) & (y == 1)) / sum(y == 1)
F1值:(2*Precision*Recall) / (Precision + Recall)
Fβ值:(1+β^2) * [(Precision*Recall) / (β^2 * Precision + Recall)] (其中Recall的重要性是Precision的β倍)
在实际的实验中,并不能一味的要求召回率和精确率其中的一者高,因为这两者是一个此消彼长的关系。
因此,又有了F1值:精确率(Precision)和召回率(Recall)的调和平均值。
另外,F1值是Fβ值的一个特殊情况。
特殊地,对于二分类来说,以上四个指标的计算公式如下:
Non-IID data(非独立同分布数据)是指数据之间不满足独立同分布的性质,即数据的分布可能随着时间、空间、来源等因素而发生变化,或者数据之间存在某种相关性或依赖关系。Non-IID data在现实世界中很常见,比如用户的行为数据、传感器的采集数据、社交网络的结构数据等。Non-IID data给机器学习的建模和训练带来了一些挑战,比如如何处理数据的异质性、如何减少数据的偏差、如何提高模型的泛化能力等。为了解决这些问题,一些新的机器学习框架和方法被提出,比如联邦学习、迁移学习、元学习等。
dataidxs 是一个深度学习中常用的变量名,表示数据集中的索引。不同的深度学习框架或算法可能有不同的定义和用法,但一般来说,dataidxs 是一个一维或二维的数组,存储了数据集中每个样本或每个批次的索引。例如,在 PyTorch 中,dataidxs 可以是一个 DataLoader 对象的属性,用于随机打乱数据集并按照指定的批次大小分割数据集。在 TensorFlow 中,dataidxs 可以是一个 tf.data.Dataset 对象的方法,用于返回数据集中每个元素的索引。dataidxs 的作用是方便我们对数据集进行切分、采样、分组等操作,从而提高深度学习的效率和性能。
权重衰减是一种常用的正则化技术,它通过对模型的权重参数进行惩罚来实现正则化。权重衰减的作用是防止模型过拟合,即在训练集上表现很好,但在测试集或新数据上表现很差的情况。权重衰减如何抑制过拟合呢?简单来说,就是通过在损失函数中加入一个与权重平方成正比的项,使得模型在优化损失的同时,也要尽量减小权重的大小,从而避免权重过大导致的过拟合。具体来说,假设原来的损失函数为 L(θ),其中 θ 表示模型的所有权重参数,那么加入权重衰减后,新的损失函数为 L’(θ) = L(θ) + λ/2 * ∑θ_i^2,其中 λ 是一个正的超参数,用来控制权重衰减的强度,∑θ_i^2 是所有权重参数的平方和。可以看出,当 λ 较大时,模型会更倾向于选择较小的权重参数,从而降低模型的复杂度和拟合能力;当 λ 较小时,模型会更倾向于选择较大的权重参数,从而提高模型的复杂度和拟合能力。因此,我们需要根据数据集的大小和特征来合理地选择 λ 的值,以达到最佳的泛化效果。
在PyTorch中,一个模型 (torch.nn.Module)的可学习参数(也就是权重和偏置值)是包含在模型参数 (model.parameters ())中的,一个状态字典就是一个简单的 Python 的字典,其键值对是每个网络层和其对应的参数张量。
state_dict状态字典可以用来保存和加载模型,方便我们在不同的设备或环境中使用模型。
例如,我们可以使用以下代码来保存和加载模型的状态字典:
保存模型的状态字典
torch.save(model.state_dict(), “model.pth”)
加载模型的状态字典
# 创建一个相同结构的模型
model = Net()
model.load_state_dict(torch.load(“model.pth”))
关于net.state_dict()中的k,v
k是键,表示层的参数名,例如’conv1.weight’或’fc.bias’;v是值,表示层的参数张量
with torch.no_grad()是一个用于神经网络推理阶段的上下文管理器,它的作用是在计算张量时不需要计算梯度,从而节省内存和提高效率。with torch.no_grad()的使用场景有以下几种:
ODS是一种深度学习的评估指标,它表示最优数据集比例(Optimal Dataset Scale)。ODS的含义是,在边缘检测任务中,为所有图像设置同样的阈值,使得整个数据集上的F-score最大。F-score是一种综合了精确率和召回率的指标,它反映了边缘检测的效果。ODS可以用来比较不同的边缘检测算法或模型在同一个数据集上的性能。
OIS是一种深度学习的评估指标,它表示最优图像比例(Optimal Image Scale)。OIS的含义是,在边缘检测任务中,为每一张图像设置不同的阈值,使得该图像上的F-score最大。F-score是一种综合了精确率和召回率的指标,它反映了边缘检测的效果。OIS可以用来比较不同的边缘检测算法或模型在单个图像上的性能。
在深度学习中,编码器-解码器架构是一种用于自动学习特征表示的模型结构。它由两部分组成:编码器和解码器。
编码器将输入数据转换为低维度的表示,
解码器则将该低维度表示转换回原始数据空间。
编码器-解码器架构有很多应用领域和具体实现方式,例如:
自编码器(autoencoder):用于特征提取和数据压缩,编码器和解码器可以是多层感知机(MLP)或卷积神经网络(CNN)等结构。
变分自编码器(Variational Autoencoder,VAE):用于数据生成和采样,利用概率模型的思想,通过学习数据的分布来生成新的数据。
生成对抗网络(Generative Adversarial Network,GAN):用于生成高质量的图像、音频等数据,由生成器和判别器组成,生成器通过学习生成与真实数据相似的样本,而判别器则尝试区分真实数据和生成器生成的数据。
神经网络机器翻译(Neural Machine Translation,NMT):用于自然语言处理,往往是LSTM-LSTM的编码-解码框架,编码器将源语言句子转换为语义向量,解码器则将语义向量转换为目标语言句子。
在深度学习中,注意力机制(Attention Mechanism)是一种模仿人类视觉和认知系统的方法,它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制,神经网络能够自动地学习并选择性地关注输入中的重要信息,提高模型的性能和泛化能力。
注意力机制的本质是学出一个权重分布,然后作用在特征上。这个权重可以保留所有的分量,叫加权(Soft Attention),也可以按某种采样策略选取部分分量(Hard Attention)。这个权重可以作用在原图上,如目标物体检测;也可以作用在特征图上,如 Image-Caption。这个权重可以作用在空间尺度上,也可以作用于 Channel 尺度上,给不同通道的特征加权。这个权重可以作用在不同时刻上,如机器翻译。
注意力机制有多种类型,比如自注意力机制(Self-Attention),空间注意力机制(Spatial Attention)和时间注意力机制(Temporal Attention)等。自注意力机制的基本思想是,在处理序列数据时,每个元素都可以与序列中的其他元素建立关联,而不仅仅是依赖于相邻位置的元素。空间注意力机制的基本思想是,在处理图像数据时,为每个像素分配一个权重,以便在处理每个像素时专注于最相关的部分。时间注意力机制的基本思想是,在处理视频数据时,为每个帧分配一个权重,以便在处理每个帧时专注于最相关的部分。
端到端的深度学习是一种使用单个神经网络来完成一个任务的方法,而不是将任务分解为多个步骤或子任务。例如,如果你想要从一张图片中识别出文字,你可以使用一个端到端的深度学习模型,直接输入图片,输出文字。这样,你就不需要先进行图像预处理、文字检测、文字分割、文字识别等步骤。
端到端的深度学习的优点是它可以简化模型的设计和训练过程,让模型自己从数据中学习到最合适的特征和表示。端到端的深度学习的缺点是它可能需要大量的数据和计算资源,以及对数据质量和标注的高要求。
感受野是卷积神经网络中一个重要的概念,它指的是**特征图上的某个点能看到的输入图像的区域大小。**也就是说,特征图上的点是由输入图像中感受野大小区域的计算得到的。感受野的大小可以反映每一层神经元的抽象层次,越大的感受野意味着越全局,越高层的特征,越小的感受野则表示越局部,越细节的特征。
感受野的计算公式如下:
其中,RFi+1表示当前层的感受野,RFi表示上一层的感受野,k表示卷积核的大小,Si表示之前所有层的步长的乘积
感受野有理论感受野和有效感受野之分,理论感受野通常很大,而有效感受野往往小于理论感受野,因为输入层中边缘点的使用次数明显比中间点要少,因此作出的贡献不同。有效感受野可以通过不同的初始化权重方法和框架改变方法来增大。
哪些操作能改变感受野?
能改变的操作:
Convolution Layer 卷积层
Deconvolution Layer 反卷积层
Pooling Layer 池化层
Residual Connection 残差连接
Concatenation 合并连接
不能改变的操作:
Non-linear Layer 非线性激活
Normalization Layer 规范化
通常用来做上采样
卷积不会增大输入的高宽,通常要么不变、要么减半
转置卷积则可以用来增大输入高宽
工作原理:
为什么称之为转置?
·对于卷积Y=X★W
·可以对W构造一个V,使得卷积等价于矩阵乘法Y’ = VX’
·这里Y’, X’是Y, X对应的向量版本
·转置卷积则等价于Y’=VTX’
·如果卷积将输入从(h,w)变成了(h’,w’)
·同样超参数的转置卷积则从(h’,w’)变成(h,w)
·转置卷积是一种卷积
·它将输入和核进行了重新排列
·同卷积一般是做下采样不同,它通常用作上采样
·如果卷积将输入从(h,w)变成了(h’,w’), 同样(转置卷积)超参数下它将(h’,w)变成(h,w)
同反卷积的关系
·数学上的反卷积(deconvolution)是指卷积的逆运算
·如果Y=con(X,K),那么X=deconv(Y,K)
·反卷积很少用在深度学习中
·我们说的反卷积神经网络指用了转置卷积的神经网络
总结
·转置卷积是一种变化了输入和核的卷积,来得到上采用的目的
·不等同于数学上的反卷积操作
在深度学习中,上采样和下采样是常用的图像处理技术,用于调整图像的分辨率或尺寸。
下采样是将图像从高分辨率减少到低分辨率,
而上采样则相反,将图像从低分辨率增加到高分辨率。
下采样的方式比较常用的有两种:池化和步长为2的卷积。池化是一种采样层,它可以通过取邻域内的最大值、平均值、求和或随机值来降低特征的维度并保留有效信息。步长为2的卷积是一种卷积层,它可以通过每隔一个像素点进行卷积运算来减少特征的大小1。
上采样的方式比较常用的有三种:插值、反池化和转置(反)卷积。插值是一种插入新像素点的方法,它可以根据邻近像素点的值来计算新像素点的值,常见的插值方法有最近邻插值、双线性插值和双三次插值3。反池化是一种与池化相反的操作,它可以通过记录池化过程中被选中的位置来恢复原始特征的大小。反卷积(也叫转置卷积)是一种特殊的卷积,它可以通过使用转置的卷积核来实现特征图的上采样。
**上采样和下采样通常与卷积神经网络(CNN)中的池化操作和反卷积(或转置卷积)操作结合使用。**它们可以在保持旋转、平移、伸缩不变性等特性的同时,提高图像处理任务的效果和效率。
将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素。
优点:实现简单,计算速度快
缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对于图像质量的影响较大。
因此,当处理精度要求较高的图像时,通常会采用更加精细的插值算法,如双线性插值、双三次插值等。
原理如图:
分为角对齐和边对齐
(a)是普通的卷积操作
(b)、©、(d)是可变形卷积(deformable convolution,即DConv)
可变形卷积实际是指标准卷积操作中采样位置增加了一个偏移量offset,这样卷积核就能在训练过程中扩展到很大的范围。©(d)是(b)的特例,表明可变形卷积推广了尺度、长宽比和旋转的各种变换。
可变形卷积是一种卷积操作,它可以根据输入特征图的内容动态地调整卷积核的位置和形状。它的目的是让卷积核能够适应不同的物体形状和几何变换,从而提取更准确和有效的特征。
可变形卷积的基本思想是在传统的卷积核上引入一个可学习的偏移量,使得卷积核的**每个采样点都可以在特征图上自由移动。**这样,卷积核就不再是固定的方形网格,而是可以变成任意形状,以适应物体的轮廓。
由于偏移后的采样点可能不是整数坐标,因此需要使用双线性插值来得到其像素值。
输出通道维度是1,用sigmoid
输出通道维度是2,用softmax
1. 激活函数作用
激活函数(Activation functions)对于人工神经网络 [1] 模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。**引入激活函数是为了增加神经网络模型的非线性。**没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
(1)如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。
(2)如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
2. 激活函数类型
2.1 softmax函数(一般只用于最后一层进行分类,准确说应该叫分类函数了)
深度学习中使用Softmax进行分类时,如果我们的结果有10类,那么最后的神经元输出就是10,也就是输出有10个数,但是直接输出这10个数有时候并不是特别好,这时候添加一个softmax,通过softmax这个函数,上面的10个数就转换为了概率,输出还是10个数,它们加起来就等于1,这样概率最大的就是我们想要的结果,我们尽可能让这个数接近1,其它9个数接近0。
输出是几类,softmax的结果就是几个。前面经过了5个神经元,然后再经过softmax,那softmax的输出值还是5个,不改变输入值的个数,只改变值,使其符合概率分布。
2.2 Sigmoid
Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,
Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间。公式如下:
函数图像如下:
上图使用的是Sigmoid函数,预测出来的三个数都是相互独立的,加起来并不等于1(和softmax不一样,softmax预测出来的数加起来等于1)
2.3 Relu函数
2.3 tanh 函数(the hyperbolic tangent function,双曲正切函数)
总结:
Sigmoid: 函数饱和使梯度消失。sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时
会饱和:在这些区域,梯度几乎为0。
Tanh: 和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心
的。
Relu:
Leaky ReLU:
1Leaky ReLU是为解决“ReLU死亡"问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是
给出一个很小的负数梯度值,比如0.01。所以其函数公式为
f(x)=1(x<0)(ax)+1(x>=0)(x)
其中a是一个小的常量。有些研究者的论文指出这个
激活函数表现很不错,但是其效果并不是很稳定。何凯明等人在2015年发布的论文Delving Deep
into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。(但
是这里的不是固定下来的,而是可学习的)然而该激活函数在在不同任务中均有益处的一致性并没
有特别清晰。
总之,那么该用那种呢?用RLU非线性函数。注意设置好学习率,或许可以监控你的网络中死亡的神经元占的比例。如果单元死亡问题困扰你,就试试Leaky ReLU,不要再用sigmoid了。
在二分类中:
输出通道维度是1,用sigmoid
输出通道维度是2,用softmax
在多分类中:
多分类用softmax,同时注意算不算背景,多分类考虑不考虑其它,语义分割考虑不考虑背景,考虑的话需要在类别的基础上加1,比如20+1。
为什么多分类用softmax:
sigmoid和softmax的区别就是互斥与否
同样输出10类,输出通道是10,
(1)用sigmoid的话,表示这10类互不相关,得到的10个概率值中的每个值代表输入这类的概率和不属于这类的概率,0-1之间的值。
比如第4个值,代表输入第4类的值概率和不属于第4类的概率,和其它9个值没关系。
经过sigmoid输出的10个值互不影响,只关注某一类的可能性概率是多大,每一类都是二分类,所以加起来也不等于1,可以是第一类得到的值0.9,第二个也是0.9。
(2)用softmax就不一样了,它要综合考虑10个类,属于每个类的概率,这10个类相互影响,加起来是等于1的。
到底用哪个?
(1)分类任务中,输出为1,用sigmoid,输出不为1,用softmax
(2)语义分割中,输出为1,用sigmoid,输出不为1,用softmax
(3)特殊情况,二分类任务和二分类语义分割,输出通道维度可以是1,也可以是2。输出为1,用sigmoid,输出为2,用softmax。一半情况下,二分类任务输出通道为1,用sigmoid。二分类语义分割输出维度通道设为2,用softmax。
当然二分类任务和二分类语义分割输出通道为1或为2都行,效果都 差不多。
(4)多标签任务中,就是一个图像可以包括人,猫,房子等多标签任务,一般用sigmoid,因为它们互不影响,究其本质还是看类别 之间概率是不是相互影响来确定用sigmoid还是softmax,这是由它 们的计算公式来区别的,sigmoid计算公式只用到了1个输入, softmax的输入是多个。
二分类任务
(1)二分类任务
(2)输出通道设为1
(3)用sigmoid
二分类语义分割
(1)二分类语义分割
(2)输出通道设为2
(3)用softmax
多分类任务和语义分割
(1)多分类任务和多分类语义分割
(2)输出通道为n>2
(3)用softmax
对应的损失函数
二分类和多分类都叫交叉熵损失函数,一个是sigmoid交叉熵损失函数,一个是softmax交叉熵损失函数
用的是sigmoid,就用binary_cross_entropy
用的是softmax,就用softmax_cross_entropy
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。