Does there API to get the adjacency matrix of dgl block, especially of the weighted graph.
I constructed a big weighted big graph, and got the subgraph of block by node dataloader, but I cannot get the adjacency matrix of this block.
Have you ever come across this problem ?
See if the example below helps:
import dgl
import torch
from scipy.sparse import rand, coo_matrix
adj = rand(100, 100, density=0.05)
g = dgl.from_scipy(adj)
g.edata['w'] = torch.randn(500, 1)
sampler = dgl.dataloading.MultiLayerFullNeighborSampler(2)
dataloader = dgl.dataloading.NodeDataLoader(g, list(range(100)), sampler, batch_size=16)
input_nodes, output_nodes, blocks = next(iter(dataloader))
demo_block = blocks[0]
# If you don't care about edge weight
adj = demo_block.adj()
# If you do want to keep the edge weight
graph_data = (demo_block.edata['w'].squeeze(-1), demo_block.edges())
shape = (g.num_nodes(), g.num_nodes())
adj = coo_matrix(graph_data, shape)
Thanks for your nice example. It is really helpfule!
I still have some questions
- in your example code
adj = rand(100, 100, density=0.05)
g = dgl.from_scipy(adj)
g.edata['w'] = torch.randn(500, 1)
what if the adj tensor not only for the graph structure, but also provides the edge weight ? so how to use the weight in adj for the graph edge weight?
- If I use cuda to train the network, how to get the adjacency matrix of this block in GPU to avoid the transfer from cpu to gpu?
-
how to use the weight in adj for the graph edge weight?
dgl.from_scipy
allows retrieving the edge weights fromadj
. See the doc. -
If I use cuda to train the network, how to get the adjacency matrix of this block in GPU to avoid the transfer from cpu to gpu?
If you want a sparse adjacency matrix on GPU and assume your block is on GPU, then below is all you need
src, dst = demo_block.edges()
If you need a dense one
src, dst = demo_block.edges() block_adj = torch.zeros(demo_block.num_src_nodes(), demo_block.num_dst_nodes(), device='cuda:0') block_adj[src, dst] = demo_block.edata['w'].squeeze(-1)
but then you are copying a tensor from CPU to GPU as well…