ニューラルネットワークによるデータの分類を行う. ここでの分類は,データから,そのラベル(クラス名)を求めるもの. 分類のために,教師データを用いてニューラルネットワークの学習を行う.
このページでは,TensorFlow データセットの中の MNIST データセットを用いて,TensorFlow での学習を行うととも に,データの分類も行う.
データセットの利用条件は利用者で確認すること. このページの内容は, https://www.tensorflow.org/datasets/keras_example による.
【サイト内の関連ページ】
参考 Web ページ
このページの内容は,Google Colaboratory でも実行できる.
そのために,次の URL で,Google Colaboratory のノートブックを準備している.
次のリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコードを実行することができる.Google Colaboratory のノートブックは書き換えて使うこともできる.このとき,書き換え後のものを,各自の Google ドライブ内に保存することもできる.
https://colab.research.google.com/drive/1QvEEivjsqTK3s1QV5yn-COo-HavIlO2U?usp=sharing
自分で,Google Colaboratory のノートブックを新規作成する場合(上のリンクを使わない)のため,手順を説明する.
パソコンを使う場合は,下に「前準備(パソコンを使う場合)」で説明している.
https://colab.research.google.com
Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要
システム Python を使うことができる(その場合,Python のインストールは行わない)
システム Python を用いるときは,pip, setuptools の更新は次のコマンドで行う.
sudo apt -y update sudo apt -y install python3-pip python3-setuptools
Ubuntu で,システム Python 以外の Python をインストールしたい場合は pyenv が便利である: 別ページで説明している.
Python の URL: http://www.python.org/
【Python, pip の使い方】
Python, pip は,次のコマンドで起動できる.
【Python 開発環境のインストール】
JupyterLab, spyder, nteract (Python 開発環境) のインストールは, Windows でコマンドプロンプトを管理者として実行し, 次のコマンドを実行.
python -m pip install -U pip setuptools jupyterlab jupyter jupyter-console jupytext nteract_on_jupyter spyder
詳しくは,: 別ページで説明している.
JupyterLab, spyder, nteract (Python 開発環境) のインストール: : 別ページで説明している.
Windows での pip の実行では,コマンドプロンプトを管理者として実行することにする。
python -m pip uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow_datasets tensorflow-hub keras python -m pip install -U tensorflow tensorflow_datasets numpy matplotlib
Windows でのインストール詳細(NVIDIA グラフィックスドライバ,NVIDIA CUDA ツールキット,NVIDIA cuDNN, TensorFlow 関連ソフトウエアを含む): 別ページで説明している.
端末で,次のコマンドを実行.
sudo pip3 uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow_datasets tensorflow-hub keras sudo pip3 uninstall -y six wheel astunparse tensorflow-estimator numpy keras-preprocessing absl-py wrapt gast flatbuffers grpcio opt-einsum protobuf termcolor typing-extensions google-pasta h5py tensorboard-plugin-wit markdown werkzeug requests-oauthlib rsa cachetools google-auth google-auth-oauthlib tensorboard tensorflow sudo apt -y install python3-six python3-wheel python3-numpy python3-grpcio python3-protobuf python3-termcolor python3-typing-extensions python3-h5py python3-markdown python3-werkzeug python3-requests-oauthlib python3-rsa python3-cachetools python3-google-auth sudo apt -y install python3-numpy python3-matplotlib sudo pip3 install -U tensorflow tensorflow_datasets
Ubuntu でのインストール詳細(NVIDIA グラフィックスドライバ,NVIDIA CUDA ツールキット,NVIDIA cuDNN, TensorFlow 関連ソフトウエアを含む): 別ページで説明している.
Python プログラムを動かす
開発環境や Python コンソール(Jupyter Qt Console,Spyder,PyCharm,PyScripter など)の利用も便利である.
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
print(tf.__version__)
import numpy as np
import tensorflow_datasets as tfds
%matplotlib inline
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') # Suppress Matplotlib warnings
from tensorflow.keras import backend as K
K.clear_session()
mnist, mnist_info = tfds.load('mnist', with_info = True, shuffle_files=True, as_supervised=True)
fig1 = tfds.show_examples(mnist['train'], mnist_info) fig2 = tfds.show_examples(mnist['test'], mnist_info)
print(mnist_info) print(mnist_info.features["label"].num_classes) print(mnist_info.features["label"].names)
Python プログラムを動かす
開発環境や Python コンソール(Jupyter Qt Console,Spyder,PyCharm,PyScripter など)の利用も便利である.
ds_train: サイズ 28 × 28 の 60000枚の濃淡画像,60000枚の濃淡画像それぞれのラベル(0 から 9 のどれか)
ds_test: サイズ 28 × 28 の 60000枚の濃淡画像,60000枚の濃淡画像それぞれのラベル(0 から 9 のどれか)
ds_train, ds_test = mnist['train'], mnist['test']
次により,データセット ds_train, ds_test の先頭要素を確認.
次のプログラムでは,ds_train, ds_test の先頭要素が,i に得られる. i がタップルであること, そして,i は TensorFlow のテンソルが並んだタップルであることをを確認する.
実行結果からは,次を確認,i の長さは 2,そして,i の中身が 2つであることが分かる.
for i in ds_train.take(1):
print(type(i))
for j in range(len(i)):
print(type(i[j]))
print(i[j].shape)
for i in ds_test.take(1):
print(type(i))
for j in range(len(i)):
print(type(i[j]))
print(i[j].shape)
「tf.reshape(image, [-1])」では,テンソルをフラット化している.これは,表示を見やすくするため.
タップルの 0 番目は数値データ, タップルの 1 番目は分類結果のラベル(クラス名)である.
for image, label in ds_train.take(1):
print(tf.reshape(image, [-1]))
print(label)
for image, label in ds_test.take(1):
print(tf.reshape(image, [-1]))
print(label)
値は,もともと int で 0 から 255 の範囲であるのを, float32 で 0 から 1 の範囲になるように前処理を行う.そして, データセットのシャッフルとバッチも行う.
def normalize_img(image, label): """Normalizes images: `uint8` -> `float32`.""" return tf.cast(image, tf.float32) / 255., label SHUFFLE_BUFFER_SIZE = 100000 BATCH_SIZE=128 AUTOTUNE = tf.data.experimental.AUTOTUNE ds_train = ds_train.map(normalize_img, num_parallel_calls=AUTOTUNE) ds_train = ds_train.cache().shuffle(buffer_size=SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE).prefetch(buffer_size=AUTOTUNE)
値は,もともと int で 0 から 255 の範囲であるのを, float32 で 0 から 1 の範囲になるように前処理を行う.そして, データセットのバッチも行う.
ds_test = ds_test.map(normalize_img, num_parallel_calls=AUTOTUNE) ds_test = ds_test.cache().batch(BATCH_SIZE).prefetch(buffer_size=AUTOTUNE)
NUM_CLASSES = 10
m = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(units=64, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(units=NUM_CLASSES, activation='softmax')
])
m.summary()
L2 正則化を行いたいときは 「 tf.keras.layers.Dense(128, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001)),」のようにする.
m.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='sparse_categorical_crossentropy',
metrics=['sparse_categorical_crossentropy', 'accuracy']
)
ニューラルネットワークの学習は fit メソッドにより行う. 教師データを使用する. 教師データを投入する.
EPOCHS = 20
history = m.fit(ds_train,
epochs=EPOCHS,
validation_data=ds_test,
verbose=1)
ds_test を分類してみる.
print(m.predict(ds_test))
それぞれの数値の中で、一番大きいものはどれか?
m.predict(ds_test).argmax(axis=1)
ds_test 内にある正解のラベル(クラス名)を表示する(上の結果と比べるため)
for i in ds_test:
print(i[1])
過学習や学習不足について確認.
import pandas as pd hist = pd.DataFrame(history.history) hist['epoch'] = history.epoch print(hist)
過学習や学習不足について確認.
https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ja で公開されているプログラムを使用
%matplotlib inline
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') # Suppress Matplotlib warnings
def plot_history(histories, key='binary_crossentropy'):
plt.figure(figsize=(16,10))
for name, history in histories:
val = plt.plot(history.epoch, history.history['val_'+key],
'--', label=name.title()+' Val')
plt.plot(history.epoch, history.history[key], color=val[0].get_color(),
label=name.title()+' Train')
plt.xlabel('Epochs')
plt.ylabel(key.replace('_',' ').title())
plt.legend()
plt.xlim([0,max(history.epoch)])
plot_history([('history', history)], key='sparse_categorical_crossentropy')
plot_history([('history', history)], key='accuracy')