[英]PyTorch: How to implement attention for graph attention layer
我已经实现了https://arxiv.org/pdf/1710.10903.pdf的关注点(公式1),但是显然内存效率不高,并且只能在我的GPU上运行单个模型(占用7-10GB)。
目前,我有
class MyModule(nn.Module):
def __init__(self, in_features, out_features):
super(MyModule, self).__init__()
self.in_features = in_features
self.out_features = out_features
self.W = nn.Parameter(nn.init.xavier_uniform(torch.Tensor(in_features, out_features).type(torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor), gain=np.sqrt(2.0)), requires_grad=True)
self.a = nn.Parameter(nn.init.xavier_uniform(torch.Tensor(2*out_features, 1).type(torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor), gain=np.sqrt(2.0)), requires_grad=True)
def forward(self, input):
h = torch.mm(input, self.W)
N = h.size()[0]
a_input = torch.cat([h.repeat(1, N).view(N * N, -1), h.repeat(N, 1)], dim=1).view(N, -1, 2 * self.out_features)
e = F.elu(torch.matmul(a_input, self.a).squeeze(2))
return e
我计算所有e_ij项的见解在哪里
In [8]: import torch
在[9]中:将numpy导入为np
在[10]中:h = Torch.LongTensor(np.array([[1,1],[2,2],[3,3]]))
在[11]中:N = 3
在[12]中:h.repeat(1,N).view(N * N,-1)Out [12]:
1 1
1 1
1 1
2 2
2 2
2 2
3 3
3 3
3 3
[9x2大小的Torch.LongTensor]
在[13]中:h.repeat(N,1)Out [13]:
1 1
2 2
3 3
1 1
2 2
3 3
1 1
2 2
3 3
[9x2大小的Torch.LongTensor]
最后连接hs和feed矩阵a。
有没有办法以更友好的内存方式做到这一点?
也许您可以使用稀疏张量来存储adj_mat
def sparse_mx_to_torch_sparse_tensor(sparse_mx):
"""Convert a scipy sparse matrix to a torch sparse tensor."""
sparse_mx = sparse_mx.tocoo().astype(np.float32)
indices = torch.from_numpy(np.vstack((sparse_mx.row,
sparse_mx.col))).long()
values = torch.from_numpy(sparse_mx.data)
shape = torch.Size(sparse_mx.shape)
return torch.sparse.FloatTensor(indices, values, shape)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.