今天白天繼續(xù)研究GCN的源碼,又出現(xiàn)了被一個小問題折磨半天的情況。

torch_geometric中的是一個繼承torch.nn.Module的類。但是根據(jù)pytorch的風格,我們可以實例化一個
,然后把這個實例化對象
像函數(shù)一樣調(diào)用,例如?
進行圖卷積。問題來了,這個
類在初始化的時候有個參數(shù)
,表示是否緩存這次計算好的規(guī)范化鄰接矩陣,并且在下次計算的時候直接用緩存值而非重新計算。我一開始怎么也沒想通,這個代碼的邏輯。覺得每次計算好歸規(guī)范化鄰接矩陣之后雖然將值保留到
里了,但是隨著一次卷積運算結(jié)束,
調(diào)用完成后,函數(shù)自動釋放,
中的值無法保留到下一個
函數(shù)里呀。
后來發(fā)現(xiàn)自己真的膚淺了,根本原因是沒有搞懂這個類的實例化對象作為函數(shù)的方式。要是只是一個一般的函數(shù),那么在這個函數(shù)中修改的局部變量自然無法在下次調(diào)用中使用。但是實際上
是一個類的實例,并且這個類的實例在初始化后,便可以無數(shù)次調(diào)用。由于其沒有釋放內(nèi)存,其私有變量即
在修改后是會保留到下次調(diào)用的時候的。這樣實例化一個類作為模型中的一層,并且模型訓練過程中不斷修改層(也就是實例)中的參數(shù)的方式,是pytorch一個重要的特性。試想一下,如果模型中的一個層如果是一個普通的函數(shù)而非實例化的對象,那么函數(shù)在執(zhí)行完后是無法對其參數(shù)進行更新的,除非有很多全局變臉(那樣就亂了呀)。用類的__call__方法(pytorch的模型中是forward方法)將實例像函數(shù)一樣調(diào)用,使得這個特殊的函數(shù)的運行在和模型一樣的空間和時間下(這話是我自己的理解,不一定對),進而使得了函數(shù)中的變量(實例中的私有變量)可以保留上次模型對其做的改變。非常佩服,非常服氣。說到底自己還是對于Python中萬物皆對象的特性理解的不夠深,對于類的__call__特征理解的不夠深。這個方法真的有很多神奇的功能,比如裝飾器等等。
第二件事是自己身體狀態(tài)的事,真的讓我震驚了。為了讓一家人增加抵抗力,今天帶一家人出門跑步,跑的很慢,龜速那種,配速大概9分鐘一公里。跑完一家都很舒服,多巴胺和內(nèi)啡肽分泌,也能明顯感覺到大家都很開心。但是跑完后的1個小時后,我又出現(xiàn)了那種類似低血糖的感覺,即大腦非常疲憊,幾乎無法思考,學什么都沒有力氣,一副缺氧奄奄一息的狀態(tài)。這樣的狀態(tài)大概持續(xù)了兩三個小時,我就納悶了,平時我跑個5公里10公里出現(xiàn)這樣的情況容易理解,這次這么龜速地跑4公里,身體應該完全能過承受得了這個運動量才對,怎么可能在多巴胺內(nèi)啡肽退去后又這么累呢?后來我問我爸媽有沒有同樣出現(xiàn)過我那種困頓疲乏的狀態(tài),他們說:跑完步精神地很,怎么可能累嗎?我直接黑人問號臉??!原來真的是我自己的問題,而不是運動量過大。很可能是我激素分泌的原因,對于多巴胺、內(nèi)啡肽或者腎上腺素這幾個激素濃度降低有更敏感的反應。具體什么原因還有待進一步實驗,準備買個可穿戴血糖儀,先測試一下運動前后血糖的變化吧。
別人都是跑完步高效一整天,我是跑完步興奮1小時,之后萎靡大半天。從效率角度上來講,很虧呀?。。?/p>