Datawhale AI夏令营 多模态deepfake 学习笔记

190 阅读24分钟

Datawhale AI夏令营 多模态deepfake 学习笔记

第一部分:Deepfake 与深度学习基础

Deepfake 技术详解

  • 技术核心: 结合了深度学习中的 GANs 技术,通过学习真实数据特征来生成新的、难以区分真伪的数据。

  • 应用领域: 在电影制作、游戏开发等领域有正面作用,但也存在被用于制造假新闻、身份冒充等负面用途。

  • 研究方向细分:

    • 面部交换: 技术能够在视频帧中交换人物的面部。
    • 面部重演: 将一个人的面部动作和表情转移到另一个人的视频上。
    • 说话面部生成: 使视频中人物的口型与语音同步,即便语音是后期添加的。
    • 面部属性编辑: 允许修改视频中人物的面部特征,如年龄、性别等。
  • 人工识别 Deepfake 图片的逻辑步骤可以概括为以下几点:

  1. 观察面部特征: 检查人物的面部细节,特别是眼睛和嘴巴,以识别不自然的眨眼频率或口型与语音不同步的现象。
  2. 检查光线和阴影: 分析光源的一致性和阴影的方向,寻找不自然的光线或阴影,这可能是图像被篡改的迹象。
  3. 分析像素: 放大图像,寻找模糊或像素化区域,这些可能是 Deepfake 技术实施过程中留下的痕迹。
  4. 注意背景元素: 检查背景中是否有异常,例如物体边缘的不平滑或背景中的重复模式,这些可能是伪造的迹象。
  • 检测挑战: 随着技术的进步,Deepfake 的检测变得越来越困难,需要专业的知识和工具。

深度学习基础要点

  • 机器学习与深度学习:
    • 机器学习是人工智能的一个分支,让计算机系统利用数据来不断改进性能,而无需进行明确的编程。最常见的使用方式是线性回归和简单分类。 image.png
    • 深度学习作为机器学习的一个分支,专注于通过构建多层神经网络来学习数据的复杂模式。 image.png

Deepfake 检测模型构建步骤

  • 数据准备重要性: 数据预处理是模型训练的基础,包括数据清洗、标准化和划分训练集与验证集。
  • 预训练模型的应用: 利用在大规模数据集(如 ImageNet)上预训练的模型,可以在新数据集上进行微调,以学习特定于任务的特征。
  • 音频特征提取的作用: 音频分析是检测 Deepfake 的重要手段,MEL 频谱图提供了一种从音频中提取特征的方法。

预训练模型与 ResNet 概述

预训练模型 是在大型数据集(如 ImageNet)上预先训练好的神经网络模型。这些模型通过学习大量图像的特征表示,能够识别和处理图像中的多种模式。使用预训练模型的主要好处包括:

  1. 微调(Fine-tuning):可以在新数据集或新任务上进行微调,利用已有的知识,加快训练过程。
  2. 提高性能:尤其在数据量有限的情况下,预训练模型可以显著提高模型的性能。

ResNet(残差网络) 是一种深度卷积神经网络架构,由微软研究院的 Kaiming He 等人在 2015 年提出。其核心特点包括:

  1. 残差学习:通过引入残差连接(或称为快捷连接),允许网络学习输入到输出的残差映射,而非直接学习输出。这解决了深层网络训练中的梯度消失问题。
  2. 网络深度:ResNet 能够训练非常深的网络结构,如 ResNet-50、ResNet-101 等,数字代表网络中的权重层数量。

使用预训练的 ResNet-18 模型

在实际应用中,可以通过以下代码加载预训练的 ResNet-18 模型,并对其进行微调:

import timm

# 加载预训练的 ResNet-18 模型
model = timm.create_model('resnet18', pretrained=True, num_classes=2)

# 将模型移动到 GPU 上进行加速
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 上进行加速,提高训练和推理的效率。

模型训练流程

