一、了解深度学习
1.神经网络
在上一期的笔记中,我们可以了解到,深度学习是机器学习的一个分支。深度学习依赖于深层神经网络,模拟人脑进行学习。
神经网络由众多神经元连接而成,每个神经元又由输入、权重、激活函数、输出而组成。如同人脑中的神经元一样,神经网络中的神经元接收前一个神经元传递过来的输入信号,通过权重方法或是缩小这一信号,再由激活函数控制神经元是否输出信号,也就是提供非线性,最终输出信号传递到下一个神经元。
所以在深度学习中,神经网络只是比机器学习中的更加深罢了。通过更深的神经网络,深度学习模型能够适应更为复杂的任务,提取到更深层级的特征信息。
2.通过Pytorch进行深度学习模型训练
(1)梯度下降
在深度学习中,我们想要优化深度学习模型,首先就需要一个目标函数来代表模型的误差,称为损失函数。在深度学习的训练过程中,我们的目标就是不断降低损失函数,直至最损失函数达到最小值。
在函数图像中,梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解。
在模型的每一次训练迭代过程中,模型不断读取一个BatchSize的批量数据,并通过前向传播和反向传播,传递梯度。
二、迁移学习
深度学习发展至今,模型的参数量,训练的数据量不断增大,所需要的训练时间也被大大加长。在这样的训练条件下,模型随之而来的也获得了更强大的特征提取能力与泛化性。
在计算机视觉领域的发展中,ImageNet具有不可忽视的作用,因为ImageNet数据集的数据量之大在当时前所未有,为计算机视觉领域的后续发展奠定地位。现在我们也能够在timm、huggingface库中看到大量的ImageNet预训练模型。
在这些具有强大泛化能力的预训练模型的帮助下,我们可以在这些预训练模型的基础上进行微调,将其他领域的特征提取能力迁移到我们的任务所需的下游领域,这就是迁移学习。
在我们的官方Baseline中,模型就是通过如下代码读取timm库中的预训练权重进行迁移学习微调的,我们所要做的修改就是修改分类头的输出数,也就是分类所需的类数。
import timm
model = timm.create_model('efficientnet_b0', pretrained=True, num_classes=2)
不仅是分类模型,我们也可以通过预训练模型提取图像特征,将分类头换成检测头,或直接对骨干网络输出特征进行Sigmoid的方法进行下游检测、分割任务的迁移。由于预训练模型的强大泛化能力,我们可以通过微调大大减少模型的训练时间,提高模型的精度。
近些年,我们能够看到很多优秀的工作通过迁移学习以及高效微调,冻结部分预训练Encoder进行训练的方法,从预训练模型中获得强大的下游任务特征提取能力。