Datawhale AI夏令营 Task2

深度学习概念
深度学习(Deep Learning)是机器学习的一个分支,它使用神经网络模拟人脑的学习方式,从大量数据中自动学习和提取特征,进行预测和决策。
深度学习依赖于多层神经网络,每一层神经元接受前一层神经元的输出,并通过权重和激活函数进行计算,传递到下一层神经元。
神经元模型是模拟生物神经元行为的计算模型,它在人工智能和机器学习领域扮演着核心角色。
神经元就像人体大脑中的微小开关,能够接收来自其他神经元的信号,并根据这些信号的产生反应。
在人工智能中,我们用数学模型来模拟这种生物神经元的行为。
一个简单的神经元模型包括输入、权重、激活函数和输出。

  1. 输入就像神经元 树突 接收到的信号,
  2. 权重则像是调整信号强度的小调节器,
  3. 激活函数决定是否产生输出,
  4. 而输出则是传递给其他神经元的信号。
    神经元模型
    深度学习则是由这些神经元模型层层堆叠起来的复杂结构。
    深度将它们按照一定的层次连接起来,形成一个庞大的网络。这个网络的最底层接收输入数据,比如图片或文本,
    然后通过每一层的处理,逐渐提取出更高级别的特征,
    最后在顶层输出结果,比如识别图片中的物体或理解文本的含义。
    神经网络
    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 学习指南。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值