模型训练流程是深度学习中的核心环节,涉及以下关键步骤:

  • 设置训练模式:使用 model.train() 将模型设置为训练模式。这确保了模型中的特定层(如 BatchNorm 和 Dropout)在训练时以正确的方式运行。
  • 遍历数据加载器:通过 enumerate(train_loader) 遍历数据加载器提供的数据批次。每个批次包含图像数据 input 和对应的标签 target
  • 数据移动到 GPU:使用 .cuda(non_blocking=True) 将数据和标签移动到 GPU 上进行加速。设置 non_blocking=True 允许数据传输在后台进行,不会阻塞当前操作。
  • 前向传播:通过 output = model(input) 进行前向传播,模型根据输入数据生成预测结果。
  • 计算损失:使用损失函数 loss = criterion(output, target) 计算模型预测输出与实际标签之间的差异,损失越小表示模型预测越准确。
  • 梯度归零:在每次迭代开始前,调用 optimizer.zero_grad() 清空之前的梯度,防止梯度累积,确保每次更新都是基于当前批次的梯度。
  • 反向传播:调用 loss.backward() 计算损失相对于模型参数的梯度,这是模型学习的关键步骤。
  • 参数更新:通过 optimizer.step() 更新模型参数,参数更新的方向和幅度由反向传播计算得到的梯度决定。

示例代码如下:

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()

第二部分:深度学习进阶

机器学习基础

传统机器学习算法 通常需要人工设计特征,这个过程称为特征工程。特征工程是费时且需要专业知识的。

机器学习的主要类型 包括:

  • 监督学习:从标记的训练数据中学习,预测未见过的数据的标签。
  • 无监督学习:处理未标记的数据,试图找出数据中的结构和模式。
  • 半监督学习:介于监督学习和无监督学习之间,使用少量标记数据和大量未标记数据。
  • 强化学习:通过与环境的交互来学习,目标是最大化累积奖励。

经典机器学习算法 包括:

  • 线性回归
  • 逻辑回归
  • 决策树
  • 随机森林
  • 支持向量机(SVM)
  • K-近邻(KNN)

虽然 ChatGPT 是深度学习在自然语言处理领域的典型应用,并且深度学习在许多领域都取得了显著的成就,但深度学习并不能解决所有问题。深度学习通常需要大量的数据来训练模型,对于某些领域或问题,获取足够的高质量数据可能是不现实的。

因此,在一些细分的小领域,机器学习还是能具备良好的性价比

神经网络一览

image.png

  • 神经元模型构成:
    • 输入: 接收来自其他神经元的信号。
    • 权重: 调节输入信号的强度。
    • 激活函数: 决定信号是否足以激发神经元并产生输出。
    • 输出: 传递给其他神经元或作为网络层的输入。
  • 激活函数类型: 包括但不限于 Sigmoid、Tanh、ReLU,每种函数适用于不同的网络结构和任务。

image.png

激活函数一览

image.png image.png

深度学习 是机器学习的一个子集,它使用多层神经网络来自动从原始数据中学习特征。深度学习的优势包括:

  • 自动特征学习:减少了对人工特征工程的需求,模型能够自动提取有用的特征。
  • 端到端学习:模型可以直接从原始输入数据学习到最终输出结果,无需中间步骤。

深度学习进阶知识

  • 网络结构创新: 随着研究的深入,出现了多种网络结构,如 CNN 专注于图像识别,RNN 处理序列数据,LSTM 解决长短期依赖问题。
  • 优化技术详解:
    • 激活函数改进: 新的激活函数如 Leaky ReLU、ELU 被提出以解决传统激活函数的局限性。
    • 权重初始化方法: 适当的权重初始化可以加速模型训练,避免梯度消失或爆炸问题。
    • 正则化技术: 如 Dropout、L1/L2 正则化,用于防止模型过拟合。
    • 梯度下降变种: 包括动量法、Nesterov 加速梯度、Adagrad、RMSprop 和 Adam 等,每种方法适用于不同的优化场景。

模型训练流程

