繼承 Module 類來構造模型

2021-10-05 12:13:45 字數 4212 閱讀 3674

import torch

from torch import nn

print

(torch.__version__)

class

mlp(nn.module)

:# 宣告模型引數層

def__init__

(self,

**kwargs)

:# 初始化

# **kwargs 表示函式接收可變長度的關鍵字引數字典

# super() 用來呼叫父類

super

(mlp,self)

.__init__(

**kwargs)

self.hidden = nn.linear(

784,

256)

# 宣告隱藏層

self.act = nn.relu(

)# 新增啟用函式

self.output = nn.linear(

256,10)

# 新增輸出層

# 定義模型向前計算

defforward

(self,x)

: a = self.act(self.hidden(x)

)return self.output(a)

x = torch.rand(2,

784)

#隨機產生兩組樣本

net = mlp(

)# 呼叫父類

print

(net)

# 檢視mlp結構

# 網路模型為:隱藏層linear(in_features=784, out_features=256, bias=true)

# 啟用函式:relu()

# 輸出層為:linear(in_features=256, out_features=10, bias=true)

net(x)

# 輸出結果,輸出2行10列的tensor

sequential 類

class

mysequential

(nn.module)

:from collections import ordereddict

def__init__

(self,

*args)

:# *args表示函式接收可變長度的關鍵字引數字典

super

(mysequential, self)

.__init__()if

len(args)==1

andisinstance

(args[0]

, ordereddict)

:# isinstance90 用來判斷物件是否為某個類的例項

for key, module in args[0]

.item():

self.add_module(key, module)

else

:for idx, module in

enumerate

(args)

: self.add_module(

str(idx)

, module)

# 新增module

defforward

(self,

input):

# 向前傳播

for module in self._modules.values():

input

= module(

input

)return

input

net = mysequential(

nn.linear(

784,

256)

, nn.relu(),

nn.linear(

256,10)

,)print

(net)

# 網路模型為:隱藏層linear(in_features=784, out_features=256, bias=true)

# 啟用函式:relu()

# 輸出層為:linear(in_features=256, out_features=10, bias=true)

net(x)

# 輸出一次向前計算結果,輸出2行10列的tensor

modulelist 類

# 接受列表作為輸入

net = nn.modulelist(

[nn.linear(

784,

256)

,nn.relu()]

)256,10

))print

(net[-1

])# 輸出net中最後乙個輸出層 linear(in_features=256, out_features=10, bias=true)

print

(net)

moduledict 類

net = nn.moduledict(

)#類似字典的訪問方法

net[

'output'

]=nn.linear(

256,10)

# 檢視單層模型

print

(net[

'linear'])

print

(net.output)

print

(net)

# 檢視整個網路模型

class

fancymlp

(nn.module)

:def

__init__

(self)

:super

(fancymlp, self)

.__init__(

) self.rand_weight = torch.rand((20

,20), requires_grad=

false

)#常數引數

# 權重引數不迭代

self.linear = nn.linear(20,

20)defforward

(self, x)

: x = self.linear(x)

# 使用建立的常數引數

x = nn.functional.relu(torch.mm(x, self.rand_weight.data)+1

)# 復用全連線層。等價於兩個全連線層共享引數

x = self.linear(x)

# 控制流,這裡我們需要呼叫item函式來返回標量進行比較

while x.norm(

).item(

)>1:

x /=

2if x.norm(

).item(

)<

0.8:

x *=

10return x.

sum(

)

x = torch.rand(2,

20)net = fancymlp(

)print

(net)

# 只有一層結構

net(x)

class

nestmlp

(nn.module)

:def

__init__

(self)

:super

(nestmlp, self)

.__init__(

) self.net = nn.sequential(nn.linear(40,

30), nn.relu())

defforward

(self, x)

:return self.net(x)

net = nn.sequential(nestmlp(

), nn.linear(30,

20), fancymlp())

#巢狀呼叫fancymlp和sequential

x = torch.rand(2,

40)print

(net)

# 多層復合網路模型

net(x)

21 , CSS 構造模型

div 邊距邊框 定位浮動 1 21.1 div 部分 division 元素,經常以 div 形式引用 是 xhtml 元素,用於定義 xhtml 文 件中的區域.1.新增 div this is our content area.給 div 新增乙個 id this is our content...

類繼承 繼承類的建構函式

派生類不能直接訪問基類的私有成員,必須通過基類提供的公有方法。派生類不能繼承基類的建構函式,因為建構函式和成員函式存在區別 建構函式用於建立新的物件,而其他成員函式是被現有的物件呼叫。派生類建構函式必須使用基類的建構函式。建立派生類物件時,先建立基類物件,因此基類物件應該在進入派生類建構函式之前被建...

物件和類 二階構造模式

本文參照於狄泰軟體學院,唐佐林老師的 c 深度剖析教程 在建構函式的問題裡,我們 了建構函式失敗會造成程式的bug。那麼我們也尋找了幾種解決方案。最後我們發現,無論是拋異常還是用成員變數檢測構造是否成功的方法都太麻煩和無法完全解決物件釋放問題。所以我們需要另尋他路。需要解決的問題 當資源申請失敗時,...