今回から、Pythonを使ってディープラーニングについて書いていこうと思います。
初日の今回は、MNISTデータについて、隠れ層が一つの三層のネットワークを作って、設定方法による性能の差について検証して見ました。
まず、モデルはkerasを使って書く事とします。
今回の検証内容は、隠れ層のユニット数と性能の差について確認してみたいと思います。
ユニット数は次の条件で検証してみようと思います。
$$\rm{Unit}_{num}=2^{i}\ \ \ (i=0,\cdot\cdot\cdot,10)$$
ソースコードは以下の通りです。
なお、条件はこんな感じです。
- optimierはSGDを使用
- バッチサイズは128、エポックは100回、validationはなし
- 損失関数はCategorical Cross Entropy
MLP_effect_of_middle.py
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.datasets import mnist
from keras.utils import np_utils
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784).astype(np.float32)
x_test = x_test.reshape(10000, 784).astype(np.float32)
x_train /= 255
x_test /= 255
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
x = np.arange(11)
y = 2**x
accuracy = []
for middle_num in y:
model = Sequential()
model.add(Dense(middle_num, input_shape=(784,)))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
history = model.fit(x_train, y_train, epochs=100, batch_size=128, verbose=1)
score = model.evaluate(x_test, y_test, verbose=1)
accuracy.append(score[1])
実行結果は次のようになりました。
Unit数 | 精度[%] |
---|---|
1 | 36.43 |
2 | 66.7 |
4 | 87.16 |
8 | 92.39 |
16 | 94.67 |
32 | 95.81 |
64 | 96.4 |
128 | 97.1 |
256 | 97.19 |
512 | 97.26 |
1024 | 97.39 |
Unit数が比較的小さい場合、Unit数の増加に伴って精度が大きく改善されている事が確認できますが、比較的大きくなった場合、精度の向上があまり確認されませんでした。 | |
さまざまな文献で、Unit数や層数をただ闇雲に増やしても精度の改善につながる保証はないと報告されていますが、今回の実験で確認できました。実際にディープラーニングモデルを構成する場合、Unit数だけでなく層数や活性化関数をはじめとし、さまざまな設計要素があるため、ネットワークモデルの検証要素は多数あります。そのため、今後はそれらの要素についても考えてみたいと思います。 | |
次回は、Unit数と層数の関係性について検証してみたいと思います。 |