当配图开始说谎:多模态情感分析的五种融合策略实战
【免费下载链接】Multimodal-Sentiment-Analysis多模态情感分析——基于BERT+ResNet的多种融合方法项目地址: https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis
纯文本情感分析有一个绕不开的软肋:它读不懂图。一条评论写着"太好看了吧,太让人惊喜了",文字层面妥妥的正面;可只要旁边配一张翻着白眼的表情包,语义瞬间反转。社交媒体、电商评论区里,图文反讽和"阴阳怪气"式配图无处不在,光靠文本做情感分析模型训练,遇到这种样本大概率翻车。
破局思路其实很直接:把图像也喂给模型。Multimodal-Sentiment-Analysis做的就是这件事——一个基于 BERT 文本编码与 ResNet50 图像编码的多模态情感分析项目,内置 NaiveCat、NaiveCombine、CMAC、HSTEC、OTE 五种融合策略,一条命令切换,方便你对比不同融合粒度的效果差异。
它到底能干什么
核心任务是把"文本 + 图像"的样本判成三类情感:负面、中性、正面。文本走 RoBERTa,图像走 ResNet50,两者的特征怎么拼、怎么交互,由你选择的融合层决定。典型落地方向:
- 社媒舆情监测:用户常用图片传达真实情绪,单看文字容易误判反讽。
- 电商评论分析:文案与商品图是否"货不对板",多模态情感分类能捕捉图文矛盾。
- 广告素材评估:同时给文案和视觉图打情感分,判断整体调性。
- 科研与课程实验:五种架构 + 单模态消融开关,适合研究融合策略对比。
项目目录速览,跑起来只需要关心这几处:
Multimodal-Sentiment-Analysis ├── main.py # 入口:--do_train 训练 / --do_test 推理 ├── Trainer.py # 训练循环与三组学习率 ├── Config.py # 全部超参数 ├── Models/ # 五种融合策略的完整实现 ├── data/ # 训练/测试数据与原始图片 └── src/ # 融合结构架构图三步跑起来
装依赖
git clone https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis cd Multimodal-Sentiment-Analysis pip install -r requirements.txt依赖锁定在 torch 1.8.2 + transformers 4.18 这套组合上,照着requirements.txt装最省事,别自行混搭版本。
放数据
数据集下载链接:https://pan.baidu.com/s/10fOExXqSCS4NmIjfsfuo9w 提取码:gqzm
解压后把图片放进data/data/、文本放在data/下,代码会自动把train.txt整理成train.json再加载,不用手动做格式转换。
训练情感分析模型
python main.py --do_train --epoch 10 --text_pretrained_model roberta-base --fuse_model_type OTE| 参数 | 说明 |
|---|---|
--epoch | 训练轮数,默认 10,建议 10~20 |
--lr/--weight_decay | 融合层学习率与权重衰减,默认 5e-5 / 1e-2 |
--text_pretrained_model | 文本底座,默认roberta-base,可在 Hugging Face 换 |
--fuse_model_type | OTE、NaiveCat、NaiveCombine、CMAC、HSTEC五选一 |
训练时验证集表现最好的 checkpoint 会自动存进output/,每轮打印 "Update best model!" 就是它。
跑测试
python main.py --do_test --text_pretrained_model roberta-base --fuse_model_type OTE --load_model_path output/OTEModel.pth预测结果写入output/test.txt;加--text_only或--img_only可跑单模态消融。
五种融合策略,怎么选?
这是全项目技术密度最高的部分。五种 BERT 文本图像融合方案,前两种朴素,后三种带注意力:
| 策略 | 融合粒度 | 一句话直觉 | 推荐场景 |
|---|---|---|---|
| NaiveCat | 输出层拼接 | 文本池化向量 + 图像特征向量直接 cat,过一个分类头 | 最小基线,验证 pipeline 跑得通 |
| NaiveCombine | 输出层双头 | 文本、图像各出分,概率求和后再 softmax | 想看两个模态谁更能扛 |
| CMAC | token 级双向跨模态注意力 | 文本逐词去"看"图像特征图,图像反过来"看"文本,各出一个头 | 特征交互强的复杂场景,算力充足时 |
| HSTEC | token 级自注意力编码 | 两模态 token 序列拼接后过 TransformerEncoder 统一编码 | 想让模型自己学模态间关系 |
| OTE | 输出层轻量编码 | 两模态压缩成两个 token 过一次 TransformerEncoder 再分类 | 通用首选,结构简单、项目内实测最优 |
项目 README 里的实测结果挺有启发:结构最"轻"的 OTE 准确率 74.6%,HSTEC 73.1%、NaiveCombine 73.6%,而最复杂的 CMAC 只有 67.2%。数据量不大时,简单结构往往更稳。选型上建议先用 OTE 跑通拿基线,用 NaiveCat 验证整条链路,注意力方案留到数据充足时再上。
🔧 调优与避坑
- 学习率:融合层 3e-5 是合理默认,BERT/ResNet 骨干单独走 5e-6 的小学习率,防止大学习率把预训练权重冲坏;日常只调
--lr一个参数即可,5e-6~5e-4 区间内小幅试。 - 轮数:10~20 个 epoch 足够,盯 Valid Acc 不看 Train Loss,连续 3 个 epoch 不涨就停。
- 类别不均衡:数据集三类样本量差距明显,项目给 NaiveCombine 配了加权交叉熵;换自己的数据时记得按分布重算
Config.py里的loss_weight,其他模型的损失权重是 1,默认不生效。 --do_test报"请输入已训练好模型的路径":这是最常见的坑,模型在output/下,把完整路径传给--load_model_path;其次确认图片已解压到data/data/且文本在data/下,否则会静默读空。- 显存吃紧:batch_size 默认 16、图像 224×224,显存紧张时把它降到 8 或 4;CPU 环境下这个模型会非常慢,能上 GPU 就上 GPU。
配套工具链
| 库 | 在项目中的角色 | 一句话说明 |
|---|---|---|
| Transformers | 提供 RoBERTa 等预训练文本编码器与分词器 | 换中文底座改成bert-base-chinese即可,代码不用动 |
| TorchVision | 提供 ResNet50 预训练图像骨干与预处理管线 | 想换视觉骨干可直接替换成其他 torchvision 模型 |
| Scikit-Learn | 计算准确率等评估指标 | 指标逻辑集中在utils/APIs/APIMetric.py |
框架层只是 Hugging Face 编码器加 torchvision 骨干的组合,真正决定这套多模态情感分析项目上限的,是你选哪种融合策略。
【免费下载链接】Multimodal-Sentiment-Analysis多模态情感分析——基于BERT+ResNet的多种融合方法项目地址: https://gitcode.com/gh_mirrors/mu/Multimodal-Sentiment-Analysis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考