class Hypergraph(nn.Module): def __init__(self): super(Hypergraph, self).__init__() self.adj = nn.Parameter( torch.Tensor(torch.randn([args.temporalRange, args.hyperNum, args.areaNum * args.cateNum])), requires_grad=True) self.Conv = nn.Conv3d(args.latdim, args.latdim, kernel_size=1) self.act1 = nn.LeakyReLU() def forward(self, embeds): adj = self.adj tpadj = adj.transpose(2, 1) embeds_cate = embeds.transpose(2, 3).contiguous().view(embeds.shape[0], args.latdim, args.temporalRange, -1) hyperEmbeds = self.act1(torch.einsum('thn,bdtn->bdth', adj, embeds_cate)) retEmbeds = self.act1(torch.einsum('tnh,bdth->bdtn', tpadj, hyperEmbeds)) retEmbeds = retEmbeds.view(embeds.shape[0], args.latdim, args.temporalRange, args.areaNum, args.cateNum).transpose(2, 3) return retEmbeds
时间: 2023-11-13 16:02:23 浏览: 86
这段代码定义了一个名为Hypergraph的PyTorch模块,其中包含了一个三维卷积层(Conv3d)和两个LeakyReLU激活函数。模块的输入是embeds张量,该张量在第三个和第四个维度上进行了变换,并且被传递给了两个einsum操作,用于计算超图嵌入(hyperEmbeds)和最终的返回张量(retEmbeds)。超图嵌入是通过将嵌入张量(embeds_cate)与邻接矩阵(adj)进行einsum操作得到的。最终的返回张量是通过将超图嵌入与转置后的邻接矩阵(tpadj)进行einsum操作得到的,并且通过view操作进行了形状变换。返回张量的形状为(batch_size, args.latdim, args.temporalRange, args.areaNum, args.cateNum)。
相关问题
class Hypergraph_Infomax(nn.Module): def __init__(self): super(Hypergraph_Infomax, self).__init__() self.Hypergraph = Hypergraph() self.readout = AvgReadout() self.sigm = nn.Sigmoid() self.disc = Discriminator() def forward(self, eb_pos, eb_neg): h_pos = self.Hypergraph(eb_pos) c = self.readout(h_pos) score = self.sigm(c) h_neg = self.Hypergraph(eb_neg) ret = self.disc(score, h_pos, h_neg) return h_pos, ret
这段代码实现了一个名为Hypergraph_Infomax的神经网络模型,用于对超图进行信息最大化学习。该模型由三个子模块组成:
- Hypergraph:超图编码器,用于将输入的边集(eb_pos和eb_neg)编码为超图。
- AvgReadout:超图池化操作,用于将超图中的节点信息汇总成一个固定长度的向量。
- Discriminator:判别器,用于判断输入的超图是否为真实超图(eb_pos)。
在forward函数中,首先用Hypergraph将eb_pos和eb_neg分别编码为超图h_pos和h_neg,然后通过AvgReadout将h_pos池化为一个向量c,并使用Sigmoid函数将c映射到[0, 1]之间得到score。最后,将score、h_pos和h_neg输入到Discriminator中,得到ret作为模型的输出。
class STHSL(nn.Module): def __init__(self): super(STHSL, self).__init__() self.dimConv_in = nn.Conv3d(1, args.latdim, kernel_size=1, padding=0, bias=True) self.dimConv_local = nn.Conv2d(args.latdim, 1, kernel_size=1, padding=0, bias=True) self.dimConv_global = nn.Conv2d(args.latdim, 1, kernel_size=1, padding=0, bias=True) self.spa_cnn_local1 = spa_cnn_local(args.latdim, args.latdim) self.spa_cnn_local2 = spa_cnn_local(args.latdim, args.latdim) self.tem_cnn_local1 = tem_cnn_local(args.latdim, args.latdim) self.tem_cnn_local2 = tem_cnn_local(args.latdim, args.latdim) self.Hypergraph_Infomax = Hypergraph_Infomax() self.tem_cnn_global1 = tem_cnn_global(args.latdim, args.latdim, 9) self.tem_cnn_global2 = tem_cnn_global(args.latdim, args.latdim, 9) self.tem_cnn_global3 = tem_cnn_global(args.latdim, args.latdim, 9) self.tem_cnn_global4 = tem_cnn_global(args.latdim, args.latdim, 6) self.local_tra = Transform_3d() self.global_tra = Transform_3d() def forward(self, embeds_true, neg): embeds_in_global = self.dimConv_in(embeds_true.unsqueeze(1)) DGI_neg = self.dimConv_in(neg.unsqueeze(1)) embeds_in_local = embeds_in_global.permute(0, 3, 1, 2, 4).contiguous().view(-1, args.latdim, args.row, args.col, 4) spa_local1 = self.spa_cnn_local1(embeds_in_local) spa_local2 = self.spa_cnn_local2(spa_local1) spa_local2 = spa_local2.view(-1, args.temporalRange, args.latdim, args.areaNum, args.cateNum).permute(0, 2, 3, 1, 4) tem_local1 = self.tem_cnn_local1(spa_local2) tem_local2 = self.tem_cnn_local2(tem_local1) eb_local = tem_local2.mean(3) eb_tra_local = self.local_tra(tem_local2) out_local = self.dimConv_local(eb_local).squeeze(1) hy_embeds, Infomax_pred = self.Hypergraph_Infomax(embeds_in_global, DGI_neg) tem_global1 = self.tem_cnn_global1(hy_embeds) tem_global2 = self.tem_cnn_global2(tem_global1) tem_global3 = self.tem_cnn_global3(tem_global2) tem_global4 = self.tem_cnn_global4(tem_global3) eb_global = tem_global4.squeeze(3) eb_tra_global = self.global_tra(tem_global4) out_global = self.dimConv_global(eb_global).squeeze(1) return out_local, eb_tra_local, eb_tra_global, Infomax_pred, out_global
这是一个使用 PyTorch 实现的神经网络模型的定义类。在这个模型中,输入数据包含一个真实的嵌入向量和一个负样本向量。模型将这些数据作为输入,并执行一系列操作来生成输出。具体来说,模型包含了一些卷积和全连接层,以及一些变换和聚合操作。这些操作包括将嵌入向量转换为局部和全局表示,通过超图信息最大化来学习嵌入向量的表示,以及对局部和全局表示进行转换和聚合。最终,模型的输出包括局部和全局表示,超图信息最大化的预测结果,以及对局部和全局表示进行卷积后得到的输出。
阅读全文