Pytorch卷積模塊

Pytorch作爲一個深度學習庫,卷積神經網絡中所有的層結構都可以通過nn調用。

巻積層

nn.Conv2d()就是Pytorch中的卷積模塊,裏面常用的參數有5個,分別是in_channels, outchannels, kernel_size, stride, padding,除此以外還有參數dilation, groups, bias.

  • in_channels和out_channels是輸入和輸出數據體的深度
  • kernel_sizez是濾波器的大小,可以使用一個數字表示方形,或者用兩個數字分別表示高和寬.
  • stride表示滑動的步長
  • padding=0表示四周不進行0填充,=1表示進行1個像素點的填充
  • bias是一個布爾值,默認bias=True,表示使用偏置;
  • groups表示輸出數據體深度上和輸入數據體深度上的聯繫,默認=1,也就是所有的輸出和輸入都是相關聯的,如果=2,這表示輸入的深度被分割成兩份,輸出的深度也被分割成兩份,他們之間分別對應,所以要求輸出和輸入都必須被groups整除
  • dilation表示卷積對於輸入數據體的空間間隔,默認爲1

池化層

nn.MaxPool2d()表示網絡中的最大值池化,其中的參數有kernel_size, stride, padding , return_indices, ceil_mode
- kernel_size,stride,padding,dilation和巻積層中的參數含義相同
- return_indices表示是否返回最大值所處的下標,默認return_indices=False
- ceil_mode表示使用一些方格代替層結構,默認ceil_mode=False
- nn.AvgPool2d()表示使用均值池化,裏邊參數大致相同,但是多一個count_include_pad,這個參數表示在計算均值的時候是否包含零填充,默認是True

~python
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN,self).__init__()  #b,3,32,32
        layer1 = nn.Sequential()
        layer1.add_module('conv1',nn.Conv2d(3,32,3,1,padding=1))#b,32,32,32
        layer1.add_module('relu1',nn.ReLU(Ture))
        layer1.add_module('pool1',nn.MaxPool2d(2,2)) #b,32,16,16
        self.layer1 = layer1

        layer2 = nn.Sequential()
        layer2.add_module('conv2',nn.Conv2d(32,64,3,1,padding=1))#b,64,16,16
        layer2.add_module('relu2',nn.ReLU(Ture))
        layer2.add_module('pool2',nn.MaxPool2d(2,2)) #b,64,8,8
        self.layer2=layer2

        layer3 = nn.Sequential()
        layer3.add_module('conv3',nn.Conv2d(64,128,3,1,padding=1))#b,128,8,8
        layer1.add_module('relu1',nn.ReLU(Ture))
        layer1.add_module('pool1',nn.MaxPool2d(2,2)) #b,128,4,4
        self.layer3 = layer3

        layer4=nn.Sequential()
        layer4.add_module('fc1',nn.Linear(2048,512))
        layer4.add_module('fc_relu1',nn.ReLU(True))
        layer4.add_module('fc2',nn.Linear(512,64))
        layer4.add_module('fc_relu2',nn.ReLU(True))
        layer4.add_module('fc3',nn.Linear(64,10))
        self.layer4 = layer4
    def forward(self,x):
        conv1 = self.layer1(x)
        conv2 = self.layer2(conv1)
        conv3 = self.layer3(conv2)
        fc_input = conv3.view(conv3.size(0),-1)
        fc_out = self.layer4(fc_input)
        return fc_out
    model = SimpleCNN()

作者強烈建議在建立巻積層和池化層時通過參數計算一下輸出的數據體大小,然後在代碼旁邊寫出註釋,這樣在定義複雜網絡的時候不會出事
同時在return處添加中間層的輸出結果,可以方便的得到網絡的中間層輸出
使用print(model)顯示網絡中定義了那些結構
這裏寫圖片描述

如何提取層結構

nn.Module幾個重要屬性

  • children(),返回下一級模塊的迭代器,不會返回內部的東西
  • modules(),返回所有模塊的迭代器,能夠訪問到最內層
  • names_children()和names_modules()不僅會返回迭代器還會返回網絡層的名字

    提取前兩層:

new_model=nn.Sequential(*liat(model.children())[:2])

這裏寫圖片描述
提取模型中所有的巻積層:

for layer in model.named_modules():
    if isinstance(layer[1],nn.Conv2d):
        conv_moedl.add_module(layer[0],layer[1])

如何提取參數及自定義初始化

nn.Module中有兩個特別重要的關於參數的屬性,分別是named_parameters()和parameters().named_parameters()是給出網絡層的名字和參數的迭代器,parameters()會給出一個網絡的全部參數的迭代器

for param in model.named_parameters():
    print(param[0])

去除data屬性進行處理

for m in model.modules():
    if ininstance(m,nn.Conv2d):
        init.normal(m.weight.data)
        init.xavier_normal(m.weight.data)
        init.kaiming_normal(m.weight.data)
        m.bias.data.fill_(0)
    elif isinstance(m,nn.Linear):
        m.weight.data.noemal_()

以上操作對權重進行了初始化,這樣可以任意使用新的初始化,甚至可以定義初始化方法並對權重進行初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章