多層パーセプトロンの実装

Network in network の論文を読んで自分が多層パーセプトロンをまともに実装したことがないということに気づきました。この記事ではKerasのリファレンスを参考に実装してみたいと思います。
keras.io

多層パーセプトロンとは

パーセプトロンを何層か重ねたものを多層パーセプトロンと呼びます。パーセプトロンは入力となる信号と、それぞれの入力に対する重みの演算を出力します。単独のパーセプトロンでは非常に限られた表現力しか持てませんが、層を重ねることで表現力を強化することができます。

Kerasを使った多層パーセプトロンの実装

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.utils import plot_model

# ダミーデータ生成
import numpy as np
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)

model = Sequential()
# Dense(64) は,64個のhidden unitを持つ全結合層です.
# 最初のlayerでは,想定する入力データshapeを指定する必要があり,ここでは20次元としてます.
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
              optimizer=sgd,
              metrics=['accuracy'])

model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)

データの詳細

学習データは、20次元の特徴量を持ったものが1000個用意されています。その一つ一つが、1から10の値をとるクラスのいずれかに属しています。テストデータとして、同じフォーマットのデータが100個用意されています。

モデルの詳細

入力層、中間層、出力の3層構造になっています。入力層には特徴量の次元と同じ数を input_dim 引数にしています。入力層と中間層のユニット数はともに64で活性化関数はreluを使用します。最後の出力層にはクラスの数と同じだけのユニット数を指定します。今回は10クラスの分類なので、出力層のユニット数は10になります。

最適化アルゴリズムには確率的勾配降下法(Stochastic Gradient Descent)を用います。SGDの引数を以下にまとめます。
lr:学習率(learning rate)
momentum:前回の更新量に対してα倍して加算する慣性項の係数。
decay:学習率を徐々に減衰させていくときの値。
nesterov:nesterov momentumを使うかどうかを指定する。

モデルを学習する前にcompileをします。後に訓練データをfitメソッドに渡して学習させます。

まとめ

今回のデータは完全にランダムなデータだったので結果に関しては省略します。
本当はモデルを可視化することも載せたかったのでうまく動かなかったのでまたやり直してみようと思います。