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)