PyG搭建GCN需要準(zhǔn)備的數(shù)據(jù)格式
前言
有關(guān)GCN的原理可以參考:GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理
一開(kāi)始是打算手寫(xiě)一下GCN,畢竟原理也不是很難,但想了想還是直接調(diào)包吧。在使用各種深度學(xué)習(xí)框架時(shí)我們首先需要知道的是框架內(nèi)的數(shù)據(jù)集結(jié)構(gòu),因此這篇文章主要講講PyG中的數(shù)據(jù)結(jié)構(gòu)。
1. PyG數(shù)據(jù)集
原始論文中使用的數(shù)據(jù)集:

本篇文章使用Citeseer網(wǎng)絡(luò)。Citeseer網(wǎng)絡(luò)是一個(gè)引文網(wǎng)絡(luò),節(jié)點(diǎn)為論文,一共3327篇論文。論文一共分為六類(lèi):Agents、AI(人工智能)、DB(數(shù)據(jù)庫(kù))、IR(信息檢索)、ML(機(jī)器語(yǔ)言)和HCI。如果兩篇論文間存在引用關(guān)系,那么它們之間就存在鏈接關(guān)系。
使用PyG加載數(shù)據(jù)集:
data = Planetoid(root='/data/CiteSeer', name='CiteSeer') print(len(data))
輸出:
1
CiteSeer中只有一個(gè)網(wǎng)絡(luò),然后我們輸出一下這個(gè)網(wǎng)絡(luò):
data = data[0] print(data) print(data.is_directed())
輸出:
Data(x=[3327, 3703], edge_index=[2, 9104], y=[3327], train_mask=[3327], val_mask=[3327], test_mask=[3327]) False
x=[3327, 3703]。表示一共有3327個(gè)節(jié)點(diǎn),然后節(jié)點(diǎn)的特征維度為3703,這里實(shí)際上是去除停用詞和在文檔中出現(xiàn)頻率小于10次的詞,整理得到3703個(gè)唯一詞。
edge_index=[2, 9104],表示一共9104條edge。數(shù)據(jù)一共兩行,每一行都表示節(jié)點(diǎn)編號(hào)。
輸出一下data.y:
tensor([3, 1, 5, ..., 3, 1, 5])tensor([3, 1, 5, ..., 3, 1, 5])
data.y表示節(jié)點(diǎn)的標(biāo)簽編號(hào),比如3表示該篇論文屬于第3類(lèi)。
輸出data.train_mask:
tensor([ True, True, True, ..., False, False, False])
data.train_mask的長(zhǎng)度和y的長(zhǎng)度一致,如果某個(gè)位置為T(mén)rue就表示該樣本為訓(xùn)練樣本。val_mask和test_mask類(lèi)似,分別表示驗(yàn)證集和訓(xùn)練集。
比如我們輸出:
print(data.y[data.test_mask])
結(jié)果為:
tensor([4, 5, 4, 4, 4, 1, 4, 2, 3, 3, 3, 3, 2, 3, 3, 4, 2, 0, 1, 2, 0, 3, 3, 4,
2, 4, 0, 4, 3, 3, 3, 5, 4, 5, 4, 5, 1, 1, 3, 3, 3, 3, 3, 1, 2, 3, 3, 3,
1, 2, 2, 3, 3, 1, 5, 5, 5, 3, 2, 3, 3, 3, 3, 3, 3, 3, 5, 1, 3, 1, 1, 4,
1, 3, 3, 1, 3, 3, 2, 4, 3, 3, 3, 1, 2, 2, 2, 3, 5, 2, 1, 3, 2, 2, 2, 4,
3, 3, 4, 0, 3, 1, 2, 2, 2, 2, 3, 2, 2, 2, 1, 1, 5, 2, 2, 1, 2, 4, 3, 1,
1, 3, 2, 3, 4, 3, 3, 4, 4, 3, 2, 2, 1, 3, 4, 4, 4, 4, 4, 4, 5, 0, 3, 1,
1, 3, 1, 3, 1, 3, 4, 4, 3, 2, 3, 5, 3, 3, 3, 4, 2, 2, 2, 5, 3, 1, 0, 3,
2, 5, 2, 3, 2, 4, 2, 2, 2, 0, 5, 1, 3, 4, 4, 4, 1, 1, 5, 1, 2, 0, 1, 0,
2, 2, 3, 3, 3, 3, 5, 4, 4, 3, 1, 1, 2, 1, 2, 2, 2, 2, 5, 0, 1, 2, 2, 4,
0, 4, 1, 1, 2, 3, 1, 1, 2, 3, 3, 5, 2, 5, 5, 3, 1, 0, 5, 5, 5, 5, 3, 3,
3, 0, 4, 5, 3, 4, 5, 4, 5, 2, 0, 5, 5, 5, 1, 1, 3, 1, 2, 2, 2, 3, 2, 4,
5, 3, 3, 1, 3, 1, 2, 2, 1, 3, 1, 3, 1, 2, 1, 2, 1, 2, 2, 2, 2, 5, 4, 4,
5, 0, 3, 4, 5, 4, 4, 4, 4, 4, 0, 0, 1, 4, 1, 1, 5, 0, 2, 2, 3, 3, 2, 2,
0, 0, 3, 2, 4, 1, 1, 0, 0, 1, 2, 2, 2, 2, 2, 0, 4, 0, 1, 4, 1, 1, 2, 2,
3, 3, 1, 3, 2, 4, 4, 0, 0, 3, 4, 4, 2, 2, 2, 5, 5, 2, 5, 5, 5, 5, 4, 0,
2, 2, 0, 2, 4, 5, 4, 0, 3, 3, 5, 3, 3, 4, 2, 1, 5, 5, 0, 1, 3, 3, 3, 5,
3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 0, 2, 2, 2, 2, 4, 3, 3,
5, 5, 4, 5, 2, 4, 4, 4, 5, 5, 4, 2, 2, 3, 3, 4, 4, 3, 1, 3, 2, 0, 5, 5,
5, 3, 4, 1, 4, 0, 5, 5, 0, 3, 0, 2, 3, 5, 3, 4, 2, 2, 3, 5, 1, 5, 3, 4,
5, 5, 2, 2, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 0, 0, 5, 1, 2, 3, 3, 1, 3,
2, 4, 3, 1, 3, 3, 3, 3, 3, 1, 0, 5, 4, 4, 1, 1, 3, 4, 4, 4, 4, 5, 4, 2,
2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 1, 4, 0, 1, 4, 4, 4, 1, 2, 1, 5, 5, 2, 4,
4, 2, 2, 3, 1, 1, 0, 0, 2, 1, 0, 1, 5, 1, 2, 2, 3, 2, 0, 0, 3, 3, 3, 2,
2, 2, 1, 1, 1, 3, 3, 3, 5, 3, 5, 2, 3, 2, 3, 1, 5, 2, 2, 3, 3, 3, 1, 1,
1, 3, 3, 3, 3, 4, 4, 1, 4, 4, 1, 3, 3, 1, 0, 3, 5, 4, 4, 2, 4, 1, 0, 3,
1, 4, 1, 4, 4, 0, 5, 3, 2, 2, 2, 5, 5, 0, 4, 4, 1, 2, 2, 3, 3, 3, 5, 5,
5, 1, 5, 1, 4, 3, 1, 5, 5, 4, 4, 2, 3, 1, 0, 0, 5, 3, 1, 2, 1, 4, 1, 4,
1, 2, 2, 5, 1, 2, 1, 4, 5, 5, 1, 4, 5, 5, 1, 1, 5, 5, 3, 1, 0, 0, 1, 0,
0, 2, 0, 4, 3, 4, 3, 3, 1, 2, 3, 5, 3, 5, 5, 5, 5, 5, 3, 4, 4, 5, 4, 2,
2, 5, 1, 4, 4, 4, 3, 1, 5, 3, 1, 3, 4, 2, 2, 4, 2, 1, 5, 2, 2, 5, 5, 3,
3, 4, 1, 1, 2, 5, 3, 4, 4, 4, 5, 5, 1, 5, 5, 1, 5, 5, 1, 1, 1, 4, 2, 3,
5, 4, 1, 1, 4, 5, 2, 3, 1, 2, 1, 4, 1, 4, 1, 1, 1, 0, 0, 1, 5, 0, 2, 1,
1, 5, 1, 1, 3, 2, 3, 3, 1, 1, 2, 3, 2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3,
3, 5, 2, 2, 3, 4, 4, 4, 4, 0, 3, 0, 3, 4, 1, 1, 3, 3, 0, 4, 5, 0, 0, 0,
2, 1, 3, 4, 5, 2, 1, 1, 3, 3, 4, 4, 4, 2, 2, 1, 5, 4, 0, 5, 5, 4, 3, 4,
5, 0, 3, 0, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 5, 2, 0, 0, 1, 0, 0, 0, 3, 1,
5, 3, 2, 3, 5, 3, 3, 3, 1, 5, 5, 5, 5, 1, 2, 1, 4, 5, 4, 3, 3, 5, 5, 1,
4, 2, 5, 4, 1, 4, 4, 4, 4, 5, 5, 4, 3, 4, 3, 5, 3, 3, 1, 1, 0, 4, 4, 3,
1, 1, 1, 1, 3, 3, 3, 4, 3, 1, 4, 1, 1, 3, 5, 5, 5, 4, 4, 1, 3, 1, 4, 3,
3, 3, 1, 2, 2, 5, 3, 2, 5, 1, 3, 3, 5, 5, 4, 0, 3, 5, 5, 5, 1, 2, 2, 4,
1, 4, 5, 5, 5, 4, 5, 2, 1, 5, 4, 4, 0, 3, 5, 4, 1, 3, 3, 5, 4, 2, 1, 0,
1, 3, 2, 4, 3, 2, 4, 4, 1, 1, 0, 3, 3, 3, 1, 5])
可以發(fā)現(xiàn),我們輸出的是測(cè)試集的內(nèi)容。
那么很顯然,如果我們最終得到了預(yù)測(cè)值,我們就可以通過(guò)以下代碼來(lái)計(jì)算分類(lèi)的正確數(shù):
correct = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
模型輸出的pred實(shí)際上包含了所有節(jié)點(diǎn)的預(yù)測(cè)值,而我們只需要取測(cè)試集中的內(nèi)容,即:
pred[data.test_mask]
然后再與data.y[data.test_mask]進(jìn)行比較,最后計(jì)算二者對(duì)應(yīng)位置相等的個(gè)數(shù)即可。
2. 構(gòu)造數(shù)據(jù)集
如果我們需要的數(shù)據(jù)集在PyG中沒(méi)有,我們就需要自己手動(dòng)構(gòu)造數(shù)據(jù)集。
例如對(duì)于一個(gè)無(wú)向圖,我們知道了其節(jié)點(diǎn)特征矩陣x:
x = torch.tensor([[-1, 1], [0, 1], [1, 3]], dtype=torch.float)
一共3個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)具有兩個(gè)特征。
然后我們知道了節(jié)點(diǎn)間的鄰接關(guān)系:
edge_index = torch.tensor([[0, 1, 1, 2],
[1, 0, 2, 1]], dtype=torch.long)
一共4條邊,第一條邊為0->1,第2條邊為1->0。
然后我們就可以構(gòu)造數(shù)據(jù)集:
data = Data(x=x, edge_index=edge_index)
有關(guān)GCN的實(shí)現(xiàn)放在下一篇文章!
以上就是PyG搭建GCN需要準(zhǔn)備的數(shù)據(jù)格式的詳細(xì)內(nèi)容,更多關(guān)于PyG搭建GCN數(shù)據(jù)格式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
70行Python代碼實(shí)現(xiàn)一個(gè)桌面自動(dòng)翻譯工具
PySimpleGUI是一款很棒的自動(dòng)化輔助模塊,讓你更輕松的實(shí)現(xiàn)日常任務(wù)的自動(dòng)化。本文將利用PySimpleGUI編寫(xiě)一個(gè)桌面自動(dòng)翻譯工具,感興趣的可以了解一下2022-07-07
Python利用requests模塊下載圖片實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Python利用requests模塊下載圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
python定時(shí)任務(wù)sched庫(kù)用法簡(jiǎn)單實(shí)例
scipy稀疏數(shù)組coo_array的實(shí)現(xiàn)
Python中Parsel的兩種數(shù)據(jù)提取方式詳解
numpy中實(shí)現(xiàn)ndarray數(shù)組返回符合特定條件的索引方法
Python Pandas 箱線圖的實(shí)現(xiàn)

