0
1

More than 1 year has passed since last update.

実際にニューラルネットワークを組んでみた

Posted at

もくじ

まずは、コード
mnistデータの準備
モデル構築
学習
まとめ

まずは、コード

import datetime
import os

#keras関係のインポート
from keras import Sequential
from keras.callbacks import TensorBoard
from keras.datasets import mnist
from keras.layers import Flatten, Dense, Dropout, Activation
from keras.utils import np_utils


'''
mnistデータの準備
'''
# mnistデータのロード
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255

# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)



'''
モデル構築
'''
# 最適化関数を定義
optimizer = 'rmsprop'
# 損失関数関数を定義
loss = 'categorical_crossentropy'

# モデルを定義
model = Sequential()

# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))

# 32次元の全結合層を定義
model.add(Dense(32))

# 16次元の全結合層を定義
model.add(Dense(16))

# ドロップアウト層を定義
model.add(Dropout(0.15))

# クラス数と同じ次元の全結合層を定義
model.add(Dense(y_train.shape[1]))

# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))


# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])



'''
TensorBoardの定義
'''
# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
    os.mkdir('logs')

# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)



'''
学習
'''
# エポック数を定義
epochs = 300
# バッチ数を定義
batch_size = 128

# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
          callbacks=[tensorboard_callback])

上から順番に説明していく。

mnistデータの準備

# 配列のデータ型を変更
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

・配列のデータ型を「float32」にすることで少数を格納できるようにした。

# 配列内の値を0~1の間に最適化
x_train /= 255
x_test /= 255

・配列内の値を255で割ることで値を0~1.0の間に正規化している。
  - 0~1にすることで比較的少ない計算量で学習できるようにしている。
  - 様々な値が混在しているものをある程度一定の値にし、学習の効率化を図っている。

# ラベルの値をone-hotに変換
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

・ラベルデータ(教師データ)をone-hotへ変換
  - mnistでは画像が「0~9」まであり、それぞれラベルデータとして”0~9”の値が付けられている。
  - one-hotとは、上記のラベルデータを”1”なら[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]というような形にしたもののことを言う。

モデル構築

# モデルを定義
model = Sequential()

・model=Sequential()で順伝播型のモデルであると定義。
・上記で定義されたモデルに対して「model.add()」で層を追加。

Flatten()

# 画像を一次元配列に変換する層を定義
model.add(Flatten(input_shape=x_train.shape[1:]))

  - 様々な次元のものを一列の配列に変換。

Dense()

# 32次元の全結合層を定義
model.add(Dense(32))

  - 全結合層の定義。
  - すべての層からの出力を受け取り計算を行っている。

Dropout()

# ドロップアウト層を定義
model.add(Dropout(0.15))

  - ここまで使われてきた層の中で使わない割合を定義。
  - 主に過学習を防ぐために使われる。

Activation()

# 活性化関数として"softmax"を使用
model.add(Activation('softmax'))

  - 活性化関数の定義。
  - 今回は「SoftMax」を使うことで出力結果を割合に変更している。

model.compile()

# モデルを構築
model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])

  - ここまで定義してきたモデルを構築。
  - 構築する際に損失関数と最適化関数を決める。
  - 今回は損失関数として「交差エントロピー関数」を最適化関数として「RMSProp」を使用した。

TensorBoardの定義

# "logs"という名前のディレクトリが存在しなければ作成
if not os.path.exists('logs'):
    os.mkdir('logs')

# 結果を保存するためのフォルダを日付と時間で作成
tensorboard_dir = r'./logs/{}'.format(datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
# TensorBoardを定義
tensorboard_callback = TensorBoard(log_dir=tensorboard_dir)

・TensorBoardとは、学習の様子や結果を見るための便利なツール。

学習

epochs

# エポック数を定義
epochs = 300

  - 学習の回数を定義。
  - Kerasではepochs=イテレーターではないので注意。

batch_size

# バッチ数を定義
batch_size = 128

  - イテレーターの数で一気に何枚の画像を使って学習するかを定義。
  - Kerasでは「入力された画像の枚数/batch_size」でイテレーターの数を求めている。

model.fit()

# 学習を開始
model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, y_test), shuffle=True,
          callbacks=[tensorboard_callback])

  - これまで定義、構築してきたモデルデータに学習データとラベルデータを渡し学習を開始。

結果例

tensorboard.png

こんな風になれば良き。

まとめ

みんな!ニューラルネットワーク…組めたよね?

ね?

組めたよね?(゜▽゜)

記事作成:N&Y

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1