【论文复现】多模态COGMEN详解
情绪是驱动人类行为不可或缺的一环,故而,研发能够理解并辨识人类情绪的人工智能体系显得尤为迫切。在多人对话的场景中,个体的情绪不仅受到其他参与者言辞的影响,还会被自己在对话中表达的情绪所左右。
📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹
论文:COGMEN: COntextualized GNN based Multimodal Emotion recognitioN
原文链接
概述
情绪是驱动人类行为不可或缺的一环,故而,研发能够理解并辨识人类情绪的人工智能体系显得尤为迫切。在多人对话的场景中,个体的情绪不仅受到其他参与者言辞的影响,还会被自己在对话中表达的情绪所左右。本文介绍了一种名为COGMEN(基于上下文图神经网络的多模态情感识别系统),该系统巧妙融合了局部信息(即对话者间的内部及外部相互依赖)与全局信息(即对话的整体上下文)。COGMEN模型采纳了图谱神经网络(GNN)框架,以精准捕捉对话中错综复杂的关系网络,涵盖局部与全局两个维度的信息。实验证明,该模型在IEMOCAP和MOSEI这两个权威数据集上取得了业界领先(SOTA)的成绩,而详尽的消融实验进一步凸显了在两个信息层面上进行建模的必要性。
本文所涉及的所有资源的获取方式:这里
论文模型框架
图2显示了详细的体系结构。输入的话语作为语境提取器模块的输入,该模块负责捕获全局语境。语境提取器为每个话语(utterance)提取的特征形成了一个基于说话人之间交互的图(Graph Formation)。该图作为Relational - GCN的输入,然后是graph transformer,graph transformer使用形成的图来捕捉话语之间的内部和内部关系。最后,作为情感分类器的两个线性层使用所有话语获得的特征来预测相应的情感。
特征融合的方式:
简单的concat,论文运用了最简单的融合方式,有在尝试别的融合方式
transfomer层是提取一段对话中,不同语句之间的信息
经过一层transformer之后,融合了信息,就开始建图,进行图学习
图学习分别进行了图卷积以及,图transformer,图学习的意义在于,更好的捕捉对话中这种一来一回的关系,来融合来自不同短语的情感信息。
最后链接一个分类器就结束了
演示效果
核心逻辑
##transformer层:
def forward(self, text_len_tensor, text_tensor):
if self.use_transformer:
rnn_out = self.transformer_encoder(text_tensor)
rnn_out = self.transformer_out(rnn_out)
else:
packed = pack_padded_sequence(
text_tensor, text_len_tensor, batch_first=True, enforce_sorted=False
)
rnn_out, (_, _) = self.rnn(packed, None)
rnn_out, _ = pad_packed_sequence(rnn_out, batch_first=True)
return rnn_out
##图学习层
class GNN(nn.Module):
def __init__(self, g_dim, h1_dim, h2_dim, args):
super(GNN, self).__init__()
self.num_relations = 2 * args.n_speakers ** 2
self.conv1 = RGCNConv(g_dim, h1_dim, self.num_relations)
self.conv2 = TransformerConv(h1_dim, h2_dim, heads=args.gnn_nheads, concat=True)
self.bn = nn.BatchNorm1d(h2_dim * args.gnn_nheads)
def forward(self, node_features, edge_index, edge_type):
x = self.conv1(node_features, edge_index, edge_type)
x = nn.functional.leaky_relu(self.bn(self.conv2(x, edge_index)))
return x
##分类器:
def forward(self, h, text_len_tensor):
if self.args.dataset == "mosei" and self.args.emotion == "multilabel":
if self.args.use_highway:
h = self.highway(h)
hidden = self.drop(F.relu(self.lin1(h)))
scores = self.lin2(hidden)
# y_hat = torch.sigmoid(scores) > 0.5
y_hat = scores > 0
return y_hat
log_prob = self.get_prob(h, text_len_tensor)
y_hat = torch.argmax(log_prob, dim=-1)
return y_hat
使用方式
处理数据
python preprocess.py --dataset=“iemocap_4”
训练模型
python train.py --dataset=“iemocap_4” --modalities=“atv” --from_begin --epochs=55
测试模型
python eval.py --dataset=“iemocap_4” --modalities=“atv”
部署方式
下载我训练好模型,以及数据集,附件里有data,modelcheckpoint文件夹,分别替换代码中的文件夹即可,我对每个单独的模态都有训练。
建议在pytorch官方来下载配置pytorch
建议用conda配置环境
避坑指南
如果新手cuda配置不成功,可以在代码:
parser.add_argument(“–device”, type=str, default=“cuda”, help=“Computing device.”)
处,把"cuda"改成"cpu"的方式
如果.pt文件无法打开,可以选择重新训练,自己生成模型文件
模型文件有硬件要求,提供的.pt文件都是用cpu训练,如果需要改成cuda版本,需要另外进行训练
编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!
更多内容详见:这里
更多推荐
所有评论(0)