当前位置:网站首页>Some understandings of heterogeneous graphs in DGL and the usage of heterogeneous graph convolution heterographconv
Some understandings of heterogeneous graphs in DGL and the usage of heterogeneous graph convolution heterographconv
2022-07-05 10:46:00 【Icy Hunter】
List of articles
Heterogeneous graph
Compared with isomorphic graphs , Heterogeneous graphs can have different types of nodes and edges . These different types of nodes and edges have independent properties ID Space and features . For example, in the figure below ,” user ” and ” game ” Node ID from 0 At the beginning , And the two nodes have different characteristics .
Therefore, heterogeneous graph is the most able to express and apply all kinds of expressions of our real world .
You can use DGL Create a heterogeneous diagram as follows :
There are three entities , Heterogeneous graph of three relationships
import dgl
g = dgl.heterograph({
('user', 'follows', 'user') : ([0, 1], [1, 2]),
('user', 'plays', 'game') : ([0], [1]),
('store', 'sells', 'game') :([0], [2])})
print(g)
Output results :
Graph(num_nodes={
'game': 3, 'store': 1, 'user': 3},
num_edges={
('store', 'sells', 'game'): 1, ('user', 'follows', 'user'): 2, ('user', 'plays', 'game'): 1},
metagraph=[('store', 'game', 'sells'), ('user', 'user', 'follows'), ('user', 'game', 'plays')])
DGL There are many ways to create heterogeneous diagrams in , The above description is created in a way similar to triples
for example (‘store’, ‘sells’, ‘game’), Refer to store Point to game Of sells Relationship ,([0], [2]) Means store_0 To game_2 One way sells Relationship , Therefore, the message can only be transmitted from game_2 to sells to update .
although game_0 Not used in the figure , But he will create by default .
From the above heterogeneous graph output, we can see that there are 7 Nodes ,3 Kind of relationship , In line with expectations .
Here are some operations on heterogeneous graphs
print(g.etypes) # Get the type of edge
print(g.ntypes) # Gets the type of the node
print(g.number_of_nodes('user')) # obtain user Number of nodes
print(g.metagraph().edges()) # Get binary
print(g.nodes('user')) # see user Node number
g.nodes['user'].data['HP'] = th.ones(3, 1) # Set up / obtain "user" Type of node "HP" features
print(g.nodes['user'].data['HP'][0]) # obtain "user"0 Type of node "HP" features
g.edges['sells'].data['money'] = th.zeros(1, 2) # Set up / obtain "sells" Type of edge "money" features
print(g.edges['sells'].data['money'][0]) # obtain "sells" Type edge 0 Of "money" features
hg = dgl.to_homogeneous(g) # Transform heterogeneous graphs into isomorphic graphs
print(hg.ndata[dgl.NTYPE]) # Original node type
print(hg.ndata[dgl.NID]) # The original node of a specific type ID
print(hg.edata[dgl.ETYPE]) # Original edge type
print(hg.edata[dgl.EID]) # The original specific type of edge ID
HeteroGraphConv
The convolution of irregular graphs applies submodules on their association graphs , Read the feature from the source node and write the updated feature to the target node . If multiple relationships have the same target node type , Then their results will be aggregated through the specified method . If the graph has no edges , The corresponding module will not be called .
Because for the convolution of heterogeneous graphs , There are different types of edges , Then each type of edge needs to set its own parameters , Parameters cannot be shared like isomorphic graphs .
initialization
import dgl.nn.pytorch as dglnn
dglnn.HeteroGraphConv(mods, aggregate='sum')
You need to pass in two parameters , first mods It's a dictionary type , The content is { Relationship name : The model layer , }
The second is the aggregate function , Default sum, Because there may be multiple edges gathering information from a total node , Aggregate information updating node information requires aggregate functions to play a role .
forward
forward(g, inputs, mod_args=None, mod_kwargs=None)
forward There are four parameters that can be entered ,mod_args and mod_kwargs The default can be
g Represents the input graph data
inputs It's also a dictionary type , Represents the characteristics of the input node
Example
Use the above heterogeneous graph to convolute the heterogeneous graph
First, create a heterogeneous diagram :
import dgl
g = dgl.heterograph({
('user', 'follows', 'user') : ([0, 1], [1, 2]),
('user', 'plays', 'game') : ([0], [1]),
('store', 'sells', 'game') :([0], [2])})
print(g)
Then initialize the heterogeneous map convolution
# All three relationships are set as input 2 Dimension node feature output 3 Whitman's sign
import dgl.nn.pytorch as dglnn
conv = dglnn.HeteroGraphConv({
'follows' : dglnn.GraphConv(2, 3),
'plays' : dglnn.GraphConv(2, 3),
'sells' : dglnn.GraphConv(2, 3)},
aggregate='sum')
Then pass in the parameters to get the result :
import torch as th
h1 = {
'user' : th.ones((g.number_of_nodes('user'), 2)),
'game' : th.ones((g.number_of_nodes('game'), 2)),
'store' : th.ones((g.number_of_nodes('store'), 2))}
print(h1)
h2 = conv(g, h1)
print(h2)
print(h2.keys())
Output results :
{
'user': tensor([[1., 1.],
[1., 1.],
[1., 1.]]), 'game': tensor([[1., 1.],
[1., 1.],
[1., 1.]]), 'store': tensor([[1., 1.]])}
{
'game': tensor([[ 0.0000, 0.0000, 0.0000],
[ 0.6098, -1.0385, 0.2647],
[ 0.1339, 0.6426, -0.6454]], grad_fn=<SumBackward1>), 'user': tensor([[ 0.0000, 0.0000, 0.0000],
[ 1.0880, 0.2894, -0.8723],
[ 1.0880, 0.2894, -0.8723]], grad_fn=<SumBackward1>)}
dict_keys(['game', 'user'])
Only game and user Because these two types of nodes involve updating operations ,store Because there is no side pointing at him , There is no need to update, so there is no need to output the new features of the node .
Reference resources
https://docs.dgl.ai/guide_cn/graph-heterogeneous.html#guide-cn-graph-heterogeneous
https://docs.dgl.ai/generated/dgl.nn.pytorch.HeteroGraphConv.html#dgl.nn.pytorch.HeteroGraphConv
边栏推荐
- beego跨域问题解决方案-亲试成功
- Go-3-第一个Go程序
- 小红书自研KV存储架构如何实现万亿量级存储与跨云多活
- 双向RNN与堆叠的双向RNN
- 各位大佬,我测试起了3条线程同时往3个mysql表中写入,每条线程分别写入100000条数据,用了f
- C语言活期储蓄账户管理系统
- [vite] 1371 - develop vite plug-ins by hand
- Pull up loading principle
- QT implements JSON parsing
- Atcoder beginer contest 254 "e BFS" f st table maintenance differential array GCD "
猜你喜欢
"Everyday Mathematics" serial 58: February 27
微信核酸检测预约小程序系统毕业设计毕设(6)开题答辩PPT
Go-3-第一个Go程序
Solution of ellipsis when pytorch outputs tensor (output tensor completely)
Web3基金会「Grant计划」赋能开发者,盘点四大成功项目
SAP ui5 objectpagelayout control usage sharing
【观察】跨境电商“独立站”模式崛起,如何抓住下一个红利爆发时代?
风控模型启用前的最后一道工序,80%的童鞋在这都踩坑
Who is the "conscience" domestic brand?
C language QQ chat room small project [complete source code]
随机推荐
Talk about the understanding of fault tolerance mechanism and state consistency in Flink framework
风控模型启用前的最后一道工序,80%的童鞋在这都踩坑
LSTM应用于MNIST数据集分类(与CNN做对比)
微信小程序触底加载与下拉刷新的实现
Go语言-1-开发环境配置
Comparative learning in the period of "arms race"
Learning II of workmanager
App各大应用商店/应用市场网址汇总
Go project practice - Gorm format time field
2022年危险化学品经营单位主要负责人特种作业证考试题库及答案
Based on shengteng AI Yisa technology, it launched a full target structured solution for video images, reaching the industry-leading level
Web3 Foundation grant program empowers developers to review four successful projects
C语言实现QQ聊天室小项目 [完整源码]
Web3基金会「Grant计划」赋能开发者,盘点四大成功项目
[paper reading] ckan: collaborative knowledge aware autonomous network for adviser systems
在C# 中实现上升沿,并模仿PLC环境验证 If 语句使用上升沿和不使用上升沿的不同
中职组网络安全C模块全漏洞脚本讲解包含4个漏洞的脚本
SQL Server monitoring statistics blocking script information
uniapp
[可能没有默认的字体]Warning: imagettfbbox() [function.imagettfbbox]: Invalid font filename……