背景
データ解析の会社に入って5ヶ月ぐらい経ちました。この間、機械学習や深層学習の基礎的な部分をメインで勉強していました。
またまた専門家になるにはかなりの差を感じますが、現時点での知識だけでも、そろそろ実践的なことをやりたいなと思って来たので、chainer, keras, q-learningなどの実例をみながら、プログラミングを初めています。
今回は、kerasを使って、簡単なニューラルネットワークを構築し、分類問題を解決してみます。
目次
概要
データセットの説明
データセット: データセットはmnistという、手書きで書かれた数字を画像にした画像データ(image)と、その画像に書かれた数字を表すラベルデータ(label)から構成されたデータを扱います。
各画像データサイズは、28px * 28pxであり、各ラベルデータは 0 ~9 のうち、いずれかの数値になっています。
サンプル数は、訓練データ: 60,000、テストデータ: 10,000になっています。
もつと詳細な情報はこのページ (MNIST データの仕様を理解しよう ) などを参照にして下さい。
ネットワーク構造
今回、構築するネットワークは、入力層、中間層(1個)、出力層と二層を持つネットワークになります。
各層のユニット数の設定として、入力層: 784 ユニット(28*28 pixを一次元に変換したデータ)、中間層: 32 ユニット、出力層: 10ユニット (画像が 0~9 の間、どの数値を表しているかを分類した結果を得るため) にしました。
プログラムの説明
1. データの読み取り
Kerasには、mnistデータを読み込む関数がデフォルトで入っています。
以下のような呼び出し方で、localの ~/.keras/datasets/
にデータが入ってあればそのデータを読み込むし、なければネットからダウンロードします。
且つ、データも訓練データとテストデータに分けて読み込んでくれます。
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_trainは、(60,000, 28, 28 )の三次元のデータで、28*28個のpixelデータが、60,000サンプル分あります。y_trainは、(60,000)の一次元データで、60,000個の 0~9の間の整数からなるデータになります。
2. データの前処理
データの前処理部分では、
X_train、X_testを3次元から2次元に変形し、255を割ることで、正規化を行います。
- X_train : (60,000, 28, 28) => (60,000)
y_train、y_test
pre-processing
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # changed to array(60000*784) X_test = X_test.reshape(X_test.shape[0], -1) / 255 y_train = np_utils.to_categorical(y_train) # convert int to vector y_test = np_utils.to_categorical(y_test) # convert int to vector
ソースコード
# coding: utf-8
import numpy as np
np.random.seed(2018)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
# X_train : (60000*28*28), Y_train:(60000), X_test: (60000*28*28)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# pre-processing
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # changed to array(60000*784)
X_test = X_test.reshape(X_test.shape[0], -1) / 255
y_train = np_utils.to_categorical(y_train) # convert int to vector
y_test = np_utils.to_categorical(y_test) # convert int to vector
# build model
model = Sequential([
Dense(output_dim=32, input_dim=784),
Activation('relu'),
Dense(10),
Activation('softmax')
])
rmsporp = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(
optimizer=rmsporp,
loss='categorical_crossentropy',
metrics=['accuracy'],
)
print('Training ... ')
model.fit(X_train, y_train, nb_epoch=100, batch_size=32)
print('Testing ... ')
loss, accuracy = model.evaluate(X_test, y_test)
print('test loss: ', loss)
print('test accuracy: ', accuracy)