1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| """ 论文:Consensus-Guided Shared-Specific Tri-View Learning for Speech Emotion Recognition arXiv: 2609.19826
核心方法:三视图分解(共识+特异+融合) """
import torch import torch.nn as nn
class TriViewSER(nn.Module): """共识引导三视图语音情感识别""" def __init__(self, audio_dim=256, hidden=128, num_emotions=7): super().__init__() self.audio_encoder = nn.Sequential( nn.Linear(audio_dim, hidden), nn.GELU(), nn.Linear(hidden, hidden) ) self.shared_view = nn.Sequential( nn.Linear(hidden, hidden//2), nn.GELU(), nn.Linear(hidden//2, hidden//2) ) self.specific_view = nn.Sequential( nn.Linear(hidden, hidden//2), nn.GELU(), nn.Linear(hidden//2, hidden//2) ) self.fusion_view = nn.Sequential( nn.Linear(hidden, hidden//2), nn.GELU(), nn.Linear(hidden//2, hidden//2) ) self.consensus_gate = nn.Sequential( nn.Linear(hidden//2 * 3, hidden), nn.Sigmoid() ) self.classifier = nn.Sequential( nn.Linear(hidden//2 * 3, hidden), nn.GELU(), nn.Dropout(0.3), nn.Linear(hidden, num_emotions) ) def forward(self, audio_feat): encoded = self.audio_encoder(audio_feat) shared = self.shared_view(encoded) specific = self.specific_view(encoded) fusion = self.fusion_view(encoded) concat = torch.cat([shared, specific, fusion], dim=-1) gate = self.consensus_gate(concat) gated = concat * gate return self.classifier(gated)
if __name__ == "__main__": model = TriViewSER() x = torch.randn(8, 256) out = model(x) print(f"输入: {x.shape} → 输出: {out.shape}") print(f"模型参数: {sum(p.numel() for p in model.parameters()):,}")
|