nn.Module を読んでみた
1 | この資料はラボ内自主勉強会に向けて書いたものです。間違い等ありましたら教えてください。 |
nn.Moduleとは?
PyTorchでカスタムモデルを作成する際にクラスで継承するやつ
1 | class SimpleModel(nn.Module): |
【事前知識】pythonの外部ファイルのクラスを実行可能にする方法
カレントディレクトリのhogeファイルのfugaクラスを読み込む場合
main.py
1 | from .hoge import fuga |
カレントディレクトリのhogeファイルの全てのクラスを読み込む場合
main.py
1 | from .hoge import * |
カレントディレクトリのhogeディレクトリのFuga1,Fuga2クラスを読み込む場合
main.py
1 | from .hoge import * |
/hoge/__init__.py
1 | from . import * |
/hoge/fuga.py
1 | class Fuga |
どこに継承元のModuleクラスが書いてある?
外部ファイルが存在?
→torch/nn/Module.py
は存在しない
書き方的に、torch/nn
ディレクトリに存在
Pythonは外部ディレクトリを読み込み時に__init__.py
を先に読む。
nn.Module→nn
ディレクトリの__init__.py
を読む
👉source
しかし、ここにも書いていない
1 | from .modules import * # noqa: F403 |
つまり、nn/module/
を全て読み込んでいる。
→nn/module/__init__.py
を見る
👉source
Moduleクラスを読み込んでいる部分を発見!
1 | from .module import Module |
nn/module/module.py
にModuleクラスが存在しているはず。
1 | class Module: |
インスタンス生成時に実行されるもの
インスタンス生成例
1 | model=SimpleModel() |
__setattr__
__setattr__
: インスタンスで代入操作実行時に呼び出されるコンストラクタ
(代入された変数,代入された値)
→ex.
1 | super().__setattr__('_parameters', OrderedDict()) |
→_parameters
に代入された時、辞書順にソートする。
Callable
Callable
関数の型のようなもの。関数名 Callable([引数型], 返り値型)
...
→Ellipsisという、Noneだけど、bool(…)でTrueを返すオブジェクト。今は無いけど、そのうちあることを示唆するような感じ。
つまり、forward: Callable[..., Any]
→…はforwardの引数の型、Anyがforwardの出力の型_forward_unimplemented
はそのまま呼び出すとNotImplementedError
を吐く関数。
→forward関数を、何か実装する雛形として宣言する。
つまりこのセクションで言いたいのは・・・
Moduleクラスの継承はインスタンス作成時にforwardを絶対に実装する必要がある!
インスタンス呼び出し時に実行されるもの
def __call__
はどこに?
これも同様に、Callableで宣言はして、_call_impl
で置き換えている。 __call__ : Callable[..., Any] = _call_impl
_call_impl
は何をしている?
*hook
系のものは、そのhookがTrueの時実行するもの。(ex.forward pass, backward passで__call__の処理を変える。)
→一旦self.forward
が実行されていると考えていい。
nn.Module継承先から呼び出す場合、継承先のself.forward
が実行される。
つまりこのセクションで言いたいのは・・・
クラスや型の機能を使ってfoward/backwardで処理を変更可能なモデル実行の雛形を作っている。