chainerでレイヤ数を雑に指定できるMLP

Chainer MLPでgoogleして出てくるのはLinearの数がハードコーディングなMLPばっかりだし、ユニット数を雑に指定して雑にMLP作れるやつが欲しかったので書いた。
もっとましな書き方あったら教えてください。

from chainer import Chain
from chainer import links as L
from chainer import functions as F

activations= {
        'tanh': F.tanh,
        'relu': F.relu,
        'sigmoid': F.sigmoid
    }

class MLP(Chain):
    def __init__(self, sizes, activation='sigmoid',noActFinal=False):
        super().__init__()

        self.numOfLayer = len(sizes)-1
        for i in range(self.numOfLayer):
            inSize, outSize = sizes[i:i+2]
            linear = L.Linear(inSize, outSize)
            self.add_link('linear%d'%i, linear)

        self.act = activations[activation]
        self.noActFinal = noActFinal

    def forward(self, x):
        y = x
        for i,linear in enumerate(self.links()):
            if i==0:
                # the first object of self.links is MLP object itself.
                continue

            y = linear(y)
            if i==self.numOfLayer and self.noActFinal:
                pass
            else:
                y = self.act(y)
        return y

例えばtanhを活性化関数に用いるユニット数が128, 32, 64の二層MLPなら以下のように書ける。

mlp = MLP([128,32,64], 'tanh')

MLPは最後の出力にsoftmaxを取ることが多いので、最後の活性化関数が必要ないなら以下のようにする。

mlp = MLP([128,32,64], 'tanh', noActFinal=True)

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です