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)