深度学习概念
深度学习(Deep Learning)是机器学习的一个分支,它使用神经网络模拟人脑的学习方式,从大量数据中自动学习和提取特征,进行预测和决策。
深度学习依赖于多层神经网络,每一层神经元接受前一层神经元的输出,并通过权重和激活函数进行计算,传递到下一层神经元。
神经元模型是模拟生物神经元行为的计算模型,它在人工智能和机器学习领域扮演着核心角色。
神经元就像人体大脑中的微小开关,能够接收来自其他神经元的信号,并根据这些信号的产生反应。
在人工智能中,我们用数学模型来模拟这种生物神经元的行为。
一个简单的神经元模型包括输入、权重、激活函数和输出。
- 输入就像神经元 树突 接收到的信号,
- 权重则像是调整信号强度的小调节器,
- 激活函数决定是否产生输出,
- 而输出则是传递给其他神经元的信号。
深度学习则是由这些神经元模型层层堆叠起来的复杂结构。
深度将它们按照一定的层次连接起来,形成一个庞大的网络。这个网络的最底层接收输入数据,比如图片或文本,
然后通过每一层的处理,逐渐提取出更高级别的特征,
最后在顶层输出结果,比如识别图片中的物体或理解文本的含义。
2.训练过程
https://blog.csdn.net/google19890102/article/details/69942970
详细梯度下降算法参考链接文章;
在深度学习中,我们希望最小化损失函数,即模型预测值与真实值之间的差异。
梯度是损失函数关于模型参数的导数,它指示了参数的调整方向,以减少损失函数的值。
在训练循环中,我们首先加载一小批量数据,将其输入到神经网络中进行前向传播,计算出网络的输出。
然后,我们使用损失函数来计算当前批次的损失,并通过反向传播算法计算损失函数关于每个参数的梯度。
这些梯度告诉我们如何调整权重和偏置以减少损失。
当数据集非常大时,一次性处理所有数据可能会导致内存不足或计算过于缓慢。
通过将数据分成小批量,我们可以更频繁地更新模型参数,这使得训练过程更加高效。
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())。
这个过程就像是模型在自我调整,以便在下一次遇到类似图片时能够做出更准确的预测。
3.迁移学习
通常使用在大规模数据集上预训练的模型作为起点,例如在ImageNet数据集上预训练的卷积神经网络(CNN)。
在预训练模型的基础上,使用少量标记数据对模型进行微调,以适应新任务。
在baseline中,
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上进行加速。
4.实操
4.1使用预训练模型
将baseline中的resnet18更替为efficientnet网络,对batch size、epoch、优化器参数等进行修改,在使用十万张训练集、两万张测试集情况下,提交后的结果为0.97。
4.2不使用预训练模型
定义了DeepfakeDetector网络架构,用于处理具有三个颜色通道(RGB)的224x224像素图片。它首先通过四个卷积层,每个卷积层都使用3x3的卷积核,步长为1,填充为1,以保持特征图的尺寸,并在每个卷积层后应用ReLU激活函数来引入非线性。随后,每个卷积层后紧跟一个最大池化层,使用2x2的池化窗口和步长为2,进一步减少特征图的尺寸,同时增加对图像位移的不变性。在最后一个卷积层之后,网络使用自适应平均池化层将特征图尺寸调整为1x1,以提取图像的全局特征。
class DeepfakeDetector(nn.Module):
def __init__(self):
super(DeepfakeDetector, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1, 1)) # 使用自适应池化层
)
在batch size为32,训练集为2000、验证集1000情况下,acc为0.616.
但仍存在acc不能持续更新等问题需要进一步优化。
https://www.kaggle.com/code/xlstriver/deepfake-ffdi/edit/run/188492431
该链接是在kaggle中运行的完整代码。
参考资料:Datawhale 学习指南。