训练循环主要包括以下几个步骤:

  1. 加载小批量数据:从训练集中选取一小批量(mini-batch)数据,这些数据将用于模型的每次迭代训练。
  2. 前向传播:将加载的数据输入到神经网络中,通过网络的各个层级进行计算,得到输出结果。
  3. 计算损失:使用损失函数(如均方误差或交叉熵损失)评估模型输出与实际标签之间的差异,损失越小表示模型的预测越准确。
  4. 反向传播:根据损失函数的结果,通过反向传播算法计算每个模型参数的梯度。这一步骤是利用了链式法则,从输出层到输入层逐层计算梯度。
  5. 参数更新:根据计算得到的梯度,调整模型中的权重和偏置。这一过程通常使用优化算法(如梯度下降或其变体)来完成,目的是减少损失并优化模型性能。
  6. 迭代过程:重复上述步骤,直到模型在训练集上的性能达到预期或达到预定的迭代次数。

迁移学习的概念与应用

  • 定义: 迁移学习是一种将一个领域(通常是大规模数据集)学到的知识迁移到另一个领域(通常是数据较少的领域)的技术。
  • 关键优势: 允许模型利用已有的知识,加速学习过程,提高在新任务上的性能,尤其在数据稀缺的情况下。
  • 实现方式: 通常涉及使用预训练模型作为起点,然后在新任务上进行微调。

预训练模型的重要性

  • ImageNet 数据集: 作为深度学习领域内最知名的数据集之一,ImageNet 上预训练的模型通常作为迁移学习的基础。

  • 微调过程: 包括替换模型的输出层以匹配新任务的类别数,以及可能的冻结和解冻层的操作,以保留通用特征同时学习特定特征:

      1. 选择预训练模型:开始于选择一个在大型数据集(如 ImageNet)上预训练的模型,该模型已经学习到了丰富的通用特征表示。
      1. 适配模型结构
      • 替换输出层:根据新任务的需求,替换模型的输出层以匹配目标任务的类别数量和类型。
      • 冻结层:(可选)冻结预训练模型中的大部分层,以保留学到的通用特征,同时只对模型的最后几层进行微调,这些层将学习特定于任务的特征。
      1. 使用目标任务数据集训练:使用新任务的数据集对模型进行进一步训练,使用梯度下降等优化算法更新模型权重,使模型更好地适应新任务。在训练时,可能会采用比预训练时更低的学习率。
      1. 模型加载与加速:通过特定库(如 timm)加载预训练模型,并将其移动到 GPU 上以加速训练和推理过程。

示例代码

import timm

# 加载预训练的 ResNet-18 模型,预训练权重来源于 ImageNet 数据集
# num_classes=2 表示模型输出层适配为二分类任务
model = timm.create_model('resnet18', pretrained=True, num_classes=2)

# 将模型移动到 GPU 上进行加速
model = model.cuda()

图像分类网络的发展

AlexNet,en.wikipedia.org/wiki/AlexNe…

AlexNet 是一种开创性的卷积神经网络(CNN)架构,由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 设计,对深度学习和计算机视觉领域产生了深远的影响。 image.png

主要成就

  • 在 2012 年 ImageNet 大规模视觉识别挑战赛(ILSVRC)中取得了突破性成绩,显著超越了当时的非深度学习方法。

网络结构

  • 层数: 总共包含八个层次。
  • 卷积层: 前五个层次,负责提取图像特征,每个卷积层后跟一个 ReLU 激活函数,引入非线性。
  • 局部响应归一化(LRN): 用于提高模型泛化能力,作为正则化手段。
  • 最大池化层: 降低特征的空间维度,减少计算量,控制过拟合。
  • 全连接层: 最后三个层次,前两层使用 Dropout 来防止过拟合。
  • 输出层: 最后一个全连接层后接线性层和 softmax 激活函数,用于输出 1000 个类别的概率分布。

特点

  • 深度: 当时最深的网络之一,推动了深度学习在图像识别中的应用。
  • ReLU 激活函数: 引入非线性,改善了网络的学习能力。
  • LRN: 作为正则化手段,增强了模型的泛化性。
  • Dropout: 防止全连接层过拟合,提高模型稳健性。

ResNet,en.wikipedia.org/wiki/Residu…

ResNet(残差网络) 是一种创新的深度卷积神经网络架构,由微软研究院的何恺明等人提出,对深度学习领域产生了深远的影响。

主要成就

  • 在 2015 年 ImageNet 图像识别大赛中获得冠军。
  • 解决了深度神经网络中的梯度消失和爆炸问题,使得训练更深层次的网络成为可能。

