python機器學(xué)習(xí)GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理解析
1. 圖信號處理知識
圖卷積神經(jīng)網(wǎng)絡(luò)涉及到圖信號處理的相關(guān)知識,也是由圖信號處理領(lǐng)域的知識推導(dǎo)發(fā)展而來,了解圖信號處理的知識是理解圖卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。
1.1 圖的拉普拉斯矩陣
拉普拉斯矩陣是體現(xiàn)圖結(jié)構(gòu)關(guān)聯(lián)的一種重要矩陣,是圖卷積神經(jīng)網(wǎng)絡(luò)的一個重要部分。
1.1.1 拉普拉斯矩陣的定義及示例
實例:
按照上述計算式子,可以得到拉普拉斯矩陣為:
1.1.2 正則化拉普拉斯矩陣
1.1.3 拉普拉斯矩陣的性質(zhì)
1.2 圖上的傅里葉變換
傅里葉變換是一種分析信號的方法,它可分析信號的成分,也可用這些成分合成信號。它將信號從時域轉(zhuǎn)換到頻域,從頻域視角給出了信號處理的另一種解法。(1)對于圖結(jié)構(gòu),可以定義圖上的傅里葉變換(GFT),對于任意一個在圖G上的信號x,其傅里葉變換表示為:
從線代角度,可以清晰的看出:v1,…, vn構(gòu)成了N維特征空間中的一組完備基向量,G中任意一個圖信號都可表示為這些基向量的線性加權(quán)求和,系數(shù)為圖信號對應(yīng)傅里葉基上的傅里葉系數(shù)。
回到之前提到的拉普拉斯矩陣刻畫平滑度的總變差:
可以看成:刻畫圖平滑度的總變差是圖中所有節(jié)點特征值的線性組合,權(quán)值為傅里葉系數(shù)的平方??傋儾钊∽钚≈档臈l件是圖信號與最小的特征值所對應(yīng)的特征向量完全重合,結(jié)合其描述圖信號整體平滑度的意義,可將特征值等價成頻率:特征值越低,頻率越低,對應(yīng)的傅里葉基變化緩慢,即相近節(jié)點的信號值趨于一致。
把圖信號所有的傅里葉系數(shù)結(jié)合稱為頻譜(spectrum),頻域的視角從全局視角既考慮信號本身,也考慮到圖的結(jié)構(gòu)性質(zhì)。
1.3 圖信號濾波器
圖濾波器(Graph Filter)為對圖中的頻率分量進行增強或衰減,圖濾波算子核心為其頻率響應(yīng)矩陣,為濾波器帶來不同的濾波效果。
故圖濾波器根據(jù)濾波效果可分為低通,高通和帶通。
低通濾波器:保留低頻部分,關(guān)注信號的平滑部分;
高通濾波器:保留高頻部分,關(guān)注信號的劇烈變化部分;
帶通濾波器:保留特定頻段部分;
而拉普拉斯矩陣多項式擴展可形成圖濾波器H:
2. 圖卷積神經(jīng)網(wǎng)絡(luò)
2.1 數(shù)學(xué)定義
圖卷積運算的數(shù)學(xué)定義為:
上述公式存在一個較大問題:學(xué)習(xí)參數(shù)為N,這涉及到整個圖的所有節(jié)點,對于大規(guī)模數(shù)據(jù)極易發(fā)生過擬合。
進一步的化簡推導(dǎo):將之前說到的拉普拉斯矩陣的多項式展開代替上述可訓(xùn)練參數(shù)矩陣。
此結(jié)構(gòu)內(nèi)容即定義為圖卷積層(GCN layer),有圖卷積層堆疊得到的網(wǎng)絡(luò)模型即為圖卷積網(wǎng)絡(luò)GCN。
2.2 GCN的理解及時間復(fù)雜度
圖卷積層是對頻率響應(yīng)矩陣的極大化簡,將本要訓(xùn)練的圖濾波器直接退化為重歸一化拉普拉斯矩陣
2.3 GCN的優(yōu)缺點
優(yōu)點:GCN作為近年圖神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)之作,對處理圖數(shù)據(jù)非常有效,其對圖結(jié)構(gòu)的結(jié)構(gòu)信息和節(jié)點的屬性信息同時學(xué)習(xí),共同得到最終的節(jié)點特征表示,考慮到了節(jié)點之間的結(jié)構(gòu)關(guān)聯(lián)性,這在圖操作中是非常重要的。
缺點:過平滑問題(多層疊加之后,節(jié)點的表示向量趨向一致,節(jié)點難以區(qū)分),由于GCN具有一個低通濾波器的作用(j聚合特征時使得節(jié)點特征不斷融合),多次迭代后特征會趨于相同。
3. Pytorch代碼解析
GCN層的pytorch實現(xiàn):
class GraphConvolutionLayer(nn.Module): ''' 圖卷積層:Lsym*X*W 其中 Lsym表示正則化圖拉普拉斯矩陣, X為輸入特征, W為權(quán)重矩陣, X'表示輸出特征; *表示矩陣乘法 ''' def __init__(self, input_dim, output_dim, use_bias=True): #初始化, parameters: input_dim-->輸入維度, output_dim-->輸出維度, use_bias-->是否使用偏置項, boolean super(GraphConvolutionLayer,self).__init__() self.input_dim=input_dim self.output_dim=output_dim self.use_bias=use_bias #是否加入偏置, 默認(rèn)為True self.weight=nn.Parameter(torch.Tensor(input_dim, output_dim))#權(quán)重矩陣為可訓(xùn)練參數(shù) if self.use_bias==True: #加入偏置 self.bias=nn.Parameter(torch.Tensor(output_dim)) else: #設(shè)置偏置為空 self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): #初始化參數(shù) stdv = 1. / math.sqrt(self.weight.size(1)) self.weight.data.uniform_(-stdv, stdv)#使用均勻分布U(-stdv,stdv)初始化權(quán)重Tensor if self.bias is not None: self.bias.data.uniform_(-stdv, stdv) def forward(self, adj, input_feature): #前向傳播, parameters: adj-->鄰接矩陣(輸入為正則化拉普拉斯矩陣), input_future-->輸入特征矩陣 temp=torch.mm(input_feature, self.weight)#矩陣乘法, 得到X*W output_feature=torch.sparse.mm(adj, temp)#由于鄰接矩陣adj為稀疏矩陣, 采用稀疏矩陣乘法提高計算效率, 得到Lsym*temp=Lsym*X*W if self.use_bias==True: #若設(shè)置了偏置, 加入偏置項 output_feature+=self.bias return output_feature
定義兩層的GCN網(wǎng)絡(luò)模型:
class GCN(nn.Module): ''' 定義兩層GCN網(wǎng)絡(luò)模型 ''' def __init__(self, input_dim, hidden_dim, output_dim): #初始化, parameters: input_dim-->輸入維度, hidden_dim-->隱藏層維度, output_dim-->輸出維度 super.__init__(GCN, self).__init__() #定義兩層圖卷積層 self.gcn1=GraphConvolutionLayer(input_dim, hidden_dim) self.gcn2=GraphConvolutionLayer(hidden_dim, output_dim) def forward(self, adj, feature): #前向傳播, parameters: adj-->鄰接矩陣, feature-->輸入特征 x=F.relu(self.gcn1(adj, feature)) x=self.gcn2(adj, x) return F.log_softmax(x, dim=1)
以上就是GCN圖卷積神經(jīng)網(wǎng)絡(luò)原理及代碼解析的詳細(xì)內(nèi)容,更多關(guān)于GCN圖卷積神經(jīng)網(wǎng)絡(luò)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python實現(xiàn)用networkx繪制MultiDiGraph
- Python使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖
- Python中的Networkx的基本使用
- Python中卷積神經(jīng)網(wǎng)絡(luò)(CNN)入門教程分分享
- Python?CNN卷積神經(jīng)網(wǎng)絡(luò)實戰(zhàn)教程深入講解
- python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN
- Python卷積神經(jīng)網(wǎng)絡(luò)圖片分類框架詳解分析
- python如何實現(xiàn)convolution neural network卷積神經(jīng)網(wǎng)絡(luò)算法
相關(guān)文章
python 將html轉(zhuǎn)換為pdf的幾種方法
這篇文章主要介紹了python 將html轉(zhuǎn)換為pdf的幾種方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12python GUI庫圖形界面開發(fā)之PyQt5信號與槽基礎(chǔ)使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號與槽基礎(chǔ)使用方法與實例,需要的朋友可以參考下2020-03-03python+appium+yaml移動端自動化測試框架實現(xiàn)詳解
這篇文章主要介紹了python+appium+yaml移動端自動化測試框架實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖
日常工作、生活中我們經(jīng)常會遇到一些復(fù)雜的事務(wù)關(guān)系,比如人物關(guān)系,那如何才能清楚直觀的看清楚這些任務(wù)關(guān)系呢?所以小編給大家介紹了Python如何使用Networkx實現(xiàn)復(fù)雜的人物關(guān)系圖,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2023-11-11