Task2:从baseline入门深度学习
一、深度学习是什么?
深度学习(Deep Learning)是机器学习的一个分支,它使用神经网络模拟人脑的学习方式,从大量数据中自动学习和提取特征,进行预测和决策。
神经网络由多个神经元组成,神经元就像人体大脑中的微小开关,能够接收来自其他神经元的信号,并根据这些信号的产生反应。
在人工智能中,我们用数学模型来模拟这种生物神经元的行为。
一个简单的神经元模型包括输入、权重、激活函数和输出。
输入就像神经元 树突 接收到的信号,
权重则像是调整信号强度的小调节器,
激活函数决定是否产生输出,
而输出则是传递给其他神经元的信号
有多个基本的神经元模型通过不同的方式组合起来,形成了多层次的网络结构。这些网络,我们称之为神经网络,它们能够在各个层次上处理和传递信息,就像大脑中的神经回路一样。
二、深度学习是如何训练的?
深度学习是通过梯度下降训练的。
梯度下降是一种优化算法,用于最小化函数。梯度下降算法基于这样一个原理:损失函数的梯度指向函数增长最快的方向。因此,如果我们希望减少损失函数的值,我们就需要沿着梯度的反方向调整模型的参数。
这样,每次迭代都会朝着使得损失函数减小的方向移动。
损失函数指的是模型所产生的预测值和实际值之间的差距,这个值越小,代表模型的预测值越准确。
1.优化过程
在训练循环中,我们首先加载一小批量数据,将其输入到神经网络中进行前向传播,计算出网络的输出。然后,我们使用损失函数来计算当前批次的损失,并通过反向传播算法计算损失函数关于每个参数的梯度。这些梯度告诉我们如何调整权重和偏置以减少损失。
当数据集过大而导致计算机内存不足以一次性处理这些数据数据时,我们可以通过将数据分成小批量,我们可以更频繁地更新模型参数,这使得训练过程更加高效。
2.Task1 的训练代码
def train(train_loader, model, criterion, optimizer, epoch):
# switch to train mode
model.train()
end = time.time()
for i, (input, target) in enumerate(train_loader):
input = input.cuda(non_blocking=True)
target = target.cuda(non_blocking=True)
# compute output
output = model(input)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
首先,我们需要准备一批图片数据(通过train_loader
)和这些图片对应的正确标签(target
)。
在开始训练之前,将模型设置为训练模式( model.train()
),这样模型就知道现在是学习时间了。
接着,开始喂给模型图片数据,并让它尝试预测这些图片的内容。
模型会基于它目前的学习给出预测结果(output
),而会计算这些预测结果与实际标签之间的差异,这个差异就是损失(loss
)。
为了让模型学会准确预测,需要指出它的错误,并更新它的内部参数来减少这些错误(通过loss.backward()
和optimizer.step()
)。
这个过程就像是模型在自我调整,以便在下一次遇到类似图片时能够做出更准确的预测。
三、深度学习与迁移学习
迁移学习是一种机器学习技术,它将已在一个任务上学到的知识(如模型参数、特征表示等)应用到另一个相关任务上,它允许模型在数据稀缺的情况下也能表现出色。
迁移学习的实现方法
迁移学习一种策略是通过微调方式实现
微调的过程通常开始于选择一个在大型数据集上预训练的模型,我们需要做的就是将这个预训练模型适配到新的目标任务上。通常涉及以下步骤:
1.替换模型的输出层,以匹配目标任务的类别数量和类型。
2.(可选)冻结预训练模型中的部分层,防止在微调过程中这些层学到的通用特征被破坏。
3.使用目标任务的数据集对模型进行训练。在这个过程中,用梯度下降等优化算法更新模型的权重,从而使模型能够更好地适应新的任务。训练时,可能会使用比预训练时更低的学习率,以避免过度拟合目标数据集。
Task1 的迁移学习代码
import timm
model = timm.create_model('resnet18', pretrained=True, num_classes=2)
model = model.cuda()
代码中timm.create_model('resnet18', pretrained=True, num_classes=2)
这行代码就是加载了一个预训练的ResNet-18模型。
pretrained=True
表示使用在ImageNet数据集上预训练的权重。
num_classes=2
表示模型的输出层被修改为有2个类别的输出,以适应二分类任务(例如区分真实和Deepfake图像)。
通过model = model.cuda()
将模型移动到GPU上进行加速。