與使用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...