chainer.
Chain
(**links)[source]¶
オブジェクトライクなインタフェースを持つコンポーザブル(=構成/組み換え可能な)Link.
構成可能性はニューラルネットの最も重要な特徴のひとつです。ニューラルネットモデルは、多くの再利用可能な部分から構成されており、各モデル自身はさらに大きな学習システムに埋め込まれる可能性があります。Chainは私達が構造に基いてパラメータ収集やシリアル化、共有されたパラメータを持つ構造体のコピーのようなルーチンワークに煩わせられることなく、ニューラルネットを記述することを可能にします。
このクラスは、実際にひとつもしくは複数雨のLinkを1つの構造へ構成する方法を提供しています。Chainはひとつ、もしくは複数の子Linkを含むことが可能です。 子LinkはChainに自身の名前と一緒に登録されたLinkです。子LinkはChainの属性に、名前とともに格納されます。ユーザは、モデル全体、もしくはニューラルネットの一部をChainの子クラスとしてを記述することができます。
各Chain自身は、Linkでもあります。ですから、あるChainを高次のChainへ結合することが可能です。このように、LinkとChainはLink階層を構築します。Link 階層は木構造を形成し、そこで各ノードはルートからのパス(経路)によって区別されます。このパスは、UNIXにおけるファイルパスのように、パス上のノード名をスラッシュ/で区切った文字列で表現されます。
子Linkは init_scope()
.内で、Chainの属性に割り当てられることによって加えられます。
登録された子Linkは保存され、シリアル化とデシリアル化ではロードされ、最適化においても関わってきます。登録されたLinkは子と呼ばれます。子Linkは、children()
Generator経由でアクセス可能で、登録された順にchildren()
を通して実行しているGeneratorを返します。
子Linkの登録時、 name
属性も設定されます。(もしくはLinkが既に他のChainによって登録されていた場合は、上書きされます)
Example
これは、カスタムChainの定義の簡単な例です。
Chainer 自身も links
モジュールのもとで、幾つかのChainを提供します。それらも実例として役にかもしれません。
活性関数としてReLU(正規化線形関数)を持つ2つの隠れ層からなる多層パーセプトロンを定義したいとします。このとき Linear
Linkをブロックとして使うことができます。
self.layer1 = L.Linear(n_in, n_hidden)
import chainer
import chainer.functions as F
import chainer.links as L
class MultiLayerPerceptron(chainer.Chain):
def __init__(self, n_in, n_hidden, n_out):
super(MultilayerPerceptron, self).__init__()
with self.init_scope():
self.layer2 = L.Linear(n_hidden, n_hidden)
self.layer3 = L.Linear(n_hidden, n_out)
def __call__(self, x):
# Forward propagation
h1 = F.relu(self.layer1(x))
h2 = F.relu(self.layer2(h1))
return self.layer3(h2)
子Linkはwith self.init_scope():
ブロックの中で割り当てられて登録されます。この順伝播は. 必須ではないのですが、多くの場合、上記の実例のように__call__
オペレータとして実装されます。
Parameters: |
links –
子のLink. キーワードは名称としても用いられる。この名称はLinkにも設定される。
|
---|
Methods
add_link
(name, link)[source]¶
子LinkをこのChainに登録する。
init_scope()
内で子Linkを直接属性に割り当ててください。.
chain.add_link('l1', L.Linear(3, 5))
下記のように書き換えが可能です。
with chain.init_scope():
chain.l1 = L.Linear(3, 5)
IDEs が属性の型を追跡するのは、後者のほうが簡単です。
Parameters: |
---|
add_param
(name, shape=None, dtype=<type 'numpy.float32'>, initializer=None)[source]¶
Linkに登録するParameter
init_scope()
内でParameter
オブジェクトを直接属性に割り当ててください。.
link.add_param('W', shape=(5, 3))
下記のように書き換えが可能です。
with link.init_scope():
link.W = chainer.Parameter(None, (5, 3))
IDEs が属性の型を追跡するには、後者のほうが簡単です。
Parameters: |
|
---|
add_persistent
(name, value)[source]¶
永続値をLinkに登録する。
登録された値は保存され、シリアル化とでシリアル化ではロードされます。この値はLinkの属性に設定されます。
Parameters: |
|
---|
disable_update
()[source]¶
Link階層下の全てのParameterの更新ルールを無効化する。
このメソッドは各Parameter変数の更新ルールの enabled
フラグに False
を設定します。
enable_update
()[source]¶
Link階層下の全てのParameterの更新ルールを有効化する。
このメソッドは各Parameter変数の更新ルールの enabled
フラグに True
を設定します。
init_scope
(*args, **kwds)[source]¶
初期化スコープを作成する。
このメソッドはParameter(とChainのLink)の割当による登録を可能にするコンテクストマネージャ・オブジェクトを返します。Parameter
オブジェクトはこのコンテクストマネージャ下で、属性に割り当てることで自動的に登録されます。
Example
殆どの場合、Parameter登録はinitializer メソッドによって行われます。. init_scope
メソッドを用い、 Parameter
オブジェクトを登録するLinkへ、簡単に割り当てることができます
class MyLink(chainer.Link):
def __init__(self):
super().__init__()
with self.init_scope():
self.W = chainer.Parameter(0, (10, 5))
self.b = chainer.Parameter(0, (5,))
register_persistent
(name)[source]¶
与えられた名前の属性を永続値として登録する。
これは、永続値として存在している属性を快適に登録するメソッドです。 name
が既にParameterとして登録されている場合、このメソッドはそれをParameter名のリストから削除し、永続値として再登録します。
Parameters: | name (str) – 登録される属性の名称 |
---|
zerograds
()[source]¶
全ての勾配配列を0で初期化する。
このメソッドはcleargradsと同じ目的で使用できますが、非効率になります。
このメソッドは後方互換性のために残されています。
cleargrads()
をお使いください。
Attributes
update_enabled
¶
少なくとも1つのパラメータが有効な更新ルールを持つ時True
within_init_scope
¶
現在のコードが初期化スコープの内側であるときTrue
。
初期化スコープの詳細はinit_scope()
をご覧ください。