如果你需要了解源码的更多信息,请查看项目结构。
检查点命名格式为{训练类别}/{数据集}/{训练方式}--{批大小}--{分类损失函数}/{网络摘要}/{网络哈希}--{随机种子}
,
例如training/MELD--E/trainable--2--{loss}/1xE--T/51fe7ba3--114
。
每个训练任务的检查点对应一个文件夹,
对于单一模态任务,文件夹命名为{模态}--{分类任务}{训练方式}({骨干网络})
,
对于多模态任务,文件夹命名为{模态}--{分类任务}{训练方式}--{融合网络}({骨干网络})
。
其中模态分为text
、audio
和video
,简称如下:
- text: T
- audio: A
- video: V
训练方式分为Full Tuning
、LoRA
和 Froze Backbones
,简称如下:
- Full Tuning: T
- LoRA: L
- Froze Backbones: F
其中数据集类型分为emotion
和sentiment
,简称如下:
- emotion: E
- sentiment: S
- opencv 首次调用耗时: 0.11s 平均耗时: 0.08s
- pyav 首次调用耗时: 0.22s 平均耗时: 0.17s
经测试,OpenCV 比 PyAV 速度更快。
由于当特征提取模块冻结时,相同输入的特征提取模块的输出不会发生变化,因此可以将特征提取模块的输出缓存下来,以减少重复计算。
safetensors
是 huggingface
推出的一个储存和分发张量的格式,相比于其他格式,safetensors
拥有更好的性能。
依赖技术:
在实验过程中,我们通常会保存许多模型的检查点,也会通过修改参数训练多个不同的模型。 一般情况下,每一份的模型都需要保存一份参数,这样会导致存储空间的浪费。 为了解决这个问题,我们使用软连接将相同的模型参数链接到不同的模型文件夹中,以减少存储空间的浪费。 同时,这种方法并不会破坏原本的文件夹结构,使得整体结构更加清晰。
在实验过程中,为了比较不同的模型,往往需要频繁的修改参数以便训练多个不同的模型。 一般情况下,有三种可选的方案:
- 直接修改源码;
- 设置合适的命令行参数;
- 使用配置文件。
直接修改源码并不适合一个工程化的项目,因为这样会导致代码的混乱,不利于维护。 设置命令行参数虽然可以解决这个问题,但是当参数较多时,命令行参数会变得很长,不利于阅读,且命令行参数的表达能力有限, 例如很难表示列表、字典等数据结构。 因此,我们最终选择使用配置文件来确定模型的参数,这样既可以保持代码的整洁,又可以方便的修改参数。
依赖技术:
在 TelME 的实现中,使用知识蒸馏训练不同的模态需要进行多次, 这样会导致训练时间过长(即使使用了本项目的缓存技术)。 为了解决这个问题,我们使用将多个模态的知识蒸馏训练合并到一次训练中,这样可以大幅度减少训练时间。
本项目实现了基础的持续集成,具体可以参考 train-and-eval.yml。
- 下载 MELD 数据集。
- 将原始 MELD 数据集中视频文件(mp4)中的音频以 flac 格式提取出来,并按照规定的数据集结构组织文件。
- 链接数据集到项目
datasets
文件夹。
mkdir datasets
ln -s /path/to/MELD datasets/MELD
- 安装依赖。
uv sync --all-extras --dev
# 如果你在中国大陆,可以使用清华源加速下载
# uv sync --all-extras --dev --index-url https://pypi.tuna.tsinghua.edu.cn/simple --extra-index-url https://download.pytorch.org/whl/cu121
- 接下来可以使用nanoflow进行实验。
uvx nanoflow run experiments/mdn.toml
uvx nanoflow run experiments/makd.toml
方法 | 随机种子 | 准确率 | weighted-F1 |
---|---|---|---|
apcl(temp=0.08, beta=0.1, gamma=0.1) | 43 | 67.7395% | 67.0433% |
apcl(temp=0.08, beta=0.1, gamma=0.1) | 42 | 68.0460% | 66.9064% |
apcl(temp=0.08, beta=0.1, gamma=0.1) | 114 | 67.5862% | 66.5470% |
apcl(temp=0.08, beta=0.1, gamma=0.1) | 0 | 67.9310% | 66.9192% |
spcl(temp=0.08, pool_size=512, support_set_size=64) | 42 | 68.3142% | 67.3102% |
spcl(temp=0.08, pool_size=512, support_set_size=64) | 114 | 67.3180% | 66.5503% |
spcl(temp=0.08, pool_size=512, support_set_size=64) | 0 | 66.6284% | 66.5037% |
方法 | 随机种子 | 准确率 | weighted-F1 |
---|---|---|---|