1. 相关理论本节梳理迁移学习理论、ResNet其他系列网络结构和差异等、提升网络性能的方法、具体实现思路和策略等相关内容。迁移学习(Transfer Learning)是一种深度学习方法,其基本原理是通过将已经学习到的知识从源任务迁移到目标任务上,以加速目标任务的学习过程并提高其性能。迁移学习的核心思想是认为不同任务之间存在一定的相关性,因此可以通过共享和转移知识来提高目标任务的学习效果。迁移学习之所以能够应用广泛,有以下几个原因:数据稀缺性:在某些领域,获取大规模标注数据可能是困难或昂贵的。迁移学习可以利用源任务上的大规模数据进行预训练,并将学到的知识迁移到目标任务上,从而减少对目标任务数据的需求。知识共享:源任务上学习到的知识可以包含有用的特征、模式和规律,这些知识可以在目标任务中共享和重用。通过迁移学习,目标任务可以从源任务中受益,获得更好的初始化参数或更鲁棒的特征表示。领域适应:源任务和目标任务可能存在不同的数据分布或特征空间。迁移学习可以通过适应目标任务的特点,调整模型参数或特征表示,从而提高模型在目标任务上的泛化性能。任务相关性:源任务和目标任务之间可能存在一定的相关性,例如它们可能涉及相似的概念或共享一些底层结构。通过迁移学习,可以利用这种相关性,将源任务上学到的知识迁移到目标任务上,提供更好的初始状态或引导目标任务的学习过程。迁移学习的起源可以追溯到生物学中的迁移现象。人类和其他动物在学习新任务时往往能够利用之前学到的知识和经验,这种能力在深度学习中也被借鉴并加以应用。迁移学习的应用非常广泛,以下是一些常见的应用领域:图像分类:在计算机视觉领域,通过在大规模图像数据集上进行预训练,如ImageNet数据集,可以学习到丰富的图像特征。这些预训练的模型可以通过迁移学习用于其他图像分类任务,避免从头开始训练,提高模型的性能。自然语言处理:在自然语言处理任务中,例如文本分类、命名实体识别和情感分析等,可以使用预训练的语言模型(如BERT、GPT等)进行迁移学习。这些预训练模型已经在大规模文本数据上进行了训练,可以提供丰富的语义表示和语言理解能力,有助于加速其他相关任务的学习。目标检测和物体识别:在计算机视觉领域,通过在大规模目标检测或物体识别数据集上进行预训练,可以学习到通用的目标检测或物体识别能力。这些预训练模型可以通过迁移学习用于其他具体的目标检测或物体识别任务,从而减少样本标注的需求,提高模型的性能。机器人学习:在机器人学习中,迁移学习可以帮助机器人从先前的任务和环境中获取知识,并将其应用于新任务中。例如,一个机器人在一个模拟环境中学习如何抓取物体,然后将这些知识迁移到真实环境中进行抓取任务。ResNet(Residual Network)是一种深度卷积神经网络架构,提出了残差学习的概念,以解决深层网络训练中的梯度消失和模型退化问题。除了经典的ResNet网络,还有一些其他系列的网络结构,包括ResNetv2、ResNeXt、Wide ResNet等,它们在ResNet的基础上进行了改进和扩展。下面是这些系列网络结构的简要介绍和差异:ResNetv2:ResNetv2是对经典ResNet的改进,主要包括两个方面的修改。首先是去除了原始ResNet中的池化操作,使用步长为2的卷积层来降低特征图的尺寸。其次是引入了批量归一化(Batch Normalization)操作,使得网络更易于训练。ResNetv2相对于原始ResNet具有更好的训练性能和更高的准确率。其核心公式如下:xl=xl+1+F(xl,wl)ResNeXt:ResNeXt在ResNet的基础上引入了一种新的模块结构,称为“Cardinality”。Cardinality是指在一个模块中并行使用多个分支,每个分支具有相同的结构,以增加网络的表示能力。通过增加Cardinality的数量,ResNeXt能够在不增加网络深度和复杂度的情况下提高模型性能。该网络提供了一种新的聚合方式:Wide ResNet:Wide ResNet通过增加网络的宽度(即每个层的通道数)来增加网络的容量。相比于经典的ResNet,Wide ResNet具有更宽的层,这使得网络能够捕获更多的特征信息。通过增加网络的宽度,Wide ResNet可以在一定程度上提高模型的准确率,但也会增加模型的计算和内存开销。下面是拓宽的ResNet图:这些ResNet的变体在保留ResNet的核心思想的基础上,通过改变网络的结构、引入新的模块或增加网络的容量,进一步提高了模型的性能和表示能力。根据具体的任务和需求,选择适合的ResNet系列网络可以帮助提高模型的训练效果。笔者对实验中提高模型精度的方法也进行了总结与尝试具体的改进点为:卷积核的大小改为3X3,通道数改为2的幂次并依此升高增大全连接层的神经元个数使用Batch Normalization(BN)尝试使用Dropout提高训练epoch数量尝试使用新的结构,如ResBlock下面将对上述的各个部分进行理论疏导。第一点,卷积核与通道数。卷积核的大小 卷积核的大小决定了网络在输入数据上进行卷积操作时所关注的局部区域的大小。较小的卷积核可以捕捉到更细节的特征,而较大的卷积核可以覆盖更广阔的区域。通常情况下,常见的卷积核大小为3x3、5x5或7x7。选择卷积核的大小可以根据任务需求和输入数据的特点来决定。对于较小的图像或特征细节较重要的任务,可以选择较小的卷积核;而对于较大的图像或更全局的特征,可以考虑使用较大的卷积核。本实验所用到的cifar10的图像分辨率很小,明显采用3x3的卷积核会更加合适。通道数 通道数指的是卷积核或输入数据在深度维度上的维数。在卷积神经网络中,通道数的确定涉及到输入数据的特征维度和网络层之间的信息传递。通常情况下,初始的输入数据具有多个通道,例如RGB图像具有3个通道。在网络的深度方向,随着网络层的堆叠,通道数也会相应地增加或减少。通过增加通道数,网络可以提取更多丰富的特征表示,有助于提高模型的表达能力和性能。通道数的选择需要考虑输入数据的特征维度和网络的复杂性,可以根据实际问题进行调整和优化。第二点,全连接层神经元个数 提高模型的表达能力 增大全连接层的神经元个数可以增加模型的参数数量,从而提高模型的表达能力。更多的神经元可以学习更复杂的特征表示和模式,使得模型更能适应复杂的任务和数据。增强模型的学习能力 更多的神经元提供了更大的学习空间,可以更好地拟合训练数据。这有助于减少欠拟合的情况,提高模型的学习能力和性能。改善特征的抽象和泛化能力:全连接层可以将前面卷积层或其他特征提取层输出的特征进行组合和抽象,得到更高级别的特征表示。增大全连接层的神经元个数可以增加特征组合的可能性,从而提高特征的抽象和泛化能力。缓解信息瓶颈 在网络的前向传播过程中,信息可能会逐渐减少。通过增大全连接层的神经元个数,可以提供更多的连接和参数,减轻信息瓶颈,使得信息能够更好地在网络中传递和流动。需要注意的是,增大全连接层的神经元个数也会增加模型的复杂性和计算量,可能会导致过拟合和训练时间的增加。因此,在设计网络时需要综合考虑模型的容量和计算资源的限制,进行适当的调整和平衡。合理选择全连接层的神经元个数可以根据具体问题、数据集和实验结果进行调优和验证。第三点,Batch Normalization(BN)Batch Normalization (BN) 是一种常用的神经网络层,用于在深度学习模型中对输入数据进行归一化处理。它的主要目的是加速神经网络的训练过程,并改善模型的收敛性和泛化能力。BN 的原理是对每个特征的输入进行归一化,使其均值接近于0,方差接近于1。这样可以使得输入数据分布更稳定,减少了网络层之间的协变量偏移(covariate shift),有助于提高训练效果。具体来说,BN 在每个小批量数据上计算均值和方差,并将其应用于归一化公式,将输入数据转换为均值为0、方差为1的标准正态分布。BN 的优点包括:加速训练收敛:通过减少内部协变量偏移,BN 可以使每层的激活函数保持在较小的范围内,有助于加速模型的收敛过程。改善模型泛化能力:BN 可以提高模型的泛化能力,减少过拟合的风险。减少对参数初始化的敏感性:BN 对输入数据进行标准化,可以减少对参数初始化的依赖,使得模型更加鲁棒。允许使用较大的学习率:通过减少梯度消失和爆炸问题,BN 可以使用较大的学习率,加快训练速度。需要注意的是,在使用 BN 时,需要注意以下几点:BN 在训练和推断阶段的计算方式不同,需要特别注意推断阶段的处理方式。BN 可能会增加计算开销,特别是在具有大量参数的网络中。BN 的引入可能会改变模型的学习动态,因此需要适当调整学习率和正则化策略。总之,Batch Normalization 是一种常用的技术,用于提高深度神经网络的训练效果和泛化能力,加速模型的收敛过程,并减少对参数初始化的敏感性。第四点,DropoutDropout 是一种常用的正则化技术,用于减少深度神经网络中的过拟合问题。在训练过程中,Dropout 随机地将一部分神经元的输出置为0,即在每个训练批次中丢弃(dropout)一些神经元,以一定的概率将其输出值设置为0。这样可以防止网络过度依赖特定的神经元,从而提高模型的泛化能力。Dropout 的原理是通过在每个训练批次中随机丢弃一些神经元的输出,从而减少神经元之间的协同作用,促使网络的每个神经元都能够独立地学习有用的特征。这种随机丢弃神经元的过程类似于集成学习中的 bagging 方法,通过将多个模型的预测结果进行平均或投票来减少过拟合。使用 Dropout 的主要优点包括:减少过拟合:通过随机丢弃神经元的输出,Dropout 可以减少网络对特定神经元的依赖,从而减少过拟合的风险。提高泛化能力:Dropout 强制网络学习多个独立的特征子集,促使网络对于输入的微小变化具有鲁棒性,从而提高模型的泛化能力。防止协同作用:Dropout 可以减少神经元之间的协同作用,使得网络的每个神经元都能够独立地学习有用的特征。增加网络容量:通过随机丢弃部分神经元的输出,Dropout 可以增加网络的容量,从而提高网络的表达能力。需要注意的是,在使用 Dropout 时,需要适当调整网络的结构和超参数,以平衡减少过拟合和保持模型性能之间的关系。此外,Dropout 通常在训练阶段使用,在推断阶段不需要应用 Dropout。总之,Dropout 是一种常用的正则化技术,通过随机丢弃神经元的输出来减少过拟合,提高模型的泛化能力和鲁棒性。第五点,提高训练epoch数量提高训练 epoch 数量是指增加模型在训练数据上迭代的次数。每个 epoch 表示将整个训练数据集通过模型进行一次正向传播和反向传播的过程。增加训练 epoch 数量可以对模型进行更多次的参数更新和优化,有助于提升模型的性能和收敛到更优的解。增加训练 epoch 数量的主要优点包括:改善模型性能:更多的训练 epoch 可以让模型更充分地学习训练数据中的特征和模式,从而提升模型的性能。减少欠拟合:在训练过程中,模型需要逐渐调整参数以适应数据的特征。如果训练 epoch 数量较少,模型可能无法充分学习数据的复杂性,导致欠拟合。增加训练 epoch 数量可以缓解欠拟合问题。提高模型泛化能力:通过增加训练 epoch 数量,模型可以更好地学习数据中的通用特征,从而提高其泛化能力,使其在未见过的数据上表现更好。然而,需要注意以下几点:过多的训练 epoch 数量可能导致过拟合:如果训练 epoch 数量过大,模型可能过度拟合训练数据,对于未见过的数据表现较差。因此,需要根据模型的训练曲线和验证集表现来确定合适的训练 epoch 数量。训练时间和计算资源的考虑:增加训练 epoch 数量会增加训练的时间和计算资源消耗。在实际应用中,需要根据时间和资源的限制来选择合适的训练 epoch 数量。综上所述,增加训练 epoch 数量可以改善模型性能、减少欠拟合并提高模型的泛化能力,但需要注意过拟合和训练时间与资源的平衡。适当调整训练 epoch 数量可以在训练过程中获得更好的模型性能。窗体顶端第六点,ResBlockResBlock(残差块)是指在深度残差网络(ResNet)中使用的基本构建块。它的设计目的是解决深层神经网络中的梯度消失和梯度爆炸问题,同时提高网络的训练和性能。其中,Input 是输入数据,Output 是残差块的输出,Convolution 是卷积操作,Activation 是激活函数,箭头表示数据流动的方向。ResBlock 的关键在于引入了跳跃连接(skip connection)或者称为残差连接(residual connection)。跳跃连接允许输入数据直接绕过一层或多层的卷积操作,将输入数据与输出数据相加,从而保留了输入数据的信息。这种设计可以使得网络在训练过程中更容易优化,减轻了梯度消失和梯度爆炸的问题。ResBlock 的优点包括:提高信息流动:跳跃连接允许信息直接传递,避免了信息在多层网络中的衰减,有助于信息在网络中更快地传播,促进了特征的学习和传递。加速训练收敛:由于跳跃连接的存在,残差块可以更容易地学习恒等映射,即将输入数据作为输出,从而更容易优化模型。这加速了网络的训练收敛。提高网络性能:通过使用残差块,深层网络可以更轻松地优化,更好地捕捉数据中的复杂特征,从而提高网络的性能和泛化能力。在实践中,ResBlock 可以通过堆叠多个残差块来构建深度残差网络。这种网络结构已被广泛应用于图像分类、目标检测和语义分割等任务中,并取得了很好的效果。总结起来,ResBlock 是深度残差网络中的基本构建块,通过引入跳跃连接来解决梯度消失和梯度爆炸问题,提高信息流动和网络的优化能力,从而提高网络性能和泛化能力。2. 代码及其分析 关卡4实验中,只要完成两个步骤,其一是对一个具有9个类别的毒蘑菇数据集进行分类,采用ResNet50模型,保存其backbone部分模型权重,迁移到另一个2分类的毒蘑菇数据集中,因此本实验的核心代码在于超参数的设计、迁移代码的撰写、以及网络结构的实现。 首先是对9分类的毒蘑菇数据集进行分类,在本实验中,笔者对超参数进行组合设计,探究适宜模型训练的超参数组合,使得模型精度略微提高了3个半分点,其超参数设计如下:config = ed({ # 训练参数 'batch_size': 128, 'epochs': 300, #网络参数 'class_num': 9, # 动态学习率调节 'warmup_epochs': 10, 'lr_init': 0.01, 'lr_max': 0.1, # 优化器参数 'momentum': 0.75, 'weight_decay': e-4}) 在网络结构方面,仍沿用ResNet50的backbone和head结构,不同的是,笔者经过尝试,改变了网络结构的部分超参数,提高了网络模型的拟合能力,使其在这个任务上的表现更加提高,提高了两个百分点,最高可以达到94%。其代码如下:class ResNet50(nn.Cell): """ ResNet_backbone (ResidualBlock, [3, 4, 6, 3], [64, 256, 512, 1024], [256, 512, 1024, 2048], [1, 2, 2, 2]) ResNet_head (ResidualBlock, [3, 8, 8, 3], [64, 256, 512, 1024], [256, 512, 1024, 2048], [1, 2, 2, 2], 9) """ def __init__(self, backbone, head): super(ResNet50, self).__init__() self.backbone = backbone self.head = head def construct(self, x): x = self.backbone(x) x = self.head(x) return x 在进行2分类毒蘑菇分类的迁移学习时,网络结构没有变化,只是在网络的输出端的类别改为了2,其超参数配置如下:config = ed({ # 训练参数 'batch_size': 128, 'epochs': 300, #网络参数 'class_num': 9, # 动态学习率调节 'warmup_epochs': 10, 'lr_init': 0.01, 'lr_max': 0.1, # 优化器参数 'momentum': 0.75, 'weight_decay': e-4}) 在进行迁移时,最为关键的就是以预训练的模型参数作为待训练模型的初始化参数,也就是说需要在训练之前将已经训练好的模型参数加载进入新的模型,由于两个任务的分类类别不同,因此只能载入模型前面的backbone部分,代码如下:# 网络backbone_net = resnet50_backbone() # backbone网络ms.load_checkpoint('best_param_backbone.ckpt',backbone_net)3. 存在的问题及其解决方法 本实验存在出多问题,下面对此进行一一列举。问题一描述:本实验最初无法直接运行华为官方提供的代码,并且报错提示极其隐晦,一直称Loss无效,或者在正常训练1到2个epoch后训练终止,训练得到的acc为固定的0.5。解决:经过多方查找后,发现在数据集文件中多了一个.checkpoint文件,这个文件是由于之前的代码运行过程中无法正常运行后而生成的回滚文件,使得超参数中设计的类别和实际的数据集文件个数不匹配导致的,手动删除该文件后,该报错解除。问题二描述:本实验的9分类的代码无法应用于2分类的数据集上,且报错信息十分隐晦,不能给予方向上的引导。解决:经过多次查看后发现,数据集的类别指定方式不仅仅是通过最初的超参数设计,后续过程中也有对类别数量的指定,正式因为类别不匹配而导致的报错显示。问题三 描述:在进行迁移学习时,训练2分类的网络载入9分类数据集的网络参数时失败。解决:经观察与分析,某个网络仅能载入固定网络架构的模型参数,而两个数据集对应的网络结构并不完全相同,因此无法直接载入预训练模型。而两个网络的backbone部分完全相同,因此可以载入这部分的网络参数,这也是迁移学习的核心思路,即载入网络结构前面提取特征的部分结构参数,再对网络的输出部分进行微调,从而达到一个更好的效果。问题四描述:模型代码没有问题但是服务器上无法运行,出现loss损失爆炸的情况。解决:Mindspore框架适配硬件的时间比较长,在进行运行模型的时候,每一步尽量不要出现红色的警告通知,有可能红色的警告通知就是硬件层面出现了未知的问题,但是这个问题还不至于报错。当运行训练的语句的时候,第一轮的等待时间比较长,可以在命令台通过top命令查看系统使用资源的情况,如果出现了很多个python类型的进程占用了资源的大部分而非一个python类型进程占用所有的资源,那模型大概率就可以进行正常运行。 想法与建议:本实验的安排,使参与者深入理解与事件如何进行迁移学习。值得一提的是,需要更加完善MindSpore的异常处理机制。MindSpore的底层实现中,其异常处理很不完善,往往一个很容易解决的错误,提供的报错让人感觉八竿子打不着,大大浪费了时间,同时给人的体验很差,这是一个急需改进的地方。其次,在本实验中,网络模型定义部分封装得过于精细,使得实验人员想要了解采用的网络结构的全貌需要递归地看很多个类,使得实验人员难以直接对模型进行修改,这其实是深度学习实验的一个大忌,因为网络的结构很大程度上就决定了网络的性能好坏,因此,设置简单而又可以轻易修改的实验设置,有助于帮助实验人员探究更适合该数据集的网络结构,进一步学习。
张乐超
发表于2023-11-04 22:14:12
2023-11-04 22:14:12
最后回复
281