一文读懂多模态情感分析:基于 BERT+ResNet 的五种文本图像融合方法
【免费下载链接】Multimodal-Sentiment-Analysis多模态情感分析——基于BERT+ResNet的多种融合方法项目地址: https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis
Multimodal-Sentiment-Analysis 是一个多模态情感分析项目,它把一条推文的文本和配图放在一起,用 BERT 编码文字、ResNet50 编码图片,再把两路特征融合,最后判定情感倾向(积极、中性、消极)。适合想入门图文多模态情感识别、又想看完整可运行代码的开发者。
一|为什么文本和图片要一起看
只看文字判情感容易漏掉关键信息:一句"呵呵"配上微笑表情,意思完全不同。这个项目的思路很直接——文本和图像各自过一遍预训练模型得到特征向量,再用不同的融合结构把它们揉在一起分类。
它和常见多模态方案的区别在于:项目里同时给出了五种融合策略,从最朴素的两路拼接,到跨模态注意力,到输出层 Transformer 编码,你可以通过同一套数据横向对比,看哪种融合方式更稳。作者在测试集上的结果里,OutputTransformerEncoder 以 74.625% 的准确率领先,仅用文本的消融实验也有 71.875%,说明融合确实带来了增益。
二|三分钟跑通训练
整个过程分四步,全部在仓库根目录操作。
- 克隆代码(仓库地址:https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis)
git clone https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis- 安装依赖。项目锁定了一版较旧的 PyTorch 生态(torch 1.8.2 + transformers 4.18),建议用 Python 3.8 或 3.9 建虚拟环境,避免高版本不兼容:
pip install -r requirements.txt准备数据集。训练用的文本和图片文件(每条样本一个 guid.txt 加一个 guid.jpg)需要自行下载,解压后放在 data/data/ 目录下,下载地址写在 README.md 里,以仓库最新说明为准。仓库已附带 data/train.txt、data/test_without_label.txt 等索引文件,不需要你另配。
开始训练。最小组合一条命令即可,GPU 和 CPU 都能跑(自动检测):
python main.py --do_train --epoch 10 --fuse_model_type OTE每轮训练结束会打印验证集准确率,最优模型自动存到 output/ 目录下。训练完成后用同一条入口加 --do_test 和 --load_model_path 即可在测试集上推理,结果写入 output/test.txt。
三|项目里有什么
代码按"数据、模型、工具"三块组织,结构相当清爽:
| 功能域 | 位置 | 作用 |
|---|---|---|
| 数据集 | data/ | 训练/测试索引(.txt)和格式化后的 .json,图文文件放 data/data/ |
| 融合模型 | Models/ | 五种融合结构,一个文件一个模型 |
| 训练循环 | Trainer.py | AdamW 优化器(BERT、ResNet、融合层分组设学习率)、训练/验证/预测 |
| 数据处理 | utils/DataProcess.py、utils/common.py | 标签词表、DataLoader 封装、数据格式化与读取 |
| 全局配置 | Config.py | 超参数、路径、batch size,改这里或传命令行参数 |
| 入口脚本 | main.py | 解析命令行参数,串起训练与测试流程 |
Models/ 下的五个文件分别对应:NaiveCat(文本图像特征直接拼接)、NaiveCombine(两路特征相加)、CMAC(跨模态注意力)、HSTEC(隐状态 Transformer 编码)、OTE(输出层 Transformer 编码)。命令行里用 --fuse_model_type 切换,缩写或全名都认。
四|核心链路怎么跑
以效果最好的 OTE 为例,一条样本的完整旅程是这样的:
- 输入:data/data/ 下一条 guid 对应一个 .txt 文本和一个 .jpg 图片,标签为 positive / neutral / negative 三类。
- 文本分支:文本经 Hugging Face 分词器送入 roberta-base,取 pooler 输出过一层线性变换,压缩成 64 维向量。
- 图像分支:图片缩放为 224×224,过 ResNet50 主干(默认冻结参数),同样压成 64 维。
- 融合:两个向量在序列维拼成一个长度 2 的序列,进一个 TransformerEncoderLayer 做交互,拿到融合表示。
- 输出:两层全连接加 Dropout 输出三分类 logits,交叉熵损失(带类别权重 [1.68, 9.3, 3.36] 应对样本不均衡)回传更新。
跨模态注意力方案(CMAC)的结构稍有不同,它还会把 ResNet 中间层的特征图压成 64 个空间 token,与文本隐状态做交叉注意力,细节可以看模型结构图:
OTE 方案的结构更简洁,输出层直接用一个 Transformer 编码器处理两路特征:
五|关键参数怎么调
影响结果的参数不多,Config.py 和命令行里最值得动的有五个:
- --fuse_model_type:决定融合结构。想快速出基线用 NaiveCat;追求精度用 OTE。换模型后历史 checkpoint 不通用,要重训。
- --epoch:默认 10,仓库配置里写的是 20。数据集不大,跑满 20 轮基本收敛,验证准确率不再上升就可以停。
- --lr:融合层学习率,默认 5e-5。BERT 和 ResNet 主干在 Trainer.py 里单独用 5e-6 微调,动大模型学习率前先只调这个。
- --text_pretrained_model:文本编码器,默认 roberta-base,可换成 Hugging Face 上任意 AutoModel 能加载的模型。注意文本和图像特征维度要经过各自 trans 层适配,换模型无需改代码。
- --text_only / --img_only:单模态开关。加 --text_only 时图像会被替换成纯黑图,可用于做消融实验,复现 README 里的 Text Only 71.875% 结果。
类别权重 loss_weight 建议保持不动,它是按数据集正负样本比例算好的。
六|新手高频坑
- 数据放错位置:训练脚本会去 data/data/ 下找 guid 对应的 .txt 和 .jpg,压缩包没解到这一层就会在格式化阶段报找不到文件。
- 测试集没有标签:data/test_without_label.txt 里标签全是 null,这是正常的——它是无标签测试集,跑 --do_test 时不需要真实标签。
- torch 版本装不上:requirements 锁的是 torch 1.8.2,Python 3.10 以上装不了。要么降级 Python,要么放宽到更高版本(个别 API 可能小改,以仓库最新说明为准)。
- ResNet 默认冻结:config 里 fixed_image_model_params 为 True,图像特征只靠后面 trans 层适配。想微调 ResNet 记得关掉这个开关,并留意显存。
写在最后
这个项目代码量很小,但五脏俱全:五种多模态融合结构、完整的训练评估循环、可复现的实验数据,拿来当多模态情感分析的入门教材非常合适。建议先跑通 OTE,再逐个替换 --fuse_model_type 做对比,你会对"融合结构如何影响情感识别效果"有直观体感。更多细节(五种模型结构图、结果表格)都在 README.md 里,欢迎动手实验。
【免费下载链接】Multimodal-Sentiment-Analysis多模态情感分析——基于BERT+ResNet的多种融合方法项目地址: https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考