PyTorchモデル構築

いくつかのモデル構築記録方式:

継承され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缶に容易がある、モデルクラスを構築しSequentialModuleListModuleDictなど

  • 使用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)

    にもかかわらずSequentialModuleListネットワーク設定のリストされているが、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

参考:

  1. 深ハンズオンPyTorchバージョンを学ぶ科学
  2. PyTorch公式文書

おすすめ

転載: www.cnblogs.com/patrolli/p/11896776.html