金子邦彦研究室人工知能Windows で動く人工知能関係 Pythonアプリケーション,オープンソースソフトウエア)TensorFlow のパイプラインを用いたMNIST データセットによる学習と分類(TensorFlow データセット,TensorFlow,Python を使用)(Windows 上,Google Colaboratroy の両方を記載)

TensorFlow のパイプラインを用いたMNIST データセットによる学習と分類(TensorFlow データセット,TensorFlow,Python を使用)(Windows 上,Google Colaboratroy の両方を記載)

ニューラルネットワークによるデータの分類を行う. ここでの分類は,データから,そのラベル(クラス名)を求めるもの. 分類のために,教師データを用いてニューラルネットワークの学習を行う.

このページでは,TensorFlow データセットの中の MNIST データセットを用いて,TensorFlow での学習を行うととも に,データの分類も行う.

データセットの利用条件は利用者で確認すること. このページの内容は, https://www.tensorflow.org/datasets/keras_example による.

目次

  1. Google Colaboratory での実行
  2. Windows での実行
  3. MNIST データセットのロード
  4. MNIST データセットの確認
  5. Keras を用いたニューラルネットワークの作成
  6. ニューラルネットワークの学習と検証

サイト内の関連ページ

関連する外部ページ

1. Google Colaboratory での実行

Google Colaboratory のページ:

次のリンクをクリックすると,Google Colaboratoryノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコード等を編集したり再実行したりができる.編集した場合でも,他の人に影響が出たりということはない.そして,編集後のものを,各自の Google ドライブ内に保存することもできる.

https://colab.research.google.com/drive/1QvEEivjsqTK3s1QV5yn-COo-HavIlO2U?usp=sharing

2. Windows での実行

Python のインストール(Windows 上)

サイト内の関連ページ

関連する外部ページ

Python の公式ページ: https://www.python.org/

TensorFlow,Keras,TensorFlow データセットのインストール

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. 次のコマンドを実行.

    python -m pip uninstall -y tensorflow tensorflow-cpu tensorflow-gpu tensorflow-intel tensorflow-text tensorflow-estimator tf-models-official tf_slim tensorflow_datasets tensorflow-hub keras keras-tuner keras-visualizer
    python -m pip install -U tensorflow==2.10.1 tf_slim tensorflow_datasets==4.8.3 tensorflow-hub keras keras-tuner keras-visualizer
    

サイト内の関連ページ

Windows での TensorFlowKeras のインストール: 別ページ »で説明

(このページで,Build Tools for Visual Studio 2022,NVIDIA ドライバ, NVIDIA CUDA ツールキットNVIDIA cuDNNのインストールも説明している.)

Graphviz のインストール

Windows での Graphviz のインストール: 別ページ »で説明している.

numpy,matplotlib, seaborn, scikit-learn, pandas, pydot のインストール

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. 次のコマンドを実行する.

    python -m pip install -U numpy matplotlib seaborn scikit-learn pandas pydot
    

MNIST データセットのロード

【Python の利用】

Python は,次のコマンドで起動できる.

Python 開発環境(Jupyter Qt Console, Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, Spyder, PyCharm, PyScripterなど)も便利である.

Python のまとめ: 別ページ »にまとめ

TensorFlow の MNIST データセット

  1. Windows で,コマンドプロンプトを実行.
  2. jupyter qtconsole の起動

    これ以降の操作は,jupyter qtconsole で行う.

    jupyter qtconsole
    

    Python 開発環境として,Python コンソール(Jupyter Qt Console), Jupyter ノートブック (Jupyter Notebook), Jupyter Lab, Nteract, spyder のインストール

    Windows で,コマンドプロンプト管理者として実行し,次のコマンドを実行する.

    python -m pip install -U pip setuptools jupyterlab jupyter jupyter-console jupytext PyQt5 nteract_on_jupyter spyder
    
  3. パッケージのインポート,TensorFlow のバージョン確認など
    from __future__ import absolute_import, division, print_function, unicode_literals
    import tensorflow as tf
    from tensorflow.keras import layers
    from tensorflow.keras import backend as K 
    K.clear_session()
    import numpy as np
    import tensorflow_datasets as tfds
    from tensorflow.keras.preprocessing import image
    
    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    
    # TensorFlow のバージョン
    print(tf.__version__)
    
    # GPU を利用しているか
    gpus = tf.config.list_physical_devices(device_type = 'GPU')
    if len(gpus)>0:
        print(f">> GPU detected. {gpus[0].name}")
        tf.config.experimental.set_memory_growth(gpus[0], True)
    

    [image]
  4. MNIST データセットのロード
    mnist, mnist_info = tfds.load('mnist', with_info = True, shuffle_files=True, as_supervised=True)
    

    [image]

