PyTorch 自定義層

2021-10-21 06:26:28 字數 1840 閱讀 1901

與使用module類構造模型類似。下面的centeredlayer類通過繼承module類自定義了乙個將輸入減掉均值後輸出的層,並將層的計算定義在了forward函式裡。這個層裡不含模型引數。

class

mydense

(nn.module)

:def

__init__

(self)

:super

(mydense, self)

.__init__(

) self.params = nn.parameterlist(

[nn.parameter(torch.randn(4,

4))for i in

range(3

)])4

,1))

)def

forward

(self, x)

:for i in

range

(len

(self.params)):

x = torch.mm(x, self.params[i]

)return x

net = mydense(

)print

(net)

parameter類其實是tensor的子類,如果乙個tensor是parameter,那麼它會自動被新增到模型的引數列表裡。所以在自定義含模型引數的層時,我們應該將引數定義成parameter,還可以使用parameterlist和parameterdict分別定義引數的列表和字典。

class

mydense

(nn.module)

:def

__init__

(self)

:super

(mydense, self)

.__init__(

) self.params = nn.parameterlist(

[nn.parameter(torch.randn(4,

4))for i in

range(3

)])4

,1))

)def

forward

(self, x)

:for i in

range

(len

(self.params)):

x = torch.mm(x, self.params[i]

)return x

net = mydense(

)print

(net)

而parameterdict接收乙個parameter例項的字典作為輸入然後得到乙個引數字典,然後可以按照字典的規則使用了。例如使用update()新增引數,使用keys()返回所有鍵值,使用items()返回所有鍵值對等等。

class

mydictdense

(nn.module)

:def

__init__

(self)

:super

(mydictdense, self)

.__init__(

) self.params = nn.parameterdict(

) self.params.update(

)# 新增

defforward

(self, x, choice=

'linear1'):

return torch.mm(x, self.params[choice]

)net = mydictdense(

)print

(net)

PyTorch 自定義層(區別於自定義模型)

博主在學習三值神經網路時,使用了lenet 5模型,程式設計 需要對lenet 5模型中的卷積層與全連線層進行自定義,搜尋他人方法後,博主產生了乙個疑問,絕大多數提供的自定義層方法都是繼承nn.module模型,而這方法據說是官方提供 官網 pytorch 自定義線性層 如下 class linea...

從頭學pytorch 十一 自定義層

一文裡說了怎麼寫自定義的模型.本篇說怎麼自定義層.分兩種 核心都一樣,自定義乙個繼承自nn.module的類,在類的forward函式裡實現該layer的計算,不同的是,帶引數的layer需要用到nn.parameter 直接繼承nn.module import torch from torch i...

Pytorch 實現自定義引數層的例子

注意,一般官方介面都帶有可導功能,如果你實現的層不具有可導功能,就需要自己實現梯度的反向傳遞。官方linear層 class linear module def init self,in features,www.cppcns.com out features,bias true super lin...