トップページデータベース研究人工知能による分類 (classification) ▶ データの分類,モデルの作成と学習と評価(TensorFlow,Keras,TensorFlow データセットのMNIST データセットを使用)(Google Colab 上もしくはパソコン上)

データの分類,モデルの作成と学習と評価(TensorFlow,Keras,TensorFlow データセットのMNIST データセットを使用)(Google Colab 上もしくはパソコン上)

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

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

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

サイト内の関連ページ

参考 Web ページ

Google Colab へのリンク

このページの内容は,Google Colab でも実行できる.

そのために,次の URL で,Google Colab のノートブックを準備している.

次のリンクをクリックすると,Google Colab のノートブックが開く. そして,Google アカウントでログインすると,Google Colab のノートブック内のコードを実行することができる.Google Colab のノートブックは書き換えて使うこともできる.このとき,書き換え後のものを,各自の Google ドライブ内に保存することもできる.

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

前準備

Google Colab を使うか,パソコンを使う.それぞれの場合の前準備を説明する.

(1) Google Colab を使う場合

  1. Google Colab のWebページを開く

    https://colab.research.google.com

    Google Colab はオンラインの Python 開発環境. 使用するには Google アカウントが必要

  2. ファイル」で、「ノートブックを新規作成」を選ぶ

  3. Google アカウントでのログインが求められたときはログインする

(2) パソコンを使う場合

(NVIDIA GPU を使うとき)TensorFlow のバージョンを確認の上,NIDIA CUDA ツールキットとNIDIA cuDNN のバージョンを確認

TensorFlow を使う場合は,必要となる NVIDIA CUDA ツールキット,NVIDIA cuDNN のバージョン確認

TensorFlow は,そのバージョンによって,必要となるNVIDIA CUDA ツールキット,NVIDIA cuDNN のバージョンが違う(最新の NVIDIA CUDA ツールキット,NVIDIA cuDNN で動くというわけでない). そのことは,https://www.tensorflow.org/install/gpu で確認できる.

そこで, まずは,使用したい TensorFlow のバージョンを確認し,それにより, NVIDIA CUDA ツールキット,NVIDIA cuDNN を確認する.

NVIDIA CUDA ツールキットのバージョン:

指定されているバージョンより高いものは使わない. その根拠は次のページ. URL: https://www.tensorflow.org/install/source#common_installation_problems

NVIDIA cuDNN のバージョン:

その根拠は次のページ. URL: https://www.tensorflow.org/install/source#common_installation_problems

(NVIDIA GPU を使うとき)NVIDIA グラフィックスドライバ,NVIDIA CUDA ツールキット 11.0 ,NVIDIA cuDNN 8.0.5 のインストール

GPU とは,グラフィックス・プロセッシング・ユニットの略で、コンピュータグラフィックス関連の機能,乗算や加算の並列処理の機能などがある.

NVIDIA CUDA は,NVIDIA社が提供している GPU 用のプラットフォームである.

インストール手順の説明

関連 Web ページ

Python のインストール,pip と setuptools の更新,Python 開発環境(JupyterLab, spyder, nteract)のインストール,TensorFlow などのインストール

インストール手順の説明

TensorFlow の MNIST データセット

Python プログラムを動かすために, pythonpython3などのコマンドを使う. あるいは, 開発環境や Python コンソール(Jupyter Qt ConsolespyderPyCharmPyScripter など)の利用も便利である.

TensorFlow の MNIST データセット

  1. パッケージのインポートと,MNIST データセットのロード
    import tensorflow.compat.v2 as tf
    import tensorflow_datasets as tfds
    tf.enable_v2_behavior()
    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)
    

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

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

データセットの生成,モデルの作成と学習と評価(学習では TensorFlow データセットのMNIST データセットを使用)

Python プログラムを動かすために, pythonpython3などのコマンドを使う. あるいは, 開発環境や Python コンソール(Jupyter Qt ConsolespyderPyCharmPyScripter など)の利用も便利である.

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

  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)
    

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

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

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

  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)
    

  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)
    

  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.05),
        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)),」のようにする.

  7. モデルのコンパイル

    最適化器(オプティマイザ) と損失関数メトリクスを設定する.

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

  8. 学習(訓練)

    学習(訓練)は fit メソッドにより行う. 学習データを投入する.

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


    (以下省略)
  9. ニューラルネットワークによるデータの分類

    ds_test を分類してみる.

    print(m.predict(ds_test))
    

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

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

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

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

  10. 学習曲線の確認

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

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

  11. 学習曲線のプロット

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

    https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ja で公開されているプログラムを使用

    import matplotlib.pyplot as plt
    %matplotlib inline
    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')