核心概念

  • 残差学习:允许网络学习输入和输出之间的残差,而不是直接学习输出。

网络结构

  • 残差块(Residual Block):ResNet 的基本构建单元。 image.png
    • 跳跃连接(Skip Connections):输入通过跳跃连接直接与后续层的输出相加,有助于梯度的传播。
    • 卷积层:残差块内包含多个卷积层,通常使用 3x3 卷积核,后跟批量归一化(Batch Normalization)和 ReLU 激活函数。
    • 最大池化层:在残差块之间用于降低特征图的空间维度。

变种

  • ResNet-50、ResNet-101、ResNet-152 等,数字代表网络中的权重层数量。
  • 这些变种在深度和宽度上有所不同,但都基于残差学习架构。

特点

  • 深度: 能够成功训练超过 100 层的网络,这在当时是前所未有的。
  • 灵活性: 通过残差块的设计,网络可以灵活地增加深度而不影响训练过程。
  • 效率: 即使网络很深,也能保持高效的训练和推理速度。

EfficientNet,paperswithcode.com/method/effi…

EfficientNet 是一种创新的卷积神经网络(CNN)架构,以其高效性在多个图像分类任务上取得了显著的性能提升。

image.png

主要创新

  • Compound Scaling Method:EfficientNet 通过复合系数(如 ϕ)同时缩放网络的深度、宽度和分辨率,这种方法比传统的任意缩放方法更为系统和统一。

架构特点

  • EfficientNet-B0:作为系列的基础模型,使用 NAS(神经架构搜索)技术构建,优化了准确性和计算效率。
  • 多目标搜索:在设计过程中,EfficientNet 考虑了准确性和效率的平衡,通过多目标优化方法来实现。

性能提升

  • EfficientNet 在多个基准测试中表现出色,如 CIFAR-100、Flowers 等数据集,实现了状态最先进的准确率,同时参数数量大幅减少。

核心理念

  • 直觉:输入图像尺寸的增加需要网络有更多的层来扩大感受野,以及更多的通道来捕捉更细致的图像模式。

网络缩放

  • 通过小规模的网格搜索在小型模型上确定缩放系数,然后根据计算资源的可用性按比例增加网络的深度、宽度和图像尺寸。

意义

  • EfficientNet 的设计哲学和方法为构建高效的深度学习模型提供了新的视角,特别是在资源受限的情况下。

Vision Transformer (ViT) 【深度学习】详解 Vision Transformer (ViT)-CSDN博客

Vision Transformer (ViT) 是一种结合了 Transformer 架构和卷积神经网络 (CNN) 的深度学习模型,用于处理图像分类任务。

  • ViT 通过将图像分割成多个小块,然后将这些小块作为序列输入到 Transformer,证明了无需依赖 CNN 结构即可在图像分类任务中取得优异性能。
  • 大规模预训练和迁移学习使得 ViT 在多个图像识别基准上接近或超越了最先进的 CNN 模型。

image.png

方法

图像块嵌入 (Patch Embeddings)

图像块嵌入是将输入图像分割成固定大小的块,并将这些块转换成适合Transformer模型处理的嵌入向量。具体步骤如下:

  1. 将输入图像分割成多个固定大小的图像块(例如16x16像素的块)。
  2. 将这些图像块展平成一维向量。
  3. 使用一个可训练的线性层(全连接层)对这些一维向量进行线性投影,以映射到所需的嵌入维度。

这样,图像数据就被转换成了Transformer可以处理的形式,即一系列嵌入向量。这些向量随后将作为Transformer的输入进行处理。

可学习的嵌入 (Learnable Embedding)

可学习的嵌入包括以下几个部分:

  1. 类别嵌入(Class Token):ViT引入了一个额外的可学习的类别嵌入,这个嵌入是一个单独的向量,它被添加到图像块嵌入序列的开始位置。这个类别嵌入的作用类似于BERT中的[CLS]标记,用于最终的图像分类任务。在Transformer编码器处理之后,这个类别嵌入对应的输出被用来进行分类。
  2. 位置嵌入(Positional Embeddings):虽然Transformer模型本身不具有处理序列顺序的能力,但通过添加位置嵌入,可以给模型提供关于输入序列中各个元素位置的信息。在ViT中,位置嵌入是可学习的,这意味着它们会在训练过程中被优化。

