日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图神经网络(1):DGL基础

發布時間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图神经网络(1):DGL基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

筆記是直接從Jupyter 保存下來的,格式會比較亂,主要是給自己看的。

1. 構建圖

導入依賴庫

import dgl import torch import numpy as np

1.1 構建圖

src_idx = np.random.randint(0,3,5) # sorce nodes id dst_idx = np.random.randint(0,3,5) # destination nodes idG = dgl.graph((src_idx, dst_idx)) # construct a graph# print number of nodes print("number of nodes: ", G.num_nodes()) # print number of edges print("number of edges: ", G.num_edges())

增加圖的節點特征:

# add node features node_feat = torch.rand(G.num_nodes(),4) G.ndata['x'] = node_feat

查看圖的邊數據和節點數據:

G.edata, G.ndata

結果如下:

({},{'x': tensor([[0.6212, 0.5459, 0.1122, 0.6694],[0.2265, 0.1132, 0.1532, 0.3810],[0.4304, 0.3933, 0.6462, 0.9284]])})

2. apply_edges 方法

該方法主要是用于 對每條邊進行計算。

# 定義一個消息傳遞函數,函數指定一個 edges 對象,該對象具有:src、dst、data 三個屬性。 # src: 這條邊的sorce節點,src['x'] 表示sorce節點的x特征 # dst:這條邊的destination節點 # data:這條邊的屬性,data['e']表示變得e特征 def fn_es(edges):return {'e': edges.src['x'] + edges.dst['x']} G.apply_edges(fn_es)G

輸出結果:

Graph(num_nodes=3, num_edges=5,ndata_schemes={'x': Scheme(shape=(4,), dtype=torch.float32)}edata_schemes={'e': Scheme(shape=(4,), dtype=torch.float32)})

3. apply_nodes 方法

該方法是用于 對每個節點進行計算。

# 定義一個聚合函數,函數指定一個 nodes 對象,該對象具有:mailbox、data 屬性。 # mailbox:存儲了通過消息傳遞到節點的信息,這里暫時用不到 # data:保持了該節點的特征 def fn_ns(nodes):print(nodes.mailbox) # 查看一下mailboxreturn {'h': nodes.data['x'] + 1}G.apply_nodes(fn_ns)G.ndata

輸出結果如下:

None{'x': tensor([[0.6212, 0.5459, 0.1122, 0.6694],[0.2265, 0.1132, 0.1532, 0.3810],[0.4304, 0.3933, 0.6462, 0.9284]]), 'h': tensor([[1.6212, 1.5459, 1.1122, 1.6694],[1.2265, 1.1132, 1.1532, 1.3810],[1.4304, 1.3933, 1.6462, 1.9284]])}

官方文檔的例子(apply_nodes可以用lambda定義函數;可以用v參數,只對特定節點進行計算)。

g = dgl.graph(([0, 1, 2, 3], [1, 2, 3, 4])) g.ndata['h'] = torch.ones(5, 2) g.apply_nodes(lambda nodes: {'x' : nodes.data['h'] * 2},v=(1,2) # 只對id為1、2的兩個節點進行計算) g.ndata['x']

結果如下:

tensor([[0., 0.],[2., 2.],[2., 2.],[0., 0.],[0., 0.]])

4. 消息傳遞

消息函數 接受一個參數 edges,這是一個 EdgeBatch 的實例, 在消息傳遞時,它被DGL在內部生成以表示一批邊。 edges 有 src、 dst 和 data 共3個成員屬性, 分別用于訪問源節點、目標節點和邊的特征。

4.1 DGL內置的消息傳遞函數

內置消息函數可以是一元函數或二元函數。對于一元函數,DGL支持 copy 函數。對于二元函數, DGL現在支持 add、 sub、 mul、 div、 dot 函數。消息的內置函數的命名約定是 u 表示 源 節點, v 表示 目標 節點,e 表示 邊。

# hu 指的是source節點的 hu 屬性特征。 # hv 指的是destination節點的 hv 屬性特征。 # he 指的是將 hu + hv 結果保存于 邊 上,并命名為 he 特征。dgl.function.u_add_v('hu', 'hv', 'he')

4.2 自定義消息傳遞函數

# hu 指的是source節點的 hu 屬性特征。 # hv 指的是destination節點的 hv 屬性特征。 # he 指的是將 hu + hv 結果保存于 邊 上,并命名為 he 特征。def message_func(edges):return {'he': edges.src['hu'] + edges.dst['hv']}

5. 消息聚合

聚合函數 接受一個參數 nodes,這是一個 NodeBatch 的實例, 在消息傳遞時,它被DGL在內部生成以表示一批節點。 nodes 的成員屬性 mailbox 可以用來訪問節點收到的消息。 一些最常見的聚合操作包括 sum、max、min 等。

5.1 DGL內置的聚合函數

DGL支持內置的聚合函數 sum、 max、 min 和 mean 操作。 聚合函數通常有兩個參數,它們的類型都是字符串。一個用于指定 mailbox 中的字段名,一個用于指示目標節點特征的字段名, 例如:

# m 指的是保存在 nodes 的 mailbox 屬性的字段名 # h 指的是輸出的字段名dgl.function.sum('m', 'h')

5.2 自定義消息傳遞函數

# m 指的是保存在 nodes 的 mailbox 屬性的字段名 # h 指的是輸出的字段名import torch def reduce_func(nodes):return {'h': torch.sum(nodes.mailbox['m'], dim=1)}

6. 更新函數

更新函數 接受一個如上所述的參數 nodes。此函數對 聚合函數 的聚合結果進行操作, 通常在消息傳遞的最后一步將其與節點的特征相結合,并將輸出作為節點的新特征。

7. update_all

高級API,在該API中,實現了消息傳遞、消息聚合、節點更新

update_all() 的參數是一個消息函數、一個聚合函數和一個更新函數。 更新函數是一個可選擇的參數,用戶也可以不使用它,而是在 update_all 執行完后直接對節點特征進行操作。 由于更新函數通常可以用純張量操作實現,所以DGL不推薦在 update_all 中指定更新函數。

# 此調用通過將源節點特征 ft 與邊特征 a 相乘生成消息 m, 然后對所有消息求和來更新節點特征 ft,再將 ft 乘以2得到最終結果 final_ft。 # 調用后,中間消息 m 將被清除。import dgl.function as fn def update_all_example(graph):# 在graph.ndata['ft']中存儲結果graph.update_all(fn.u_mul_e('ft', 'a', 'm'),fn.sum('m', 'ft'))# 在update_all外調用更新函數final_ft = graph.ndata['ft'] * 2return final_ft

使用案例如下:

# 在前文定義的G圖上,增加節點特征,以便于應用update_all_example函數。 G.ndata['ft'] = G.ndata['x'] G.edata['a'] = G.edata['e']update_all_example(G)

輸出結果如下:

tensor([[2.4490, 1.9310, 1.0305, 4.7589],[1.1309, 0.7969, 2.0665, 4.8625],[1.3067, 1.0255, 0.1701, 2.1390]])

總結

以上是生活随笔為你收集整理的图神经网络(1):DGL基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。