一般人我不告訴他這些圖數(shù)據(jù)處理干貨!
來(lái)源:投稿?作者:張宇
編輯:學(xué)姐
看完給學(xué)姐點(diǎn)個(gè)贊!一個(gè)贊就能給學(xué)姐的午飯加個(gè)雞腿??!
單張圖被PyG表示為 torch_geometric.data.Data 類型,有如下屬性:
data.x : 節(jié) 點(diǎn) 的 特 征 矩 陣 , 形 狀 為 [num_nodes, num_node_features]?
data.edge_index : COO格式的圖的邊 shape [2, num_edges] and type torch.long
data.edge_attr :邊的特征矩陣 shape [num_edges, num_edge_features]
data.y : 訓(xùn)練數(shù)據(jù)的標(biāo)簽,節(jié)點(diǎn)級(jí)的目標(biāo) shape [num_nodes, *] or 圖級(jí)的目標(biāo) shape [1, *]
data.pos : 節(jié)點(diǎn)的位置矩陣 shape [num_nodes, num_dimensions]
對(duì)于data提供了如下方法進(jìn)行訪問(wèn):
對(duì)于Data類的更多方法可以看這里:
https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data
常用的基準(zhǔn)數(shù)據(jù)集
PyG提供了大量的基準(zhǔn)數(shù)據(jù)集,比如Planetoid datasets (Cora, Citeseer, Pubmed),更多圖的數(shù)據(jù)集可
以看這個(gè)鏈接???
https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data
https://github.com/nd7141/graph_datasets
使用PyG處理數(shù)據(jù)非常簡(jiǎn)單,并且下載下來(lái)就是源文件格式(raw file,可能在一些程序中看見(jiàn)這個(gè)單詞),并且會(huì)自動(dòng)處理為Data格式,例如:
我們可以看到數(shù)據(jù)集中的第一個(gè)圖包含37個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有3個(gè)特性。有168/2 = 84條無(wú)向邊,圖被分配到一個(gè)類中。此外,數(shù)據(jù)對(duì)象只持有一個(gè)圖級(jí)目標(biāo)。
我們甚至可以使用切片、long或bool張量來(lái)分割數(shù)據(jù)集。例如,要?jiǎng)?chuàng)建90/10的訓(xùn)練/測(cè)試分割,輸入:
讓我們?cè)僭囈粋€(gè)!讓我們下載Cora,半監(jiān)督圖節(jié)點(diǎn)分類的標(biāo)準(zhǔn)基準(zhǔn)數(shù)據(jù)集,這個(gè)數(shù)據(jù)集是圖神經(jīng)網(wǎng)絡(luò)論文中經(jīng)??匆?jiàn)的數(shù)據(jù)集,是一個(gè)論文的引用圖,節(jié)點(diǎn)的特征為論文的詞向量:
Data對(duì)象保存每個(gè)節(jié)點(diǎn)的標(biāo)簽,以及額外的節(jié)點(diǎn)級(jí)屬性:
train_mask、val_mask和test_mask,其中Train_mask表示要訓(xùn)練哪個(gè)節(jié)點(diǎn)(140個(gè)節(jié)點(diǎn)),
Val_mask表示使用哪些節(jié)點(diǎn)進(jìn)行驗(yàn)證,例如,執(zhí)行早期停止(500個(gè)節(jié)點(diǎn)),
Test_mask表示要測(cè)試哪個(gè)節(jié)點(diǎn)(1000個(gè)節(jié)點(diǎn))。
比如data.train_mask 是一個(gè)一維的bool類型的tensor,里面的數(shù)據(jù)是True就代表是訓(xùn)練數(shù)據(jù)。
Mini-Batches
神經(jīng)網(wǎng)絡(luò)通常以批處理方式進(jìn)行訓(xùn)練。PyG通過(guò)創(chuàng)建稀疏塊對(duì)角鄰接矩陣(由edge_index定義)和連接節(jié)點(diǎn)維上的特征和目標(biāo)矩陣來(lái)實(shí)現(xiàn)小批量的并行化。這種組合允許在一個(gè)批處理中不同數(shù)量的節(jié)點(diǎn)和邊:
PyG包含它自己的torch_geometric.loader.DataLoader ,它已經(jīng)處理了這個(gè)連接過(guò)程。其實(shí)使用的過(guò)程和torch里面的DataLoader是一樣的:
torch_geometric.data.Batch從torch_geometric.data.Data 繼承,并包含稱為batch 的附加屬性。
batch是一個(gè)列向量,保存了batch中每個(gè)節(jié)點(diǎn)和對(duì)應(yīng)圖的映射關(guān)系。
可以使用batch來(lái)計(jì)算batch中每個(gè)圖中各個(gè)節(jié)點(diǎn)的平均特征。
Data Transforms
下面以一個(gè)例子來(lái)解釋,ShapeNet數(shù)據(jù)集是包含17000個(gè)3D點(diǎn)云的數(shù)據(jù)集。
我們可以通過(guò)transforms將點(diǎn)云生成最近鄰圖,將點(diǎn)云數(shù)據(jù)集轉(zhuǎn)換為圖數(shù)據(jù)集:
pre_transform參數(shù)可以在數(shù)據(jù)存入磁盤之前進(jìn)行轉(zhuǎn)換,在下次使用時(shí),數(shù)據(jù)集將自動(dòng)包含邊。
此外,我們可以使用transform參數(shù)來(lái)隨機(jī)增強(qiáng)一個(gè)Data對(duì)象,例如,將每個(gè)節(jié)點(diǎn)的位置轉(zhuǎn)換為一個(gè)小數(shù)字:
圖學(xué)習(xí)方法
在學(xué)習(xí)了PyG中的數(shù)據(jù)處理、datasets, loader 以及 transforms之后,是時(shí)候?qū)崿F(xiàn)我們的第一個(gè)圖形神經(jīng)網(wǎng)絡(luò)了!
我們將使用一個(gè)簡(jiǎn)單的GCN層,并在Cora引文數(shù)據(jù)集上復(fù)制實(shí)驗(yàn)。關(guān)于GCN的解釋,請(qǐng)看 http://tkipf.g ithub.io/raph-convolutional-networks/ 。
首先,加載數(shù)據(jù)集:
然后定義一個(gè)兩層的GCN,和torch里面的定義方式一樣,只是在傳入GCN網(wǎng)絡(luò)時(shí)傳的是兩個(gè)參數(shù),第一個(gè)是數(shù)據(jù)特征,第二個(gè)是邊的index。數(shù)據(jù)特征x就是每個(gè)節(jié)點(diǎn)的特征向量,edge_index就是(2,節(jié)點(diǎn)數(shù))的Tensor,表示哪兩個(gè)節(jié)點(diǎn)之間有邊。卷積層后面的ReLU激活函數(shù)以及dropout層也是常用的,也不做介紹。
然后對(duì)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,訓(xùn)練的方式也是和torch中形式一樣的:
最后網(wǎng)絡(luò)新的訓(xùn)練精度進(jìn)行測(cè)試
總結(jié)
最后做個(gè)總結(jié)的話就是,使用PyG的圖神經(jīng)網(wǎng)絡(luò),其實(shí)和torch總體使用過(guò)程是差不多的,最重要的就是DataLoader的寫(xiě)法。如果使用 torch_geometric.datasets 中沒(méi)有的數(shù)據(jù)集的話,將數(shù)據(jù)轉(zhuǎn)化為圖的形式可能需要一些時(shí)間。
代碼排版有點(diǎn)問(wèn)題
關(guān)注公眾號(hào)【學(xué)姐帶你玩AI】回復(fù):“1”
領(lǐng)取代碼原文