当前位置:网站首页>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
边栏推荐
- Web3 Foundation grant program empowers developers to review four successful projects
- NAS and San
- beego跨域问题解决方案-亲试成功
- Use bat command to launch common browsers with one click
- LDAP概述
- Error: module not found: error: can't resolve 'xxx' in 'XXXX‘
- SqlServer定时备份数据库和定时杀死数据库死锁解决
- Flink CDC cannot monitor MySQL logs. Have you ever encountered this problem?
- 【DNS】“Can‘t resolve host“ as non-root user, but works fine as root
- 关于vray 5.2的使用(自研笔记)
猜你喜欢
2022年流动式起重机司机考试题库及模拟考试
手机厂商“互卷”之年:“机海战术”失灵,“慢节奏”打法崛起
Talk about the understanding of fault tolerance mechanism and state consistency in Flink framework
How does redis implement multiple zones?
Idea create a new sprintboot project
重磅:国产IDE发布,由阿里研发,完全开源!
双向RNN与堆叠的双向RNN
32:第三章:开发通行证服务:15:浏览器存储介质,简介;(cookie,Session Storage,Local Storage)
【黑马早报】罗永浩回应调侃东方甄选;董卿丈夫密春雷被执行超7亿;吉利正式收购魅族;华为发布问界M7;豆瓣为周杰伦专辑提前开分道歉...
【DNS】“Can‘t resolve host“ as non-root user, but works fine as root
随机推荐
websocket
【SWT组件】内容滚动组件 ScrolledComposite
AD20 制作 Logo
Pseudo class elements -- before and after
Common functions of go-2-vim IDE
谈谈对Flink框架中容错机制及状态的一致性的理解
Buried point 111
GO项目实战 — Gorm格式化时间字段
关于vray 5.2的使用(自研笔记)
uniapp
Node の MongoDB Driver
5g NR system architecture
Go-3-the first go program
"Everyday Mathematics" serial 58: February 27
脚手架开发基础
C language QQ chat room small project [complete source code]
[observation] with the rise of the "independent station" model of cross-border e-commerce, how to seize the next dividend explosion era?
The first product of Sepp power battery was officially launched
TSQL–标示列、GUID 、序列
How does redis implement multiple zones?