pytoch使用(二)カスタムネットワーク
pytoch使用:カタログ
pytoch使用(二)カスタムネットワーク
まず、pytouchの公式マニュアルを参考にして、touch.nnについて説明します.
1.ネットワーク構造を定義する
自分のネットワークを構築して
pytouchで具体的にサポートされている層は公式マニュアルtoch.nnを参照してください.
2.ネットワークパラメータ初期化
pytoch公式は多様な初期化関数を提供しています.具体的には公式マニュアルを参照してください.uniform(tenssor,gain=1)
初期化関数は、神経ネットワークパラメータに直接作用します.は、ネットワークのある階層のパラメータを初期化する .は、ネットワーク全体のパラメータを初期化する .
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