这些可学习的嵌入使得Transformer能够理解和处理图像块序列,即使它原本是一个顺序无关的模型。

位置嵌入 (Position Embeddings)

位置嵌入是为了让模型能够理解图像块之间的相对位置关系。由于Transformer架构本身不包含任何关于输入序列顺序的信息,因此位置嵌入是至关重要的。以下是位置嵌入的关键点:

  1. 作用:位置嵌入为每个图像块提供了一个位置信息,这样模型就能知道各个块在原始图像中的位置。
  2. 可学习:与固定位置嵌入不同,ViT中的位置嵌入是可学习的参数。这意味着在训练过程中,模型会学习到哪些位置信息对于完成任务是最有用的。
  3. 添加到嵌入:在将图像块通过线性层转换成嵌入向量之后,相应的位置嵌入会被加到这些嵌入向量上。这样,每个图像块的嵌入向量都包含了位置信息。
  4. 维度匹配:位置嵌入的维度必须与图像块嵌入的维度相同,这样才能进行逐元素的加法操作。

通过这种方式,ViT能够在处理图像时考虑到空间关系,这对于图像分类等任务是非常重要的。

Transformer 编码器 Transformer编码器是Vision Transformer(ViT)的核心组件,它由多个相同的层组成,每个层包含以下两个主要部分:

  1. 多头自注意力层(Multi-Head Self-Attention, MSA)

    • 自注意力机制允许模型在处理一个序列时,同时考虑序列中的所有元素,并计算它们之间的相互关系。
    • 多头自注意力通过将输入分割成多个头,并在每个头上单独进行自注意力计算,然后将结果拼接起来,从而增加了模型的表达能力。 image.png
  2. 多层感知机(MLP)块

    • 每个MLP块包含两个全连接层,中间有一个非线性激活函数(如GELU)。
    • MLP块用于对自注意力层的输出进行进一步的非线性变换。 image.png 每个层还包括以下两个关键组件:
  • 层归一化(Layer Normalization) :在自注意力和MLP之前应用,用于提高训练稳定性。
  • 残差连接(Residual Connection) :在每个自注意力和MLP块之后,将输入与块的输出相加,有助于缓解梯度消失问题,并允许更深层的网络训练。

整个Transformer编码器由多个这样的层堆叠而成,每个层都重复上述过程,使得模型能够逐步学习到更复杂的特征表示。

ViT 张量维度变化举例

image.png

  • 输入图像 (input images) 的 shape = (b = b, c = 3, h = 256, w = 256)。
  • 输入图像 (input images) 被切分 (Split / Divide) 并展平 (Flatten) 为:batch size 仍为 b,通道数 c = 3、尺寸 P = 32、个数 N = (256×256) / (32×32) = 64 的图像块 (Patch),每个图像块 (Patch) 均有 P²c = 32×32×3 = 3072 个像素。
  • 图像块 (Patch) 馈入线性投影层 (Linear Projection),得到个数/长度 (length) 为 N = 64、像素数/大小/维度 (dimension) 为 D = (32×32×1) = 1024 的图像块嵌入 (Patch Embedding)。
  • 每个图像块嵌入 (Patch Embedding) 按元素加 (Element-wise Summary) 入位置向量/嵌入后,尺寸仍为 N×D = 64×1024。
  • 具有位置嵌入的图像块嵌入 (Patch Embedding) 再于长度 (length) 维度 拼接 (Concat) 一个用于预测分类结果的 1×1024 可学习嵌入/向量,构成大小为 65×1024 完整嵌入 (长度 (length) N+1 = 64+1 = 65)。
  • 完整嵌入输入编码器经过一系列前向处理后,得到尺寸仍为 N×D = 65×1024 的输出。

归纳偏置与混合架构

归纳偏置

  • ViT相比于卷积神经网络(CNN),具有更少的归纳偏置。归纳偏置是指模型在训练过程中对数据的假设。CNN天然具有平移不变性和局部性,这是因为卷积操作本身就是基于这些假设设计的。
  • ViT由于是基于自注意力机制,它不假设数据具有特定的结构,因此在处理具有复杂模式的图像时可能需要更多的数据来学习。

