chainer.Chain

class 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をブロックとして使うことができます。 


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.layer1 = L.Linear(n_in, n_hidden)
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にも設定される。

version v2.0.0以降、非推奨:
かわりに、子Linkを直接属性に割り当ててください。

 

 

Methods

__getitem__(name)[source]

getattrと同じ。

子LinkをこのChainに登録する。

 

version v2.0.0以降、非推奨:
init_scope() 内で子Linkを直接属性に割り当ててください。.
例えば、下記のコードですが
chain.add_link('l1', L.Linear(3, 5))

 

下記のように書き換えが可能です。

with chain.init_scope():

chain.l1 = L.Linear(3, 5)

 

IDEs が属性の型を追跡するのは、後者のほうが簡単です。

Parameters:
  • name (str) – 子Linkの名称. この名称は属性の名称としても用いられます。
  • link (Link) – 登録するLinkオブジェクト

 

add_param(name, shape=None, dtype=<type 'numpy.float32'>, initializer=None)[source]

Linkに登録するParameter

 

 version v2.0.0以降、非推奨:
init_scope() 内でParameter オブジェクトを直接属性に割り当ててください。.
例えば、下記のコードですが
link.add_param('W', shape=(5, 3))

 

下記のように書き換えが可能です。

with link.init_scope():

link.W = chainer.Parameter(None, (5, 3))

IDEs が属性の型を追跡するには、後者のほうが簡単です。

Parameters:
  • name (str) – Parameterの名称。この名称は属性の名称にも用いられる。
  • shape (int or tuple of ints) – Parameter配列の形(Shape) 。省略された場合、Parameter変数は初期化されないまま。
  • dtype – Parameter 配列のデータ型
  • initializerNoneが設定されていない場合、データは与えられた初期化子で初期化されます。初期化子が配列だった場合、データは直接その配列で初期化されます。 呼び出し可能な場合は、重みの初期化子とshちえ用いられます。これらのケースでは、dtype 引数は無視されますので、注意してください。

 

add_persistent(name, value)[source]

永続値をLinkに登録する。

 

登録された値は保存され、シリアル化とでシリアル化ではロードされます。この値はLinkの属性に設定されます。

Parameters:
  • name (str) – 永続値の名称。この名称は属性の名称としても用いられる。
  • value – 登録される値

 

addgrads(link)[source]
children()[source]
cleargrads()[source]

勾配配列を全てクリアする。

 

このメソッドは後方計算の最適化の繰り返しの前に毎回呼び出されるはずです。

 

copy()[source]
copyparams(link)[source]
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,))
namedparams(include_uninit=True)[source]
params(include_uninit=True)[source]
register_persistent(name)[source]

与えられた名前の属性を永続値として登録する。

 

これは、永続値として存在している属性を快適に登録するメソッドです。 name が既にParameterとして登録されている場合、このメソッドはそれをParameter名のリストから削除し、永続値として再登録します。

Parameters: name (str) – 登録される属性の名称

 

serialize(serializer)[source]
to_cpu()[source]
to_gpu(device=None)[source]
zerograds()[source]

 

全ての勾配配列を0で初期化する。

このメソッドはcleargradsと同じ目的で使用できますが、非効率になります。
このメソッドは後方互換性のために残されています。

v1.15以降では非推奨:
かわりにcleargrads()をお使いください。

 

Attributes

update_enabled

少なくとも1つのパラメータが有効な更新ルールを持つ時True

within_init_scope

現在のコードが初期化スコープの内側であるときTrue 。

初期化スコープの詳細はinit_scope() をご覧ください。

xp

このLinkへの配列モジュール。

 

CPUとGPUどちらのLinkがオンになっているかによって、 プロパティは numpy か cupyを返す。