keras 入門(2) : 簡単なNNによる分類 [keras]

keras 入門(2) : 簡単なNNによる分類 [keras]


donald chi / 2018-03-04 14:54

音声ファイル作成中...
Audio: Visited: 871


背景

データ解析の会社に入って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)

結果


まとめ


0

0

Share with: Facebook Twitter Google+ LinkedIn Wechat Email Print

Comments: 0 件

There is no Comment now.

Add Comment

Name:
Email:
Comment: