いくつかのモデル構築記録方式:
継承されModule
たクラス構造モデル
Module
私たちは、継承を介して取得する必要があるモデルは、通常、我々はオーバーライドする必要があるすべてのニューラルネットワークモジュール、基本クラスであるModule
のクラスの__init__
機能とforward
関数が。
例
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))
使用Module
サブクラス
Pytorchでから継承実現にModule
缶に容易がある、モデルクラスを構築しSequential
、ModuleList
、ModuleDict
など
使用
Sequential
各系列を計算するために、前者のモデルは、単純な層として算出される場合、
Sequential
クラスは、より簡単な方法モデルで定義することができます。これは、Sequential
クラスのオブジェクト:それは辞書(OrderedDict)個別にパラメータとして追加サブモジュール又はサブモジュールの一連の順序付けられた受信することができModule
、例えば、前者のモデルは、計算に追加するために、これらの例のいずれかによって計算されます。ここと達成
Sequential
同様の機能のMySequential
クラスをclass MySequential(nn.Module): from collections import OrderedDict def __init__(self, *args): super(MySequential, self).__init__() if len(args) == 1 and isinstance(args[0], OrderedDict): # 如果传入的是一个OrderedDict for key, module in args[0].items(): self.add_module(key, module) # add_module方法会将module添加进self._modules(一个OrderedDict) else: # 传入的是一些Module for idx, module in enumerate(args): self.add_module(str(idx), module) def forward(self, input): # self._modules返回一个 OrderedDict,保证会按照成员添加时的顺序遍历成员 for module in self._modules.values(): input = module(input) return input
使用
ModuleList
リスト内のサブモジュール(
list
)のうち
ModuleList
のPythonリストと同じルーチンを実行することができappend()
、extend()
いくつか存在することを除いて、操作ModuleList
のすべてのモジュールのパラメータが自動的にネットワーク全体に追加されます例
net = nn.ModuleList([nn.Linear(784, 256), nn.ReLU()]) net.append(nn.Linear(256, 10)) # # 类似List的append操作 print(net[-1]) # 类似List的索引访问 print(net)
にもかかわらず
Sequential
とModuleList
ネットワーク設定のリストされているが、2つの違いがあります。ModuleList
店舗の様々なモジュールのリストだけが、そここれらのモジュール間の接続は、(隣り合う入出力寸法整合層を保証するものではない)は、オーダーされていない、およびno実装forward
の機能を(実装する必要があります)。Sequential
順番に必要内のモジュールは、入力と出力の大きさは、隣接する層に一致することを確実にするために、内部forward
機能が達成されました。ModuleList
外観はフロントの伝播を定義するためのネットワークより柔軟に行うことができます。class MyModule(nn.Module): def __init__(self): super(MyModule, self).__init__() self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)]) def forward(self, x): # ModuleList can act as an iterable, or be indexed using ints for i, l in enumerate(self.linears): x = self.linears[i // 2](x) + l(x) return x
使用
ModuleDict
ModuleDict
アクセス動作が辞書と同様に実行することができる追加し、入力としてサブモジュール辞書を受信し、そして:net = nn.ModuleDict({ 'linear': nn.Linear(784, 256), 'act': nn.ReLU(), }) net['output'] = nn.Linear(256, 10) # 添加 print(net['linear']) # 访问 print(net.output) print(net) # net(torch.zeros(1, 784)) # 会报NotImplementedError
そして
ModuleList
、の使用ModuleDict
と同じ必要が時に定義しますforward
参考: