您好,登錄后才能下訂單哦!
本篇內容介紹了“Pytorch多種模型構造方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
之前的樣例主要采用Sequential來進行,這里做一個全面和充分的小結,以前只是單純的疊網絡,看完這章節才知道原來可以用的手法這么多;
對于基礎的網絡搭建,主要用到的是Module類,Sequential類為主;
其中Module可以算是基類,而派生類為Sequential、ModuleList、ModuleDict類,各自有各自的特點;
Sequential類主要繼承自Module類,是最簡單的網絡逐層累加方式;
例如最簡單的疊加方式:
net=nn.Sequential( nn.Linear(784,256), nn.ReLU(), nn.Linear(256,10) )
使用這種方法的特點是:
1.簡單,但是不能由較高靈活的定制化;
2.不用自定義forward前向傳播函數,層與層之間的參數尺寸必須要匹配;
如下所示:
net=nn.ModuleList([nn.Linear(784,256),nn.ReLU()]) net.append(nn.Linear(256,10))
這種也和Sequential類似,進行列表化構造網絡;
但是需要注意的是,需要定義Forward函數,只有Sequential類不需要自定義Forward函數;
ModuleDict類似于Sequential類的定義方式,并且可以通過字典方式進行索引查找;
net=nn.ModuleDict({ 'linear':nn.Linear(784,256), 'act':nn.ReLU() }) net['output']=nn.Linear(256,10)
但是和ModuleList類似,需要重新定義forward前向傳播函數;
例如:
class FancyMLP(nn.Module): def __init__(self, **kwargs): super(FancyMLP, self).__init__(**kwargs) self.rand_weight = torch.rand((20, 20), requires_grad=False) # 不可訓練參數(常數參數) self.linear = nn.Linear(20, 20) def forward(self, x): x = self.linear(x) # 使用創建的常數參數,以及nn.functional中的relu函數和mm函數 x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1) # 復用全連接層。等價于兩個全連接層共享參數 x = self.linear(x) # 控制流,這里我們需要調用item函數來返回標量進行比較 while x.norm().item() > 1: x /= 2 if x.norm().item() < 0.8: x *= 10 return x.sum()
這里值得注意的是,盡管只有一個Linear層,但是對于forward有了更多的操作空間;
forward函數相當于過了兩個linear層,之后對其中的數據進行了處理;
所以對于Module可以有更多的操作空間,例如使用上述網絡進行復雜網絡定制;
例如,可以采用如下方法,進行多層Module嵌套,并且定義各自的forward函數;
class SelfMLP(nn.Module): def __init__(self,**kwargs): super(SelfMLP, self).__init__(**kwargs) self.ran_weight=torch.rand((20,20),requires_grad=False) self.linear=nn.Linear(20,20) def forward(self,x): x=self.linear(x) x=nn.functional.relu(torch.mm(x)) class NestMLP(nn.Module): def __init__(self,**kwargs): super(NestMLP, self).__init__(**kwargs) self.net=nn.Sequential(nn.Linear(40,30),nn.ReLU()) def forward(self,x): return self.net(x) net=nn.Sequential(NestMLP(),nn.Linear(30,20),SelfMLP())
“Pytorch多種模型構造方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。