03-02-模型容器與AlexNet構(gòu)建.mp4

模型容器Containers

最常用的是nn.Sequential(按順序)
觀察如何創(chuàng)建nn.Sequential

構(gòu)建完幾個(gè)網(wǎng)絡(luò)層之后,會(huì)進(jìn)入nn.Sequential的構(gòu)建
首先進(jìn)入container.py中的class Sequential(Module):類,發(fā)現(xiàn)繼承于Module,所以會(huì)有9個(gè)有序字典去管理它的屬性,可以看到調(diào)用了super去繼承module屬性

可以看到生產(chǎn)了有序字典

接下來會(huì)把網(wǎng)絡(luò)層添加到sequential當(dāng)中
判斷數(shù)據(jù)類型是不是有序字典,顯然不是

對(duì)參數(shù)循環(huán)的取出每個(gè)網(wǎng)絡(luò)層,再采用module的類方法add_module,將網(wǎng)絡(luò)層添加到sequential中

取出第一個(gè)網(wǎng)絡(luò)層conv2d,通過module的類方法add_module(在class Module,所以是類方法)

添加進(jìn)去到sequential的有序字典module中

會(huì)發(fā)現(xiàn)兩個(gè)重要的有序字典還是空的,這是因?yàn)榻刂廉?dāng)前,只是構(gòu)建好了等號(hào)右邊的sequential,還未賦值給類屬性features,根據(jù)上節(jié)課,會(huì)出現(xiàn)一個(gè)攔截賦值類屬性的函數(shù)

setattr函數(shù)攔截進(jìn)行屬性判斷,可知sequential是一個(gè)module

判斷完成后,在主module的有序字典中會(huì)存儲(chǔ)剛剛構(gòu)建好的module,key:features,value:sequential

sequential下面的有序字典module又有序的存儲(chǔ)了構(gòu)建好的幾個(gè)網(wǎng)絡(luò)層

接下來是模型構(gòu)建的第二個(gè)要素,拼接子模塊,實(shí)現(xiàn)前向傳播forward
會(huì)進(jìn)入container.py中的class Sequential(Module)的類方法forward函數(shù),按順序進(jìn)行操作最終得到輸出

以上是利用nn.sequential容器構(gòu)建的module,并且實(shí)現(xiàn)了構(gòu)建子模塊和拼接子模塊進(jìn)行前向傳播。
下面利用nn.sequential容器,加上有序字典的形式構(gòu)建module

單步運(yùn)行到等號(hào)右邊對(duì)sequential加入有序字典的網(wǎng)絡(luò)層

來到container.py中的class Sequential(Module)類,super進(jìn)入父類初始化,接著判斷長(zhǎng)度和類型

判斷為True,進(jìn)入循環(huán)

循環(huán)取出有序字典的key和value(module)

通過class Module:中的類方法add_module函數(shù)給sequential這個(gè)module賦值

此處,兩種方法對(duì)應(yīng)sequential的兩種狀態(tài)

1、

2、

循環(huán)完畢,網(wǎng)絡(luò)層就是有名稱的了,可以通過名稱去索引每個(gè)網(wǎng)絡(luò)層

總結(jié)nn.Sequential
