Mnistで深層学習入門 活性化関数 時間/精度比較


最近、ニュースや記事でよく目にする、耳にする“ ディープラーニング(Deep Learning) ” 。ディープラーニングに興味ある方が多方面に増えてきている一方で、Deep Learningについて知りたいけれども、実際よくわからないと感じている方も多く見受けられます。この記事はディープラーニングについて説明します。過去に紹介してきたクラスタリング回帰分析とは異なります。

ディープラーニングとは

ディープラーニング(deep learning)または深層学習とは、人間の脳神経回路を模したニューラルネットワークを多層的にすることで、コンピューター自らがデータに含まれる潜在的な特徴をとらえ、より正確で効率的な判断を実現させる技術や手法です。

具体的な例は、世界囲碁トップレベルに勝利した人工知能の囲碁プログラム「AlphaGo」のアルゴリズムはディープラーニングです。

deep_learning2.1

「機械学習」と「ディープラーニング」の違いとは?

ディープラーニングは機械学習をさらに発展させたものだ。従来の機械学習との大きな違いは、情報やデータを分析する際に使う枠組みが異なっていること。構成、データ量、コンピューティングソースなどの異は下記の表にまとめました。

deep_learning3

実験

ディープラーニングを実験すると思っていたところ、kerasでmnistのデータを画像分類します。

Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです. Kerasは,コードが書きやすく、迅速な実験を可能にすることに重点を置いて開発されました. アイデアから結果を得るまでの時間を早くする事で試行錯誤をしやすいというメリットがあります。

mnistのデータ

28×28ピクセル、白黒画像の 手書き数字 のデータセットになります。各ピクセルは0(白)~255(黒)の値をとる。6万枚の学習用画像と1万枚のテスト画像が入っています。今回は活性化関数を変えながら精度と時間比較をしてみます。

https://keras.io/ja/datasets/#mnist

実行環境

Python3.6

Anaconda 5.2.0

Jupyter Notebook5.6.0

Python ライブラリー

  • Tensoflow 1.10.0
  • Keras 2.2.2
  • Sklearn 0.19.1

mnist_kerasのPython

import numpy as np

import tensorflow as tf

from keras.models import Sequential

from keras.layers.core import Dense, Activation

from keras.optimizers import SGD

from sklearn import datasets

from sklearn.model_selection import train_test_split

from tensorflow.examples.tutorials.mnist import input_data

%matplotlib inline

import matplotlib.pyplot as plt

tf.logging.set_verbosity(tf.logging.ERROR)

 

n = len(mnist.train.images)

N = 10000  # MNISTの一部を使う

indices = np.random.permutation(range(n))[:N]  # ランダムにN枚を選択

 

X = mnist.train.images[indices]

y = mnist.train.labels[indices]

 

# 0枚目の画像は ‘0’ を表す

print(X_train[0])

print(X_train[0])

plt.imshow(X_train[0].reshape((28, 28)), cmap=’gray’)

 

n_in = len(X[0])  # 784

n_hidden = 200

n_out = len(y[0])  # 10

alpha = 0.01

 

model = Sequential()

model.add(Dense(n_hidden, input_dim=n_in))

 

# relu / tanh / sigmoid /elu

# 詳しくはhttps://keras.io/ja/activations/

 

model.add(Activation(‘sigmoid’))

model.add(Dense(n_hidden))

 

#model.add(Activation(‘sigmoid’))

#model.add(Dense(n_hidden))

 

#model.add(Activation(‘sigmoid’))

#model.add(Dense(n_hidden))

 

 

 

model.add(Dense(n_out))

model.add(Activation(‘softmax’))

 

model.compile(loss=’categorical_crossentropy’,

              optimizer=SGD(lr=0.01),

              metrics=[‘accuracy’])

 

epochs = 100

batch_size = 200

 

model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size)

 

loss_and_metrics = model.evaluate(X_test, Y_test)

print(loss_and_metrics)

結果

活性化関数を変えてみて、relu, tanh, sigmoid, eluのパラメーターでの結果を比較しました。reluは精度が一番高いのがわかります。またelu関数だと速度が最もワンステップ辺り早い事もわかります。

 

Activation(‘relu’)

Rectified Linear Unit

1s 65us/step – loss: 0.1025 – acc: 0.9761

 

(Activation(‘tanh’)

Hyperbolic tangent activation function

1s 79us/step – loss: 0.1610 – acc: 0.9568

 

Activation(‘sigmoid’)

Sigmoid activation function

1s 65us/step – loss: 0.2866 – acc: 0.9146

 

(Activation(‘elu’)

Exponential linear unit

1s 63us/step – loss: 0.1741 – acc: 0.9563