金子邦彦研究室人工知能分類を行うニューラルネットワークの学習と利用(TensorFlow データセット,Python を使用)(Windows 上)TensorFlow のパイプラインを用いたFashion MNIST データセットによる学習と分類(TensorFlow データセット,TensorFlow,Python を使用)(Windows 上)(Google Colaboratroy へのリンク有り)

TensorFlow のパイプラインを用いたFashion MNIST データセットによる学習と分類(TensorFlow データセット,TensorFlow,Python を使用)(Windows 上)(Google Colaboratroy へのリンク有り)

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

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

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

目次

  1. Google Colab へのリンク
  2. 前準備
  3. MNIST データセットのロード
  4. MNIST データセットの確認
  5. Keras を用いたニューラルネットワークの作成
  6. ニューラルネットワークの学習と検証

サイト内の関連ページ

関連する外部ページ

1. Google Colab へのリンク

Google Colaboratory のページ:

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

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

2. 前準備

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

サイト内の関連ページ

関連する外部ページ

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

TensorFlow,Keras のインストール

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

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

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

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

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

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

    python -m pip install -U tensorflow_datasets
    

    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
      

    3. 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
      
    3. パッケージのインポートと,MNIST データセットのロード
      from __future__ import absolute_import, division, print_function, unicode_literals
      import tensorflow as tf
      from tensorflow.keras import backend as K 
      K.clear_session()
      import numpy as np
      import tensorflow_datasets as tfds
      
      %matplotlib inline
      import matplotlib.pyplot as plt
      import warnings
      warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
      
      mnist, mnist_info = tfds.load('mnist', with_info = True, shuffle_files=True, as_supervised=True)
      

      [image]

    4. 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]

    5. 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つであることが分かる.

      • ds_train の先頭要素: 形状 (28, 28, 1) と形状 () のタップル
      • ds_test の先頭要素: 形状 (28, 28, 1) と形状 () のタップル
      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
      
      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()
      

      [image]

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

    7. モデルのコンパイル

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

      m.compile(
          optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
          loss='sparse_categorical_crossentropy',
          metrics=['sparse_categorical_crossentropy', 'accuracy']
      )
      

      [image]

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

    1. ニューラルネットワークの学習を行う

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

      EPOCHS = 20
      history = m.fit(ds_train, validation_data=ds_test, verbose=2, epochs=EPOCHS)
      

      [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/

      • 学習時と検証時の,損失の違い
        acc = history.history['accuracy']
        val_acc = history.history['val_accuracy']
        loss = history.history['loss']
        val_loss = history.history['val_loss']
        
        epochs = range(1, len(acc) + 1)
        
        # "bo" は青いドット
        plt.plot(epochs, loss, 'bo', label='Training loss')
        # ”b" は青い実線
        plt.plot(epochs, val_loss, 'b', label='Validation loss')
        plt.title('Training and validation loss')
        plt.xlabel('Epochs')
        plt.ylabel('Loss')
        plt.legend()
        
        plt.show()
        

        [image]
      • 学習時と検証時の,精度の違い
        acc = history.history['accuracy']
        val_acc = history.history['val_accuracy']
        loss = history.history['loss']
        val_loss = history.history['val_loss']
        
        plt.clf()   # 図のクリア
        plt.plot(epochs, acc, 'bo', label='Training acc')
        plt.plot(epochs, val_acc, 'b', label='Validation acc')
        plt.title('Training and validation accuracy')
        plt.xlabel('Epochs')
        plt.ylabel('Accuracy')
        plt.legend()
        
        plt.show()
        

        [image]