
简介这是一份面向深度学习与多模态情感分析研究者的模型与数据集整合包覆盖多模态表示学习、融合及情感分析等下游任务。内容包含Multimodal-Infomax、MISA、BBFN、Hfusion等多种经典与前沿模型实现并配套MELD、MUStARD、M2H2等数据集支持文本、音频、视觉模态的特征提取与融合提供了从训练、验证到评估的完整闭环。包体共185个文件以Python源码41个py、CSV标注与实验数据36个csv、pickle序列化对象21个pickle、arff特征文件18个arff为主另有模型权重h5、说明文档markdown及少量图表整体约286MB目录结构按模型和数据分模块组织便于检索和对照学习。目前已有1492人学习下载适合高校学生、毕业设计人员以及入门多模态方向的开发者参考。资源可直接用于复现论文对比实验、替换或改进融合策略也可作为数据预处理和特征提取的代码范本对快速搭建多模态情感分析基线、理解模态交互机理具有实用价值。1. 多模态情感分析资源包先把它当成一个可复现的实验框架来拆解你手里这份「多模态情感分析-各种针对多模态表示学习、多模态融合以及多模态情感分析等下游任务模型含数据集、多模态特征提取融合、实验评估.zip」名字虽然很长但本质上是把一个多模态情感分析方向从数据到评估的完整链路打包了。链路就四段拿文本、音频、视觉三路原始信号做特征提取做表示学习与融合最后在统一指标下评估。它不是某个单一模型而是一整套可以换数据、换模型、换融合方式的实验框架。适合谁一句话说清你如果是刚入情感计算方向的研究生或者想给短视频内容审核、人机交互、客服质检加一层语气表情文本综合判断能力的工程师这类资源包是最快的起点。真正需要动手之前你得先搞明白每一个文件对应的是这条链路上的哪一环哪些是能直接跑的最小可用示例哪些只是供你取特征的预训练权重。下文我会按数据与特征 → 表示与融合 → 评估与复现 → 排查与避坑的顺序把这个方向最常见的落地方案和参数细节讲透。2. 数据和特征提取从三路原始信号到统一维度的特征向量多模态情感分析的第一步不是模型而是特征。几乎所有翻车现场都发生在这一步模态没对齐、特征维度差太多、存下来的特征没做标准化。先把这一步夯实后面融合和评估才有的放矢。2.1 数据集的模态构成与对齐规则这类资源包里的数据集最常见的形态是视频片段 对应文本转写 音频轨。以影评视频数据为例一条样本通常包含一段 3~10 秒的短视频、该段落的文本转写有的细到单词级时间戳、以及由标注人员打分的情感标签。标签形式不外乎两类分类标签积极/消极/中性或者 -3 到 3 的强度和连续维度值valence/arousal。如果你在资源包里看到 MOSI/MOSEI 系列的名称基本就是这条技术路线。模态对齐是第一个坑。文本是按词或按句子组织的音频是连续波形视频是离散帧三者天然不在一个坐标系上。常见的对齐规则有两种句子级对齐和单词级对齐。句子级对齐最省事把整句对应的音频片段和视频帧片段截出来即可单词级对齐则要求时间戳精细到每个词直接决定你后续能不能做时序建模。我一般会先看资源包有没有提供对齐后的时间戳文件没有的话需要额外处理。2.2 文本特征提取BERT的最后四层该不该取平均值文本模态在情感分析里权重最高也能用上最成熟的预训练模型。常见做法是用 BERT 系列提取文本特征。下面是一段最小实现读入句子后输出一个固定维度的句向量。import torch from transformers import AutoTokenizer, AutoModel tokenizer AutoTokenizer.from_pretrained(bert-base-uncased) model AutoModel.from_pretrained(bert-base-uncased) def encode_text(texts, max_len40): encoded tokenizer( texts, paddingTrue, truncationTrue, max_lengthmax_len, return_tensorspt ) with torch.no_grad(): outputs model(**encoded) last_hidden outputs.last_hidden_state # [batch, seq_len, 768] # 取最后四层做均值池化比只取最后一层更稳 hidden_states outputs.hidden_states last_four torch.stack(hidden_states[-4:], dim0).mean(dim0) # 对非padding位置做平均 mask encoded[attention_mask].unsqueeze(-1).float() pooled (last_four * mask).sum(dim1) / mask.sum(dim1) return pooled.numpy()这里要注意outputs.hidden_states默认是不返回的要在AutoModel.from_pretrained时传output_hidden_statesTrue否则会报错。取最后四层做平均是这类任务常见的 trick最后一层过于拟合预训练任务后四层平均能保留更多通用的句法语义信息在中小规模数据集上普遍比只取 CLS 向量好 1~2 个点。max_len40对影评短句足够但如果你处理的是长评论要按数据集的句子长度分布改到 64 或 128。2.3 音频特征提取MFCC与eGeMAPS的取舍音频特征在情感分析中有两个流派手工声学特征和预训练语音模型特征。手工特征里最经典的是 openSMILE 提的 eGeMAPS88 维和 IS10 等配置eGeMAPS 包含 F0、响度、频谱斜率等是情感计算领域用得最多的标准配置但 openSMILE 的安装和命令行参数对新手不太友好。如果资源包里没带现成特征文件我用 librosa 提 MFCC 作为替代落地更简单。import librosa import numpy as np def extract_mfcc(audio_path, n_mfcc13, max_len200): y, sr librosa.load(audio_path, sr16000) mfcc librosa.feature.mfcc(yy, srsr, n_mfccn_mfcc) # 加上一阶、二阶差分形成 39 维特征 delta1 librosa.feature.delta(mfcc, order1) delta2 librosa.feature.delta(mfcc, order2) feat np.concatenate([mfcc, delta1, delta2], axis0) # 时间维统一到固定长度方便和文本特征对齐 if feat.shape[1] max_len: feat np.pad(feat, ((0, 0), (0, max_len - feat.shape[1])), modeconstant) else: feat feat[:, :max_len] return feat.T # [max_len, 39]这个函数有两个参数需要根据你的数据调整。n_mfcc13加差分是 39 维如果你想更接近 eGeMAPS 的信息量可以提到n_mfcc20变成 60 维但训练时长也会涨。max_len200是时间帧数对应约 3 秒音频在 16kHz、帧移 10ms 下的帧数。如果你的样本比这长要按实际分布改而不是硬截断否则会把情感爆发点截掉。2.4 视觉特征提取AU关键点与预训练模型的混合视觉模态是三个模态里最容易被放弃的因为提取成本高、收益却不稳定。经典路线是用 OpenFace 提面部动作单元AU和头部姿态OpenFace 输出 17 个 AU 的强度值加 3 个姿态角维度低、可解释性强但在很多 Linux 环境下编译容易踩坑。如果资源包里没有预提取的 AU 文件我建议先用 MediaPipe 提面部关键点同样能覆盖大多数场景。import cv2 import mediapipe as mp mp_face mp.solutions.face_mesh face_mesh mp_face.FaceMesh(static_image_modeTrue, max_num_faces1) def extract_face_landmarks(video_path, sample_fps10): cap cv2.VideoCapture(video_path) fps cap.get(cv2.CAP_PROP_FPS) step max(int(fps / sample_fps), 1) frames [] idx 0 while cap.isOpened(): ret, frame cap.read() if not ret: break if idx % step 0: rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) result face_mesh.process(rgb) if result.multi_face_landmarks: pts [(lm.x, lm.y, lm.z) for lm in result.multi_face_landmarks[0].landmark] frames.append(pts) idx 1 cap.release() return np.array(frames)每个关键点是 (x, y, z) 三元组478 个关键点乘 3 就是 1434 维比 AU 特征维度高不少后续融合时要注意降维或加正则。这里有几个参数值得说sample_fps10是每秒抽 10 帧对情感识别来说足够也能明显降低显存占用和预处理时间max_num_faces1是假设画面中只有一个人多人场景需要按人物做轨迹串接复杂度会上一个台阶。MediaPipe 返回的关键点坐标是归一化到 0~1 的这是一个容易被忽略的事实意味着它和文本特征的量级天然接近不需要额外做 min-max 归一化。2.5 用HDF5统一存特征避免每次实验重算特征提取最消耗的是时间尤其是视觉特征几十个视频可能就要跑一两个小时。把三路特征统一存成 HDF5 文件是我这类项目里的标准做法。HDF5 的结构很直观元数据放在属性attrs里量大的数组放在数据集dataset里读写都很快。import h5py import numpy as np def save_features(save_path, text_feats, audio_feats, visual_feats, labels, sample_ids): with h5py.File(save_path, w) as f: f.create_dataset(text, datatext_feats, compressiongzip) f.create_dataset(audio, dataaudio_feats, compressiongzip) f.create_dataset(visual, datavisual_feats, compressiongzip) f.create_dataset(label, datalabels) # 元数据放 attrs f.attrs[sample_ids] np.array(sample_ids, dtypeS32) f.attrs[text_dim] text_feats.shape[-1] f.attrs[audio_dim] audio_feats.shape[-1] f.attrs[visual_dim] visual_feats.shape[-1] f.attrs[max_len] visual_feats.shape[1]读取时按需取段不需要一次全量载入内存。compressiongzip在数据维度较大时能明显缩小文件体积但会拖慢读取速度如果你训练时要频繁随机访问大量样本可以去掉压缩换速度。attrs 里存维度信息非常实用后面写融合模型时不需要再回头翻特征提取脚本直接读 attrs 就能拿到各模态维度。2.6 特征标准化的顺序先拼接后归一化还是先归一再拼接这个问题看起来小实际影响很大。文本特征来自 BERT数值范围大概在 -2 到 2音频 MFCC 经过差分后数值可能在 -20 到 20视觉关键点归一化到 0~1。如果不做标准化直接拼起来喂给模型高数值的音频特征会主导早期梯度视觉特征基本被淹没。正确的顺序是先对每个模态各自做 z-score 标准化再拼接。原因是不同模态的量纲本身没有可比性先拼接再整体标准化会把模态内部的分布也抹平。每个模态单独归一化后数值范围统一到均值 0 方差 1后续融合层可以一视同仁地处理。这里还有一个小参数标准化统计量只能在训练集上计算然后用同一套均值和方差去处理验证集和测试集否则会引入数据泄漏。3. 多模态表示学习与融合从简单拼接、门控到注意力融合特征提取完成后核心问题就从提取什么变成了怎么融合。多模态表示学习要做的事是让来自不同模态的向量在同一个表示空间里不仅各自有判别力还能互相补充信息。情感分析里最典型的表现就是文本说今天天气真好语气却很平淡甚至表情是嫌弃单独看文本是正向融合后要识别出反讽。这说明融合不是简单把向量拼起来。3.1 多模态表示学习要解决什么问题多模态表示学习在情感分析里主要有两个目标对齐和互补。对齐指的是让不同模态在表示空间里有可比性比如通过对比学习拉近相同情感标签下不同模态的表示互补指的是融合后的表示要能捕捉到模态之间的不一致信息这在反讽检测中特别关键。常见做法是把三路特征分别过一层线性映射映射到相同维度再在这个公共空间里做融合。这个映射层就是表示学习的主体可学习的权重就是模态间关系的载体。一个必要的边界如果三个模态本身信息高度冗余比如都是中性情感融合带来的提升有限真正能拉开差距的是模态间存在冲突的样本。所以做这个方向要预设你的数据里有相当比例的情感不一致样本否则多模态融合的收益会被消融实验打回原形。3.2 特征级融合的三条路特征级融合有三种常见方案按复杂度递增直接拼接、加权求和、门控融合。直接拼接是最简单也是资源包里必定会带的基线方案把三路特征 concat 后接全连接层。加权求和需要先将三路映射到相同维度再做加权平均权重的设定方式可以是手工固定的也可以是可学习的。门控融合是三路里最实用的方案它学习每个模态在每条样本上的权重允许某条样本中视觉模态被抑制、文本模态被加强。import torch import torch.nn as nn class GatedFusion(nn.Module): def __init__(self, text_dim, audio_dim, visual_dim, hidden_dim128): super().__init__() self.proj_t nn.Linear(text_dim, hidden_dim) self.proj_a nn.Linear(audio_dim, hidden_dim) self.proj_v nn.Linear(visual_dim, hidden_dim) # 门控网络输出三个模态的权重和为 1 self.gate nn.Linear(hidden_dim * 3, 3) self.softmax nn.Softmax(dim-1) def forward(self, text, audio, visual): t torch.tanh(self.proj_t(text)) a torch.tanh(self.proj_a(audio)) v torch.tanh(self.proj_v(visual)) concat torch.cat([t, a, v], dim-1) weights self.softmax(self.gate(concat)) # [batch, 3] fused weights[:, 0:1] * t weights[:, 1:2] * a weights[:, 2:3] * v return fused, weights这个门控融合有三个参数值得调。hidden_dim128是公共表示维度过小会损失模态内细节过大会让门控过拟合小数据集一般取 64~256 之间。gate层直接接在tanh激活后的表示上如果门控前不经过非线性激活门控会倾向于给数值量级大的模态更高权重所以在proj后加tanh是必要的。最后权重用 softmax 归一化到和为 1这比单纯 sigmoid 更好解释也方便你做模态权重的可视化分析。在 MINI 场景下门控融合通常比简单拼接高 2~4 个点的准确率代价是参数量多出约 1 倍。3.3 注意力融合的PyTorch实现与维度细节门控融合是全局的对每一条样本生成一组固定的模态权重。注意力融合更进一步让不同位置的片段拥有不同的模态权重。比如一段视频里前两秒是铺垫、表情平静但语气低沉后两秒是情绪爆发点注意力融合能对时间维度上的每个位置单独分配权重这在长序列情感分析里优势明显。class CrossModalAttention(nn.Module): def __init__(self, embed_dim, num_heads4): super().__init__() self.multihead nn.MultiheadAttention(embed_dim, num_heads, batch_firstTrue) def forward(self, query, key_value, maskNone): # query: [batch, seq_len, embed_dim] # key_value: [batch, seq_len, embed_dim] attn_out, attn_weights self.multihead(query, key_value, key_value, attn_maskmask) return attn_out, attn_weights使用时的维度要点embed_dim必须和三个模态映射后的维度一致否则nn.MultiheadAttention直接报维度错误。一个常见的做法是让文本特征做 query音频和视觉特征做 key/value因为文本的情感信息密度最高适合作为查询方去问其他模态该关注哪里。batch_firstTrue是 PyTorch 2.x 的推荐写法省去维度转置的麻烦但如果你用的是旧版本 1.x要注意batch_first参数是否存在。注意力矩阵在 mini 样本上可能出现过拟合如果你的训练集只有几百条建议num_heads2而不是默认的 8。3.4 融合模型里的过拟合边界融合模型的参数量增长很快三路特征各自投影 融合层 分类头随便就能到几十万参数而多模态情感数据集往往只有几千条样本这是融合模型过拟合的温床。几个实测有效的防线投影层加 dropout 0.3~0.5门控层加 weight decay训练用早停。另外一个容易忽略的点是如果三路特征里某一维数值范围特别大比如 MFCC 差分后的异常值会直接放大对应模态的梯度所以特征标准化在融合前一定不能省。此外多模态融合不是越复杂越好。在资源包提供的小数据集上门控融合往往比注意力融合更稳注意力模型更容易过拟合。我一般是先跑通拼接和门控两个基线确认多模态相对单模态有稳定提升再上注意力融合而不是一上来就追最新模型。4. 实验评估与复现让模型输出可比较的情感三分类结果资源包后半部分的价值在实验评估上。一个模型好不好不能只看准确率情感数据的类别分布往往是偏斜的中性类别可能占了四成。评估设计不合理等于没做实验。4.1 评估指标怎么选情感三分类积极/中性/消极里最忌讳只报 accuracy。如果数据里 40% 是中性一个全预测中性的模型准确率就有 40%。对这类任务我一般看三个指标加权 F1、宏平均 F1、还有混淆矩阵。加权 F1 反映模型在真实数据分布下的综合表现宏平均 F1 更关注少数类。如果资源包的标签是连续值比如 -3 到 3评估指标要换成相关系数和均方误差。from sklearn.metrics import classification_report, confusion_matrix, f1_score y_true [...] # 真实标签 y_pred [...] # 模型预测 print(classification_report(y_true, y_pred, target_names[neg, neu, pos])) print(Macro-F1:, f1_score(y_true, y_pred, averagemacro)) print(Weighted-F1:, f1_score(y_true, y_pred, averageweighted)) print(confusion_matrix(y_true, y_pred))averagemacro对每个类别单独计算 F1 再取平均少数类影响被放大能暴露模型只学多数类的问题。averageweighted按各类别样本数加权更贴近实际部署。两个都看不要二选一。混淆矩阵是排查错误分布最直接的工具——如果你发现模型总把中性判成消极那是特征没捕捉到语气里的中性线索不是简单调阈值能解决的。4.2 训练配置三个关键参数与早停策略训练配置上多模态情感分析最常见的是两段式学习率预训练特征提取器BERT的微调用低学习率 2e-5 到 5e-5后接的融合层和分类头用正常学习率 1e-3 到 5e-3。如果资源包里已经给的是提取好的特征而非原始文本则不需要微调 BERT整体学习率统一用 1e-3 即可。optimizer torch.optim.AdamW([ {params: bert_model.parameters(), lr: 2e-5}, {params: fusion_module.parameters(), lr: 1e-3}, {params: classifier.parameters(), lr: 1e-3}, ], weight_decay1e-4) scheduler torch.optim.lr_scheduler.LinearLR( optimizer, start_factor0.1, total_iters5 ) early_stop_patience 5LinearLR做 warmup前 5 个 epoch 从 10% 学习率线性升到目标值能避免训练初期大步长把 BERT 预训练权重冲坏。early_stop_patience5是验证集指标连续 5 轮不升就停。batch size 建议从 32 起步。多模态模型显存占用比单模态高不少BERT 输入加音频特征加视觉特征同时进显存不算大但也不小。如果输入序列长度被设成 128 甚至更长batch size 可能要降到 8 或 16 才能跑得动这时候优先减 BERT 侧的序列长度而不是减 batch size。4.3 消融实验设计证明每个模态都在干活资源包如果带了实验评估模块必然包含消融实验。消融实验的目的是回答三个问题多模态比单模态提升多少融合方式起多大作用哪个模态贡献最大最规范的做法是固定训练参数和评测脚本只改变输入模态组合。实验设置输入模态预期作用单模态文本仅文本文本基线通常最高单模态音频仅音频检查语气信息量单模态视觉仅视觉检查表情信息量双模态文本音频文本音频文本语义语气双模态文本视觉文本视觉文本语义表情三模态拼接全部 concat特征级融合基线三模态门控门控融合对比融合方式优劣一个容易犯的错误是消融实验只换输入不换模型结构导致单模态结果失真。比如门控融合模型本身有三组投影权重输入只有文本时音频和视觉投影层参数照样存在且被随机初始化输出会受噪声影响。所以单模态基线要用单独训练的单模态分类器而不是直接把融合模型的输入置零。这样出来的表才拿得出手。5. 排查与避坑数据加载、对齐、显存和泄漏这个方向踩坑的频率挺高我给团队带新人的时候头两周碰到的几乎都是同一批问题。按现象写在这里方便你对号入座。5.1 现象文本-音频长度对不上一训练就报维度错误这个坑基本出现在第一次跑通全流程时。文本按句子编码后是[batch, seq_len, 768]音频按帧提取后是[batch, 200, 39]视觉按帧抽样后是[batch, 20, 1434]三者第一维的序列长度完全不一致直接拼接必然报错。原因三个模态的对齐单位不同。文本以词为单位音频帧间隔通常是 10ms视频帧间隔依采样率而定三者在时间轴上没有对齐到同一个分辨率。解决先做时间分辨率统一。最简单的方式是把三路特征都池化到句级特征即每段视频只输出一个向量维度分别为 768、39、1434 或映射后的 128然后再进入融合层。这牺牲了时序信息但能最快跑通基线。如果你需要保留时序就要按 2.1 节的单词级时间戳做区域池化保证每个时间步下三路特征都存在。切记时间戳在训练集、验证集、测试集上必须用同一套对齐逻辑否则各集合的分布不一致。5.2 现象loss 震荡或直接不收敛验证集指标在 0.400 附近徘徊0.400 附近通常意味着模型退化成多数类预测器根本没学到有效信息。常见原因有两个一是学习率过大尤其是 BERT 微调部分用了 1e-3 级别的学习率预训练权重几轮就被冲坏二是输入特征未标准化数值范围大的单模态主导了梯度方向。解决先检查特征标准化确认三个模态方差在同一量级。再把优化器分组BERT 部分降到 2e-5融合层保持 1e-3。如果还震荡把 warmup 轮数从 5 加到 10。如果是原始文本输入且 BERT 不是冻结状态建议先冻结 BERT 只训练融合层能收敛后再解冻微调这样排查问题更快。5.3 现象显存溢出报 CUDA out of memory多模态训练显存吃紧主要来自三块BERT 的中间激活值、视觉特征在 batch 维的复制、交叉注意力矩阵。最常见的是第二块视觉特征维度高1434 维如果 batch size 是 32光是视觉特征存储就占去大部分显存。解决把视觉特征先经过一层线性降维到 128 维再进融合层如果这发生在数据加载阶段问题反而好定位。再把 BERT 的max_len从 128 降到 40这个操作对显存的削减非常明显。最后才是把 batch size 从 32 降到 16 或 8。多模态实验的显存规划顺序是先降序列长度再降特征维度再降 batch size因为前两者不牺牲梯度稳定性。5.4 现象验证集指标虚高测试集一塌糊涂这是最危险的坑通常发生在把同一视频的相邻片段既放训练集又放验证集的时候。如果资源包的数据划分本身没做按视频粒度划分是最安全的。原因相邻帧和相邻句子的特征高度相似如果按句子随机划分模型在训练阶段见过验证集内容指标虚高是必然的。解决划分数据集时以视频为单位用sklearn.model_selection.GroupShuffleSplit把视频 ID 作为 group 参数。这属于数据泄漏范畴比模型本身的问题更优先处理。另外一个相关的小坑是特征标准化统计量只能从训练集计算如果你用全部数据的均值和方差去做标准化同样会带来小幅泄漏尤其是数据集中每个视频的采集环境差异大时这个泄漏会更明显。5.5 现象融合后效果反而不如单模态文本基线这不是模型 bug而是多模态融合的常见困境如果文本模态信息已经很强而音频和视觉特征质量不高强行融合是在给文本特征加噪声。很多资源包的视觉特征提取得比较粗糙比如直接用预训练卷积网络提全局特征压根没有面部信息对情感判断来说价值很低。解决先单独测每个单模态的效果。如果音频单模态准确率只有文本的一半说明音频特征没有有效区分度。这时有两个方向换更强的音频特征提取方案比如用预训练语音模型或者调整融合权重让门控机制学到文本为主、其他为辅。不建议直接用网络结构强行让模型自己学小数据集上学不动的概率很大。更实用的兜底方法是做特征选择去掉视觉特征用文本加音频的双模态融合往往结果更好。这也算回归到不是模态越多越好这个朴素的道理。5.6 现象权重可视化时某个模态的权重恒为 0门控融合训练完把权重打出来发现视觉模态的权重几乎恒等于 0其他两个模态接近 1。这不是训练 bug而是门控模型学到的真实情况视觉特征从当前提取方案里拿不到有用信息。把它当成一个信号而不是一个错误。原因特征提取阶段的质量决定了融合的天花板。权重为 0 恰好说明视觉特征是噪声和 5.5 的原因一脉相承。解决不要硬调权重分布回到视觉特征提取环节。看看是否有更好的模型可以替换或者是否需要对视频里的局部区域人脸区域裁剪后再提取。另一种可行的思路是改变门控网络的输入门控的输入是每个模态的原始表示如果原始表示本身就含有模态差异信息权重学习会更稳定。6. 时序对齐与跨模态补全从句子级走向段级情感分析的进阶路径当你把句子级的多模态情感分类跑通下一个值得投入的方向是时序对齐与跨模态补全这也是多模态情感分析从实验室走向真实场景时必然要面对的问题。句子级模型假设每一句是独立的但真实对话中情感是连续变化的可能需要看前一句的铺垫才能理解后一句的反讽。时序建模的常见做法是把一段视频按滑动窗口切成多个句子级片段提取每个片段的多模态特征然后用一个时序模型LSTM 或 Transformer对片段序列建模。这里有一个关键前置步骤即时间戳对齐——如果每个片段的时间戳不精确后面时序模型拿到的是错位的输入序列再好的模型也学不到东西。我建议在进入时序模型之前先做一步文本关键词时间戳的校准用 ASR 转写工具输出的词级时间戳反向切分音频和视频然后可视化检查一下切分边界是否符合预期再进入训练。这一步成本不高但能省掉后面的很多排查时间。另一个进阶方向是跨模态补全。真实场景中经常有某个模态缺失比如视频被剪掉了画面只剩音频和文本。常见做法是对缺失模态做对抗式生成或掩码重建让模型在缺失条件下仍能维持可用性能。不过在资源包提供的小数据集上生成式补全容易过拟合可以先尝试把缺失模态的特征置零并让门控模型学习该模态不可用时降低其权重效果可能出人意料地好。我自己的习惯是在跑任何融合模型之前先把三路特征的对齐情况打印出来做成可视化的时间线图检查文本、音频、视觉是否在时间轴上有交叉。这个习惯帮我省掉了至少一半的排查时间。多模态情感分析难不在模型而在数据和特征的对齐质量——这是这个标题里最值得你投入精力的地方。希望这段笔记能帮你少走几步弯路。本文还有配套的精品资源点击获取