混合架构

  • 为了结合CNN的归纳偏置和ViT的优势,可以创建混合架构,将CNN用于提取图像的局部特征,然后将这些特征作为ViT的输入。
  • 这种混合模型可以在不同的分辨率上工作,例如,在预训练时使用高分辨率图像,在微调时使用低分辨率图像。

二维邻域结构和平移等效性

  • 在微调过程中,可以通过调整位置嵌入来引入一些二维邻域结构和平移等效性的特性,这有助于ViT在特定的视觉任务上表现更好。

微调及更高分辨率

  • 在Vision Transformer(ViT)的应用中,通常的流程是在大型数据集上预训练模型,然后在特定任务的较小数据集上进行微调。在微调阶段,我们会移除预训练模型的预测头部,并替换为一个零值初始化的D×K前馈层,其中D是特征维度,K是下游任务的类别数。
  • 微调时使用比预训练时更高的图像分辨率通常能带来性能提升。为了处理更高分辨率的图像,我们需要保持图像块的大小不变,这会导致图像块的数量增加,从而增加了有效序列长度。ViT能够处理任意长度的序列(受内存限制),但是预训练时的位置嵌入可能不再适用于新的序列长度。
  • 因此,需要对预训练的位置嵌入进行2D插值,以适应微调时的图像尺寸。这个过程是手动将关于图像2D结构的归纳偏置注入到Vision Transformer中的关键步骤。通过这种方式,ViT能够在微调阶段更好地利用高分辨率图像中的细节信息,从而提高在特定任务上的性能。

image.png

结果

  • ViT 在 ImageNet、CIFAR-100、VTAB 等数据集上进行了广泛的实验,证明了其在图像分类任务上的有效性。
  • 大规模预训练是 ViT 成功的关键,数据量的增加可以显著提升模型性能。
  • 与 CNN 相比,ViT 缺乏一些图像特定的归纳偏置,如平移等效性和局部性,但通过大规模数据训练可以克服这些限制。

第三部分:数据增强方法

数据增强的重要性

  • 提高泛化能力: 数据增强通过模拟真实世界的变化,如不同的光照、角度等,帮助模型学习到更加鲁棒的特征表示。
  • 减少过拟合: 在训练数据有限的情况下,数据增强可以显著提高模型的泛化能力,减少过拟合的风险。

图像数据增强技术详解

  • 几何变换:
    • 调整大小: 将图像调整到统一的尺寸,如 256x256 像素。
    • 随机裁剪: 随机选取图像的一部分,增加数据多样性。

image.png

  • 翻转: 水平和垂直翻转图像,模拟不同视角。

image.png image.png

  • 旋转: 随机旋转图像,增强模型对方向变化的适应性。

image.png

  • 颜色变换:
    • 颜色抖动: 随机改变图像的亮度、对比度、饱和度和色调。
    • 灰度化: 将图像转换为灰度图,有时可以提高模型的泛化能力。
    • 高斯模糊: 对图像进行模糊处理,使模型对细节的依赖减少。

image.png

  • 自动增强: 如 AutoAugment 和 RandAugment,自动选择数据增强策略。

image.png

音频数据增强技术

  • 时间拉伸和压缩: 改变音频的播放速度,模拟不同的语速或音乐节奏。
  • 音调变换: 调整音频的音调,模拟不同的声源。
  • 噪声添加: 向音频中加入背景噪声,提高模型对噪声的鲁棒性。
  • 掩码技术: 在频谱图上掩盖特定频率或时间区域,迫使模型学习更加泛化的特征。

混合数据增强方法

  • MixUp: 通过按比例混合两个图像及其标签,创建新的训练样本,增加数据多样性。

image.png

  • CutMix: 将一个图像的部分剪切并粘贴到另一个图像上,同时调整标签以反映剪切区域的大小。

image.png

实用工具和库

  • torchvision.transforms: 提供了丰富的图像数据增强方法,适用于 PyTorch 框架。
  • 音频数据增强: 通过特定的库如 pytorch/audio,可以轻松实现音频数据增强。

部分内容引用飞书云文档 (feishu.cn)