本文记录了我在学习深度学习的过程中遇到过的不懂的知识点,为了方便翻阅,故将其发表于此,随时更新,供大家参考。
深度学习常见知识点
1. 测试精度和训练精度
在深度学习中,测试精度和训练精度是两个重要的指标,它们分别代表了模型在测试集上的分类正确率和训练集上的分类正确率。测试集是用来评估模型泛化能力的数据集,它不参与模型的训练过程。训练集是用来训练模型参数的数据集,它直接影响模型的学习效果。
测试精度和训练精度之间的大小关系,可以反映出模型是否存在过拟合或欠拟合的问题。过拟合是指模型在训练集上表现很好,但在测试集上表现很差,说明模型过于复杂,学习了训练集的噪声或特异性,导致泛化能力下降。欠拟合是指模型在训练集和测试集上都表现不好,说明模型过于简单,没有学习到数据的内在规律,导致预测能力不足。
一般来说,我们希望测试精度和训练精度都尽可能高,且相差不大。
如果测试精度远低于训练精度,说明存在过拟合,可以通过增加数据量、使用正则化、dropout等方法来缓解。如果测试精度和训练精度都很低,说明存在欠拟合,可以通过增加特征、使用更复杂的模型、减小正则化系数等方法来改善。
如果测试精度高于训练精度,这种情况比较少见,可能有以下几种原因:
- 测试集的数据分布与训练集不一致,导致测试集更容易被模型分类正确。
- 训练集的数据做了一些增强或变换,增加了难度,而测试集没有做相同的处理。
- 训练过程中使用了dropout等技术,降低了训练精度,但在测试时关闭了dropout,提高了测试精度。
- 训练和测试的评价指标不一样,比如训练时用的是交叉熵损失函数,而测试时用的是准确率。
2. 超参数
超参数是一些用来控制模型结构、功能、效率等的调节旋钮,它们不能直接从数据中学习,而需要人为预先设定或优化。超参数的不同选择会影响模型的性能和效果。一些常见的超参数有:
- 学习率(learning rate):决定了每次梯度下降的步长,影响了模型的收敛速度和稳定性。
- 迭代次数(epochs):决定了模型训练的总轮数,影响了模型的拟合程度和泛化能力。
- 层数(num of hidden layers):决定了模型的深度,影响了模型的复杂度和表达能力。
- 每层神经元的个数(num of hidden layer units):决定了模型的宽度,影响了模型的复杂度和表达能力。
- 激活函数(activation function):决定了模型的非线性程度,影响了模型的逼近能力和梯度传播情况。
- 批大小(batch size):决定了每次梯度下降使用的样本数量,影响了模型的收敛速度和稳定性。
- 优化器(optimizer):决定了梯度下降的算法,影响了模型的收敛速度和稳定性。
- 正则化(regularization):决定了模型对参数的惩罚程度,影响了模型的拟合程度和泛化能力。
- dropout:决定了模型在训练过程中随机丢弃一些神经元的概率,影响了模型的拟合程度和泛化能力。
3. 训练数据集、验证数据集和测试数据集
在深度学习中,训练数据集、验证数据集和测试数据集是三种不同的数据集,它们各自有不同的作用和区别。
- **训练数据集(training dataset)**是用来训练模型的数据,它可以帮助模型学习到数据的特征和规律,从而实现预测或分类的目的。
- **验证数据集(validation dataset)**是用来评估模型的性能和调整模型的超参数的数据,它可以帮助模型避免过拟合或欠拟合的问题,从而提高模型的泛化能力。(相对于测试数据集,验证数据集更常用。)
- **测试数据集(test dataset)**是用来测试模型在未知数据上的表现的数据,它可以反映模型在真实场景中的准确度和可靠性。
三种数据集之间的区别主要有以下几点:
- 三种数据集应该是互相独立且分布相似的,不能有重复或相似的数据,否则会影响模型的评估和测试。
- 三种数据集所占的比例一般取决于数据量的大小和超参数的数量,一般来说,训练集占比最大,验证集和测试集占比较小。对于小规模样本集(几万量级),常用的分配比例是 60% 训练集、20% 验证集、20% 测试集。对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。
- 三种数据集在模型训练和评估过程中使用的频率不同,训练集会被多次使用,验证集会被少量使用,测试集只会被一次使用。一旦使用了测试集,就不能再修改模型或超参数。
4. K-则交叉验证
在深度学习中,K-则交叉验证是一种评估模型性能和选择最优超参数的方法。它的基本思想是将原始数据集分成K个子集,每次选择一个子集作为验证集,其余的K-1个子集作为训练集,进行K次训练和验证,然后取K次验证结果的平均值作为模型的最终评估指标。这样可以充分利用数据集,避免数据划分的随机性对模型评估的影响,提高模型的泛化能力。
具体来说,假设我们有一个数据集D,包含m个样本,我们想要训练一个深度学习模型M,并且选择合适的超参数H(例如学习率、批大小、正则化系数等)。我们可以按照以下步骤进行K-则交叉验证:
- 第一步:将数据集D随机分成K个大小相等的子集D_1, D_2, …, D_K。
- 第二步:对于每个子集D_i(i=1,2,…,K),将其作为验证集,将其他的K-1个子集合并作为训练集,用训练集训练模型M,并用验证集测试模型M的性能指标E_i(例如准确率、损失值等)。
- 第三步:计算K次验证结果的平均值E_mean = (E_1 + E_2 + … + E_K) / K,作为模型M在超参数H下的最终评估指标。
- 第四步:尝试不同的超参数H,并重复上述步骤,找到使得E_mean最大(或最小)的超参数H*,作为最优超参数。
- 第五步:使用最优超参数H*和全部数据集D重新训练模型M,并保存训练好的模型。
5. 模型容量
在深度学习中,模型容量是指模型的拟合能力或复杂度的度量,它反映了模型可以表示的函数族的大小和多样性。
一般来说,模型容量越大,模型可以拟合的函数越复杂,模型的表达能力越强。但是,模型容量也会影响模型的泛化能力,即在未见过的数据上的表现。
如果模型容量过小,模型可能会欠拟合,即在训练集上表现不佳;如果模型容量过大,模型可能会过拟合,即在训练集上表现很好,但在测试集上表现很差。
因此,在深度学习中,选择合适的模型容量是一个重要的问题,需要在拟合能力和泛化能力之间找到一个平衡点。有一些方法可以用来控制或调节模型容量,例如:
- 改变模型的结构或参数数量。比如,在神经网络中,增加或减少层数、神经元个数、连接方式等,都会影响模型容量。
- 添加正则化项或dropout等技术。这些技术可以对模型参数施加一些约束或惩罚,使得模型更倾向于选择简单或稀疏的解,从而降低模型容量。
- 使用交叉验证或早停等策略。这些策略可以通过划分数据集或监控验证误差等方式,来评估不同容量的模型的性能,并选择最优的容量。
6. 过拟合和欠拟合
在深度学习中,过拟合和欠拟合是两种常见的模型训练问题,它们都会影响模型的泛化能力,即在新数据上的表现。
**过拟合(overfitting)**是指模型在训练数据集上表现很好,但在测试数据集或未见过的数据上表现很差,说明模型学习了训练数据中的噪声或无关信息,而没有捕捉到数据背后的真实规律。过拟合通常发生在模型复杂度过高、训练数据量过少或训练时间过长的情况下。
**欠拟合(underfitting)**是指模型在训练数据集上表现不佳,也无法在测试数据集或未见过的数据上表现好,说明模型没有学习到足够的信号或有用信息,而只是做了一些简单的拟合。欠拟合通常发生在模型复杂度过低、训练数据量过大或训练时间过短的情况下。
为了解决过拟合和欠拟合的问题,我们需要在模型复杂度和数据量之间找到一个平衡点,使得模型既能够充分学习数据中的信号,又能够避免学习数据中的噪声。一些常用的方法有:
- 使用验证集或交叉验证来评估模型性能和选择最优的超参数。
- 使用正则化或权重衰减来惩罚模型参数的大小,防止模型过于复杂。
- 使用dropout或batch normalization等技术来随机干扰模型的训练过程,增加模型的鲁棒性。
- 使用数据增强或生成对抗网络等技术来扩充或生成更多的训练数据,减少数据不足的风险。
- 使用早停法或学习率衰减等策略来控制模型的训练时间,防止模型过度拟合。
注:一点点的过拟合并不是坏事。
7. 激活函数
深度学习中,激活函数是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。**激活函数可以增加神经网络的非线性,使得神经网络可以逼近任何非线性函数,从而提高网络的表达能力和泛化能力。**激活函数还可以影响网络的训练效率和稳定性,例如避免梯度消失或爆炸、缓解过拟合等问题。
深度学习中常用的激活函数有很多种,例如Sigmoid、Tanh、ReLU、Leaky ReLU、ELU等。不同的激活函数有各自的优缺点和适用场景,需要根据具体的问题和数据来选择合适的激活函数。
8. Dropout
在深度学习中,Dropout是一种防止过拟合的技术,它的原理是在训练过程中,**随机地将一些神经元的输出置为零,从而减少神经元之间的依赖性,增强网络的泛化能力。**Dropout可以看作是一种模型集成的方法,它相当于同时训练了多个不同的子网络,并在测试时对它们取平均。Dropout可以有效地提高模型的性能和稳定性,特别是在深层神经网络中。
Dropout只是在训练中把神经元进行丢弃并训练,在预测时网络中的神经元并没有被丢弃。
Dropout前后,输入的期望值是相同的。
9. 召回率 Recall
被正确识别为正样本的比例。
召回率是在深度学习中评估模型性能的一个指标,它表示模型能够正确识别正类样本的比例。例如,如果我们的模型是用来识别猫的图片,那么召回率就是在所有真正是猫的图片中,有多少被模型预测为猫的图片。召回率越高,说明模型越能覆盖正类样本,但也可能导致更多的误报。召回率的计算公式是:
其中,真正类是指模型正确预测为正类的样本数,假负类是指模型错误预测为负类的样本数(总的来说,就是检测的所有样本中为正确的预测的百分率)。
10. TP、TN、FP、FN
TP(True positives):正样本被正确识别为正样本。
TN(True negatives):负样本被正确识别为负样本。
FP(False positives):假的正样本,即负样本被错误识别为正样本。
FN(False negatives):假的负样本,即正样本被错误识别为负样本。
11. Precision
Precision就是在识别出来的正样本中,True positives所占的比率。
Precision=TP/(TP+FP)
12. F1
F1 score为精确率与召回率的调和均值,是用来衡量二分类模型精确度的一种指标。
F1=2*(Precision*Recall) / (Precision+Recall)
F1是一种用来评估分类模型性能的指标,它是精确率(precision)和召回率(recall)的调和平均数。
精确率表示预测为正类的样本中真正属于正类的比例,召回率表示真正属于正类的样本中被预测为正类的比例。
F1的取值范围是0到1,越接近1表示模型的性能越好,越接近0表示模型的性能越差。
F1可以用来衡量二分类或多分类问题的效果,也可以用来考虑类别不平衡的情况。
在深度学习中,F1可以作为一个优化目标或一个评价指标,帮助我们选择更合适的模型
13. 侧监督
侧监督(side supervision)是一种在深度学习中使用额外的监督信息来辅助训练模型的方法。侧监督的目的是利用一些与主任务相关但不完全相同的辅助任务,来提高模型的泛化能力和解释性。侧监督的一种常见形式是在每个隐藏层添加一个分类器,这样就可以为每个隐藏层提供直接的反馈,促进特征的学习。
14. 消融分析
在深度学习中,消融分析(ablation analysis)是一种用来评估模型性能的方法,它通过移除或替换模型中的某些部分,来观察这些部分对模型结果的影响。消融分析可以帮助我们理解模型的工作原理,找出模型中最重要或最不重要的部分,以及优化模型的结构和参数。消融分析有狭义和广义之分,狭义的消融分析是指去除模型中的某个模块或层,广义的消融分析是指改变模型中的任何一个因素,比如超参数、输入特征、训练数据等。消融分析通常会设计一个表格,列出不同的实验设置和对应的评价指标,以便比较和分析。
15. 统一通道
统一通道(uniform channel)是一种在深度学习中使用相同的通道数来构建卷积神经网络的方法。统一通道的优点是可以减少模型的参数量,降低计算复杂度,提高模型的效率和泛化能力。统一通道的缺点是可能会损失一些特征的多样性和表达能力,导致模型的性能下降。统一通道的应用场景是一些对计算资源和时间有限制的任务,比如图像分类、目标检测、语音识别等
16. 批量归一化层
批量归一化层(Batch Normalization,BN)是一种深度学习中常用的数据归一化方法,它可以加快模型的训练速度,提高模型的泛化能力,减少对初始化和正则化的依赖,缓解梯度消失或爆炸的问题。
批量归一化层的作用是对每个小批量(mini-batch)的数据进行归一化处理,使得每层的输入数据都服从均值为0,方差为1的正态分布。这样可以减少数据之间的差异性,降低数据分布的变化对网络训练的影响,也就是缓解了内部协变量偏移(Internal Covariate Shift)的问题。
批量归一化层通常位于卷积层或全连接层与激活函数之间,它需要学习两个参数:一个是缩放因子gamma,用于调整数据的数值范围;另一个是平移因子beta ,用于调整数据的偏移量。这两个参数可以保留数据原有的分布特征,增强网络的表达能力。
批量归一化层在训练和推理时使用的均值和方差是不同的。在训练时,使用当前小批量的均值和方差进行归一化;在推理时,使用训练时所有小批量的均值和方差的期望值进行归一化。这样可以保证推理时数据的稳定性。
17. 残差网络(ResNet)
加入了一个残差块。
当然,可以将残差块放在不同的位置。
一共有两种不同的ResNet块:
- 高宽减半的ResNet块(步幅为2)
- 后面接多个高宽不变的ResNet块
总结
·残差块使得很深的网络更加容易训练·甚至可以训练一千层的网络
·残差网络对随后的深层神经网络设计产生了深远影响,无论是卷积类网络还是全连接类网络。
18. 参数数量(Param)
在深度学习中,参数数量是指模型中需要训练的参数的个数,也就是模型的复杂度和大小的一种衡量指标。参数数量的多少会影响模型的性能、内存占用、训练速度和泛化能力等方面。参数数量的计算方法取决于模型的结构和层类型,一般来说,有以下几种常见的情况:
-
对于全连接层(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。
19. 计算量(FLOPs)
**Flops是一种用来衡量深度学习模型的计算复杂度和速度的指标,它表示模型在前向传播时进行的浮点运算次数。**浮点运算包括加法、减法、乘法和除法等操作。**Flops的计算方法取决于模型的结构和层类型,不同的层有不同的计算公式。**一般来说,卷积层和全连接层是最耗费计算资源的层,它们的Flops可以根据输入输出通道数、卷积核大小、特征图大小等因素来计算。
Flops可以用来评价模型的性能、内存占用、训练速度和泛化能力等方面。**一般来说,Flops越高,模型越复杂,需要的计算资源越多,但也可能表示更高的表达能力和精度。Flops越低,模型越简单,需要的计算资源越少,但也可能表示更低的表达能力和精度。**Flops的选择需要根据具体的任务和数据集来确定,一般需要通过实验来调整。
20. 卷积核 和 滤波器
在深度学习中,卷积核和滤波器是两个相关但不完全相同的概念。
卷积核是指一个二维的权重矩阵,它用于对输入数据进行逐元素的乘法和加法运算,从而提取特征。
滤波器是指一个三维的结构,它由多个卷积核堆叠而成,每个卷积核对应输入数据的一个通道。滤波器可以看作是一个三维的卷积核,它可以对输入数据的高度、宽度和深度进行卷积运算,从而生成一个输出通道。
例如,如果输入数据是一个RGB图像,那么它有三个通道,分别表示红色、绿色和蓝色。如果我们想要对这个图像进行卷积运算,我们需要一个滤波器,它由三个卷积核组成,每个卷积核的大小是3×3,分别对应输入图像的三个通道。这样,我们就可以将这个滤波器看作是一个3×3×3的三维卷积核,它可以在输入图像上滑动,并在每个位置执行乘法和加法运算,得到一个输出值。这个输出值就是输出通道中的一个元素。如果我们有多个滤波器,那么我们就可以得到多个输出通道,从而形成输出层。
21. 池化层
在深度学习框架中,**池化层的步幅和池化窗口的大小一般是相同的。**当然,也可以自己指定。
在深度学习中,池化层是一种用于对输入数据进行降采样的操作,它可以减少数据量和计算复杂度,同时保留重要的特征信息。池化层通常位于卷积层之后,可以提高模型的平移和旋转不变性,防止过拟合。
池化层的常见类型有最大值池化、均值池化、随机池化、中值池化和分数阶最大值池化等,它们有不同的计算方式和优缺点。
最大值池化是最常用的一种池化方式,它选择每个区域中的最大值作为输出,可以学习到图像的边缘和纹理结构。
均值池化是计算每个区域中的平均值作为输出,可以减小估计均值的偏移,提高模型的鲁棒性。
随机池化是根据每个区域中元素的概率随机选择一个值作为输出,可以增加模型的多样性和泛化能力。
中值池化是选择每个区域中的中位数作为输出,可以抗噪和保留边缘信息。
分数阶最大值池化是一种灵活的池化方式,它可以根据给定的比例因子生成不规则的区域,并进行最大值池化。
22. ResNet34
ResNet34是一种深度残差神经网络,它是ResNet的一种变体,由34层卷积层和快捷连接组成。
它和ResNet的联系是,它都使用了残差模块,即在每个卷积层后面添加一个快捷连接,将输入和输出相加,从而缓解了梯度消失和退化问题,提高了模型的训练效率和泛化能力。
ResNet34的主要特点是:
- 它使用了两层或三层的卷积层作为基本的残差模块,每个卷积层后面都有一个批量归一化层和一个ReLU激活函数。
- 它在每个残差模块之间使用了步长为2的卷积层或最大池化层来降低特征图的大小,并增加输出通道数。
- 它在每个残差模块的快捷连接上使用了1×1的卷积层来匹配输入和输出的通道数和大小。
- 它在最后使用了一个平均池化层和一个全连接层来得到最终的分类结果。
23. 1x1的卷积层 和 全连接层
- **当输入数据的尺寸是1×1时,1x1的卷积层和全连接层的数学原理是一样的,都是对输入向量和权重矩阵进行乘法和加法运算,得到输出向量。**这时,卷积核的个数就是全连接层的神经元的个数。
- **当输入数据的尺寸大于1×1时,1x1的卷积层和全连接层的输出尺寸就不一样了,1x1的卷积层会保持输入数据的高度和宽度,只改变通道数;而全连接层会将输入数据拉成一维向量,输出尺寸为1×1。**这时,全连接层可以等价于一个卷积核大小和输入数据相同,个数为输出维度的卷积层。
- **1x1的卷积层和全连接层最大的区别就是输入尺寸是否可变,全连接层的输入尺寸是固定的,卷积层的输入尺寸是任意的。**这也决定了两者在模型中的作用不同,全连接层通常用于最后的分类或回归任务,而1x1的卷积层通常用于中间层,进行特征变换或降维等操作。
24. 全连接层
在深度学习中,全连接层是一种常用的神经网络层类型,它可以将输入特征与每个神经元之间的连接权重进行矩阵乘法和偏置加法操作,从而得到输出结果。**全连接层通常位于网络的最后一层,用于输出预测结果,如分类、回归等任务。**全连接层的参数数量非常大,因此容易出现过拟合的情况。为了避免过拟合,可以使用一些正则化方法,如Dropout、L1/L2正则化等。
**全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器"的作用。**如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示′映射到样本标记空间的作用。
简单来说:它把特征值整合到一起,输出为一个值。这样做有一个什么好处:就是大大减少特征位置对分类带来的影响。
注:样本标记空间也叫样本输出空间
25. 逐点卷积
逐点卷积(pointwise convolution)是一种使用1x1的卷积核对输入特征图进行卷积操作的方法,主要作用是对特征图进行升维或降维,以增加或减少通道数。逐点卷积可以与深度卷积(depthwise convolution)结合,形成深度可分离卷积(depthwise separable convolution),这种卷积方式可以减少参数量和计算量,提高网络的效率。
26. Binary Focal Loss
在深度学习中,binary focal loss是一种用于解决分类问题中的类别不平衡的损失函数。它是基于交叉熵损失的一种改进,通过增加一个调节因子,使得模型对于难以分类的样本给予更大的权重,而对于容易分类的样本给予更小的权重。这样可以减少模型对于多数类别的过拟合,提高对于少数类别的识别能力。
27. 动量 momentum
在深度学习中,**动量(momentum)是一种用于加速梯度下降算法的技术,它可以克服高曲率、小梯度或噪声梯度等问题,提高优化的效率和稳定性。**动量的思想是在更新参数时,不仅考虑当前的梯度,还考虑之前的梯度的累积效果,类似于物理中的动量守恒,使得参数在一个方向上持续移动,避免在其他方向上的震荡。动量的数学表达式为:
28. 投影头
在深度学习中,投影头(projection head)是一种用于提取特征或表征的网络结构,它通常是一个或多个全连接层,将输入的高维特征映射到一个低维的向量空间,以便于进行后续的任务,如对比学习、聚类、分类等。投影头的目的是将输入的特征转换为一个更有意义或更有区分度的表征,以提高模型的性能。投影头的设计和参数取决于具体的应用场景和目标,没有统一的标准。
29. Parties
在深度学习中,**parties一般是指参与分布式训练的不同节点或实体,它们之间需要通过通信来协调和同步模型的参数或梯度。**parties的数量、位置、连接方式等都会影响通信效率和模型性能。一般来说,parties越多,通信开销越大,训练速度越慢,但是可能会提高模型的泛化能力和鲁棒性。parties之间的连接方式可以是全连接、环形、星形、树形等,不同的拓扑结构有不同的优缺点。parties的位置也会影响通信延迟和带宽,例如跨地域或跨机构的分布式训练会面临更大的挑战。
30. 异质性
在深度学习中,异质性(heterogeneity)是指不同的数据或模型之间存在的差异或多样性。异质性可以有不同的来源和表现,比如:
- 数据异质性:指数据之间不满足独立同分布(IID)的性质,即数据的分布可能随着时间、空间、来源等因素而发生变化,或者数据之间存在某种相关性或依赖关系。数据异质性在现实世界中很常见,比如用户的行为数据、传感器的采集数据、社交网络的结构数据等。数据异质性给机器学习的建模和训练带来了一些挑战,比如如何处理数据的异质性、如何减少数据的偏差、如何提高模型的泛化能力等。
- 模型异质性:指模型之间存在的结构或参数上的差异。模型异质性可以是有意为之,也可以是无法避免的。有意为之的模型异质性是为了提高模型的表达能力或适应不同的任务或场景,比如混合模型、多任务学习、迁移学习等。无法避免的模型异质性是由于模型训练过程中的随机因素或分布式设置导致的,比如初始化、优化算法、超参数、通信延迟等。模型异质性也会影响机器学习的效果和效率,比如如何度量和评估模型的异质性、如何利用或减少模型的异质性、如何保证模型的一致性和稳定性等。
31. 模型评估
准确率(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β值的一个特殊情况。
特殊地,对于二分类来说,以上四个指标的计算公式如下:
32. Non-IID data(非独立同分布数据)
Non-IID data(非独立同分布数据)是指数据之间不满足独立同分布的性质,即数据的分布可能随着时间、空间、来源等因素而发生变化,或者数据之间存在某种相关性或依赖关系。Non-IID data在现实世界中很常见,比如用户的行为数据、传感器的采集数据、社交网络的结构数据等。Non-IID data给机器学习的建模和训练带来了一些挑战,比如如何处理数据的异质性、如何减少数据的偏差、如何提高模型的泛化能力等。为了解决这些问题,一些新的机器学习框架和方法被提出,比如联邦学习、迁移学习、元学习等。
33. dataidxs
dataidxs 是一个深度学习中常用的变量名,表示数据集中的索引。不同的深度学习框架或算法可能有不同的定义和用法,但一般来说,dataidxs 是一个一维或二维的数组,存储了数据集中每个样本或每个批次的索引。例如,在 PyTorch 中,dataidxs 可以是一个 DataLoader 对象的属性,用于随机打乱数据集并按照指定的批次大小分割数据集。在 TensorFlow 中,dataidxs 可以是一个 tf.data.Dataset 对象的方法,用于返回数据集中每个元素的索引。dataidxs 的作用是方便我们对数据集进行切分、采样、分组等操作,从而提高深度学习的效率和性能。
34. 权重衰减
权重衰减是一种常用的正则化技术,它通过对模型的权重参数进行惩罚来实现正则化。权重衰减的作用是防止模型过拟合,即在训练集上表现很好,但在测试集或新数据上表现很差的情况。权重衰减如何抑制过拟合呢?简单来说,就是通过在损失函数中加入一个与权重平方成正比的项,使得模型在优化损失的同时,也要尽量减小权重的大小,从而避免权重过大导致的过拟合。具体来说,假设原来的损失函数为 L(θ),其中 θ 表示模型的所有权重参数,那么加入权重衰减后,新的损失函数为 L’(θ) = L(θ) + λ/2 * ∑θ_i^2,其中 λ 是一个正的超参数,用来控制权重衰减的强度,∑θ_i^2 是所有权重参数的平方和。可以看出,当 λ 较大时,模型会更倾向于选择较小的权重参数,从而降低模型的复杂度和拟合能力;当 λ 较小时,模型会更倾向于选择较大的权重参数,从而提高模型的复杂度和拟合能力。因此,我们需要根据数据集的大小和特征来合理地选择 λ 的值,以达到最佳的泛化效果。
35. net.state_dict()
在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是值,表示层的参数张量
36. with torch.no_grad():
with torch.no_grad()是一个用于神经网络推理阶段的上下文管理器,它的作用是在计算张量时不需要计算梯度,从而节省内存和提高效率。with torch.no_grad()的使用场景有以下几种:
- 当我们只想使用训练好的模型进行预测或评估时,我们可以使用with torch.no_grad()来避免对模型参数进行梯度更新,这样可以保证模型的参数不会被改变,也可以加快计算速度。
- 当我们想要对带有梯度的张量进行原地运算(in-place operation)时,我们可以使用with torch.no_grad()来阻断梯度的传播,这样可以避免出现运行时错误(RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.)。
- 当我们想要创建一个不带梯度的张量时,我们可以使用with torch.no_grad()来简化代码,这样可以避免使用requires_grad=False参数来创建张量。
37. ODS
ODS是一种深度学习的评估指标,它表示最优数据集比例(Optimal Dataset Scale)。ODS的含义是,在边缘检测任务中,为所有图像设置同样的阈值,使得整个数据集上的F-score最大。F-score是一种综合了精确率和召回率的指标,它反映了边缘检测的效果。ODS可以用来比较不同的边缘检测算法或模型在同一个数据集上的性能。
38. OIS
OIS是一种深度学习的评估指标,它表示最优图像比例(Optimal Image Scale)。OIS的含义是,在边缘检测任务中,为每一张图像设置不同的阈值,使得该图像上的F-score最大。F-score是一种综合了精确率和召回率的指标,它反映了边缘检测的效果。OIS可以用来比较不同的边缘检测算法或模型在单个图像上的性能。