pytoch使用(二)カスタムネットワーク


pytoch使用:カタログ
pytoch使用(二)カスタムネットワーク
まず、pytouchの公式マニュアルを参考にして、touch.nnについて説明します.
1.ネットワーク構造を定義する
自分のネットワークを構築してclass torch.nn.Moduleを使用して、公式マニュアルの中に非常に簡単な例があります.
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
       x = F.relu(self.conv1(x))
       return F.relu(self.conv2(x))
この例は2層だけのネットワークModelを定義している.2つの関数:−初期化関数__init__(self)は、具体的なネットワークの層が定義されており、ここでは、実際には、ネットワークの構造が決定されていない、すなわち、上記の例のself.conv1およびself.conv2によって定義された前後の順序の入れ替わりは、全く影響がないということである.forward関数は、ネットワークの順方向伝播の順序を定義する.
pytouchで具体的にサポートされている層は公式マニュアルtoch.nnを参照してください.
2.ネットワークパラメータ初期化
pytoch公式は多様な初期化関数を提供しています.具体的には公式マニュアルを参照してください.uniform(tenssor,gain=1)
初期化関数は、神経ネットワークパラメータに直接作用します.
  • は、ネットワークのある階層のパラメータを初期化する
  • .
    import torch.nn as nn
    import torch.nn.init as init
    
    conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
    init.xavier_uniform(conv1.weight)#    
    init.constant(conv1.bias, 0.1)#  
  • は、ネットワーク全体のパラメータを初期化する
  • .
    def weights_init(m):
        if isinstance(m, nn.Conv2d):
            xavier(m.weight.data)
            xavier(m.bias.data)  
    次の例では、ネットワークMyNetを定義し、ネットワークは6層の畳込みで構成される.
    import torch
    import torch.nn as nn
    import torch.nn.init as init
    
    class MyNet(nn.Module):
    
        def __init__(self):
            super(MyNet, self).__init__()
            self.conv1 = nn.Conv2d(22, 64, 7, padding=3)
            self.relu1 = nn.ReLU(inplace=True)
            self.conv2 = nn.Conv2d(64, 128, 7, padding=3)
            self.relu2 = nn.ReLU(inplace=True)
            self.conv3 = nn.Conv2d(128, 256, 5, padding=2)
            self.relu3 = nn.ReLU(inplace=True)
            self.conv4 = nn.Conv2d(256, 128, 5, padding=2)
            self.relu4 = nn.ReLU(inplace=True)
            self.conv5= nn.Conv2d(128, 64, 3, padding=1)
            self.relu5 = nn.ReLU(inplace=True)
            self.conv6 = nn.Conv2d(64, 6, 3, padding=1)
            self.relu6 = nn.ReLU(inplace=True)
    
            for m in self.modules():
                if isinstance(m, nn.Conv2d):
                    init.xavier_uniform(m.weight.data)
                    init.constant(m.bias.data,0.1)
    
        def forward(self, x):
            x = self.relu1(self.conv1(x))
            x = self.relu2(self.conv2(x))
            x = self.relu3(self.conv3(x))
            x = self.relu4(self.conv4(x))
            x = self.relu5(self.conv5(x))
            f = self.relu6(self.conv6(x))
            return f