HMCAN: Hybrid Multimodal Contextual Attention Network Class Definition
class HMCAN(nn.Module):
def __init__(self, configs, alpha):
super(HMCAN, self).__init__()
self.word_length = configs.max_word_length
self.alpha = alpha
self.contextual_transform = TextImage_Transformer(
configs.contextual_transform, configs.contextual_transform.output_dim)
self.contextual_transform2 = TextImage_Transformer(
configs.contextual_transform, configs.contextual_transform.output_dim)
self.conv = nn.Conv2d(2048, 768, 1) # 创建二维变量
self.bn = nn.BatchNorm2d(768) # 对四维数组进行标准化,768为图像通道数
self.classifier = nn.Sequential(nn.Linear(768*6, 256),
nn.ReLU(True),
nn.BatchNorm1d(256),
nn.Linear(256, 2)
) # 一个序列容器,将搭建神经网络的模块排序,第一个模块的输出将作为第二个模块的输入
def forward(self, e, f): # 前向传播
cap_lengths = len(e)
e_f_mask = torch.ones(cap_lengths, self.word_length).cuda() # 定义全为1的张量
f_e_mask = torch.ones(cap_lengths, 16).cuda()
e = torch.squeeze(e, dim=1) # [batch_size, 40, 768]对e进行压缩,去掉维度为1的维度
e1 = e[:, :self.word_length, :]
e2 = e[:, self.word_length: self.word_length*2, :]
e3 = e[:, self.word_length*2:, :]
# e = self.fc(e) # [batch_size, 40, 64]
f = F.relu(self.bn(self.conv(f))) # [batch_size, 768, 4, 4]激活函数?这个f是干什么的
f = f.view(f.shape[0], f.shape[1], -1) # [batch_size, 768, 16]
f = f.permute([0, 2, 1]) # [batch_size, 16, 768] # 维度换位
c1_e1_f = self.contextual_transform(e1, e_f_mask, f)
c1_f_e1 = self.contextual_transform2(f, f_e_mask, e1)
a = self.alpha
c1 = a * c1_e1_f + (1 - a) * c1_f_e1
c2_e2_f = self.contextual_transform(e2, e_f_mask, f)
c2_f_e2 = self.contextual_transform2(f, f_e_mask, e2)
c2 = a * c2_e2_f + (1 - a) * c2_f_e2
c3_e3_f = self.contextual_transform(e3, e_f_mask, f)
c3_f_e3 = self.contextual_transform2(f, f_e_mask, e3)
c3 = a * c3_e3_f + (1 - a) * c3_f_e3
x = torch.cat((c1, c2, c3), dim=1)
x = self.classifier(x)
return x
解释以上代码内容:
以上代码是一个HMCAN(Hybrid Multimodal Contextual Attention Network)类的定义。该类继承自nn.Module,用于定义神经网络的结构。
在初始化方法中,首先传入了configs和alpha两个参数。configs包含了一些配置信息,例如最大单词长度和上下文转换器的输出维度。alpha是一个权重参数。
接下来定义了两个TextImage_Transformer对象,分别命名为contextual_transform和contextual_transform2。这两个对象用于对文本和图像进行上下文转换。
然后创建了一个二维卷积层和一个二维标准化层。二维卷积层将输入的图像特征从2048维降到768维,二维标准化层对四维张量进行标准化。
最后定义了一个分类器,包含两个线性层和两个批标准化层。这个分类器将上下文转换后的特征进行分类。
在前向传播方法中,首先对输入的句子长度进行处理,生成两个掩码。然后对输入的图像特征进行卷积和标准化操作。
接下来分别对三段句子和图像特征进行上下文转换,并计算加权后的上下文向量。
最后将三个上下文向量拼接起来,通过分类器得到最终的输出。
整体来说,这个HMCAN模型是一个将文本和图像特征进行融合的多模态分类模型,通过上下文转换和注意力机制来提取特征并进行分类。
原文地址: https://www.cveoy.top/t/topic/fQkm 著作权归作者所有。请勿转载和采集!