トップページ情報工学を学ぶニューラルネットワークの学習(TensorFlow データセットを使用)TensorFlow のパイプラインを用いた分類を行うニューラルネットワークの学習(TensorFlow データセットのFashion MNIST データセットによる学習)(Google Colaboratroy へのリンク有り)

TensorFlow のパイプラインを用いた分類を行うニューラルネットワークの学習(TensorFlow データセットのFashion MNIST データセットによる学習)(Google Colaboratroy へのリンク有り)

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

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

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

目次

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

サイト内の関連ページ

参考 Web ページ

1. Google Colab へのリンク

Google Colaboratory のページ:

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

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

2. 前準備

Python の準備

Python のまとめ: 別ページにまとめている.

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

TensorFlow,tensorflow_datasets,numpy,matplotlib のインストール

3. MNIST データセットのロード

Python プログラムの実行

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

Python のまとめ: 別ページにまとめている.

TensorFlow の MNIST データセット

  1. パッケージのインポートと,MNIST データセットのロード
    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)
    

    [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 を用いたニューラルネットワークの作成

Python プログラムの実行

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

Python のまとめ: 別ページにまとめている.

  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
    
    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,
                        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]
  4. 学習曲線のプロット

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

    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')
    

    [image]
    plot_history([('history', history)], key='accuracy')
    

    [image]