viclickbait_gnn / src /model_fusion.py
minhy112's picture
Upload viclickbait_gnn project
877049d verified
Raw
History Blame Contribute Delete
1.51 kB
import torch
import torch.nn as nn
from model_gcn import GCNEncoder
class FusionModel(nn.Module):
def __init__(
self,
text_dim: int,
gcn_hidden_dim: int = 128,
text_proj_dim: int = 128,
fusion_hidden_dim: int = 128,
num_labels: int = 2,
dropout: float = 0.3,
) -> None:
super().__init__()
self.text_projection = nn.Sequential(
nn.Linear(text_dim, text_proj_dim),
nn.ReLU(),
nn.Dropout(dropout),
)
self.graph_encoder = GCNEncoder(
in_dim=text_dim,
hidden_dim=gcn_hidden_dim,
out_dim=text_proj_dim,
dropout=dropout,
)
self.classifier = nn.Sequential(
nn.Linear(text_proj_dim * 2, fusion_hidden_dim),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(fusion_hidden_dim, num_labels),
)
def forward(
self,
text_features: torch.Tensor,
edge_index: torch.Tensor,
edge_weight: torch.Tensor | None = None,
) -> dict[str, torch.Tensor]:
h_text = self.text_projection(text_features)
h_graph = self.graph_encoder(text_features, edge_index, edge_weight)
fused = torch.cat([h_text, h_graph], dim=-1)
logits = self.classifier(fused)
return {
"text_embeddings": h_text,
"graph_embeddings": h_graph,
"fused_embeddings": fused,
"logits": logits,
}