MNIST データセットの確認

  1. データセットの中の画像を表示
    fig1 = tfds.show_examples(mnist['train'], mnist_info)
    fig2 = tfds.show_examples(mnist['test'], mnist_info)
    

    [image]
  2. データセットの情報を表示
    print(mnist_info)
    print(mnist_info.features["label"].num_classes)
    print(mnist_info.features["label"].names)
    

    [image]

Keras を用いたニューラルネットワークの作成

  1. データセットの生成

    ds_train: サイズ 28 × 28 の 60000枚の濃淡画像,60000枚の濃淡画像それぞれのラベル(0 から 9 のどれか)

    ds_test: サイズ 28 × 28 の 60000枚の濃淡画像,60000枚の濃淡画像それぞれのラベル(0 から 9 のどれか)

    ds_train, ds_test = mnist['train'], mnist['test']
    

    [image]
  2. 確認のため,データセットの先頭要素を確認してみる

    次により,データセット 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)
    

    [image]
    for i in ds_test.take(1):
        print(type(i))
        for j in range(len(i)):
            print(type(i[j]))
            print(i[j].shape)
    

    [image]
  3. 確認のため,データセットの先頭要素を表示してみる

    「tf.reshape(image, [-1])」では,テンソルをフラット化している.これは,表示を見やすくするため.

    タップルの 0 番目は数値データ, タップルの 1 番目は分類結果のラベル(クラス名)である.

    for image, label in ds_train.take(1):
        print(tf.reshape(image, [-1]))
        print(label)
    

    [image]
    for image, label in ds_test.take(1):
        print(tf.reshape(image, [-1]))
        print(label)
    

    [image]
  4. トレーニングパイプライン

    値は,もともと 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)
    

    [image]
  5. 評価パイプライン

    値は,もともと 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)
    

    [image]
  6. モデルの作成と確認
    • ニューラルネットワークの種類: 層構造 (Sequential Model)
    • ニューラルネットワークの構成
      • Flatten の層: 画像(28かける28)を 1次元の配列に変換する.
      • 1層目: Dense全結合),ニューロン(ユニット)の個数: 64
      • 2層目: Dense全結合),ニューロン(ユニット)の個数: 10
      • 2層目のニューロン(ユニット)の種類: softmax
      • 1番目のDense の層と2番目のDense の層の間の結合については,ドロップアウトを行う.
    num_classes = 10
    input_shape = (28, 28)
    m = tf.keras.Sequential(
        [
            tf.keras.Input(shape=input_shape),
            layers.Flatten(),
            layers.Dense(units=64, activation='relu'),
            layers.Dropout(0.5),
            layers.Dense(units=num_classes, activation='softmax')
        ]
    )
    print(m.summary())
    

    [image]

    L2 正則化を行いたいときは 「 tf.keras.layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.001)),」のようにする.

ニューラルネットワークの学習と検証

  1. コンパイル,学習を行う

    オプティマイザ損失関数メトリクスを設定する.

    ニューラルネットワーク学習は fit メソッドにより行う. 教師データを使用する. 教師データを投入する.

    EPOCHS = 20
    m.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    history = m.fit(ds_train,
                        batch_size=128, 
                        epochs=EPOCHS,
                        validation_data=ds_test,
                        verbose=1)
    

    [image]
    (以下省略)
  2. ディープラーニングによるデータの分類

    ds_test を分類してみる.

    print(m.predict(ds_test))
    

    [image]

    それぞれの数値の中で、一番大きいものはどれか?

    m.predict(ds_test).argmax(axis=1)
    

    [image]

    ds_test 内にある正解のラベル(クラス名)を表示する(上の結果と比べるため)

    for i in ds_test:
        print(i[1])
    

    [image]
  3. 学習曲線の確認

    過学習や学習不足について確認.

    import pandas as pd
    hist = pd.DataFrame(history.history)
    hist['epoch'] = history.epoch
    print(hist)
    

    [image]

    関連する外部ページ】 訓練の履歴の可視化については,https://keras.io/ja/visualization/