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

CIFAR-10 データセットによる学習と分類(TensorFlow データセット,TensorFlow,Python を使用)(Windows 上)(Google Colaboratroy へのリンク有り)

CIFAR-10 データセット下図)の画像分類を行う. 所定の 10種類に画像分類を行うものである. その 10種類は,airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck である.

[image]

ニューラルネットワークの作成,学習,データの分類を行う. TensorFlow データセットCIFAR-10 データセットを使用する.

目次

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

説明資料: [パワーポイント]

サイト内の関連ページ

外部ページへのリンク

1. Google Colab へのリンク

Google Colaboratory のページ:

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

https://colab.research.google.com/drive/1isb39RL7JtTdHaLQfp3cC8vMVd7OXbiV?usp=sharing

2. 前準備

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

Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール: 別ページ »で説明

サイト内の関連ページ

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

関連する外部ページ

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. CIFAR-10 データセットのロード

    【Python の利用】

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

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

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

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

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

      jupyter qtconsole
      
    3. パッケージのインポート,TensorFlow のバージョン確認など
      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
      from tensorflow.keras.preprocessing import image
      
      %matplotlib inline
      import matplotlib.pyplot as plt
      import warnings
      warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
      

      [image]
    4. CIFAR-10 データセットのロード
      • x_train: サイズ 32 ×32 の 60000枚の濃淡画像
      • y_train: 50000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか)
      • x_test: サイズ 32 ×32 の 10000枚の濃淡画像
      • y_test: 10000枚の濃淡画像それぞれの,種類番号(0 から 9 のどれか)
      tensorflow_datasets の loadで, 「batch_size = -1」を指定して,一括読み込みを行っている.
      cifar10, cifar10_metadata = tfds.load('cifar10', with_info = True, shuffle_files=True, as_supervised=True, batch_size = -1)
      x_train, y_train, x_test, y_test = cifar10['train'][0], cifar10['train'][1], cifar10['test'][0], cifar10['test'][1]
      print(cifar10_metadata)
      

      [image]

    4. CIFAR-10 データセットの確認

    1. データセットの中の画像を表示

      MatplotLib を用いて,0 番目の画像を表示する

      NUM = 0
      plt.figure()
      plt.imshow(x_train[NUM])
      plt.colorbar()
      plt.gca().grid(False)
      plt.show()
      

      [image]
    2. 型と形と最大値と最小値の確認
      print(type(x_train), x_train.shape, np.max(x_train), np.min(x_train))
      print(type(x_test), x_test.shape, np.max(x_test), np.min(x_test))
      print(type(y_train), y_train.shape, np.max(y_train), np.min(y_train))
      print(type(y_test), y_test.shape, np.max(y_test), np.min(y_test))
      

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

      [image]
    4. 主成分分析の結果である主成分スコアのプロット

      x_train, x_test は主成分分析で2次元にマッピング, y_train, y_test は色.

      import pandas as pd
      import seaborn as sns
      sns.set()
      import sklearn.decomposition
      # 主成分分析
      def prin(A, n):
          pca = sklearn.decomposition.PCA(n_components=n)
          return pca.fit_transform(A)
      
      # 主成分分析で2つの成分を得る
      def prin2(A):
          return prin(A, 2)
      
      # M の最初の2列を,b で色を付けてプロット
      def scatter_plot(M, b, alpha):
          a12 = pd.DataFrame( M[:,0:2], columns=['a1', 'a2'] )
          a12['target'] = b
          sns.scatterplot(x='a1', y='a2', hue='target', data=a12, palette=sns.color_palette("hls", np.max(b) + 1), legend="full", alpha=alpha)
      
      # 主成分分析プロット
      def pcaplot(A, b, alpha):
          scatter_plot(prin2(A), b, alpha)
      
      pcaplot(np.reshape(x_train, (x_train.shape[0], -1)), y_train, 0.1)
      

      [image]
      pcaplot(np.reshape(x_test, (x_test.shape[0], -1)), y_test, 0.1)
      

      [image]

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

    1. x_train, x_test, y_train, y_test の numpy ndarray への変換と,値の範囲の調整(値の範囲が 0 〜 255 であるのを,0 〜 1 に調整)
      x_train = x_train.numpy().astype("float32") / 255.0
      x_test = x_test.numpy().astype("float32") / 255.0
      y_train = y_train.numpy()
      y_test = y_test.numpy()
      print(type(x_train), x_train.shape, np.max(x_train), np.min(x_train))
      print(type(x_test), x_test.shape, np.max(x_test), np.min(x_test))
      print(type(y_train), y_train.shape, np.max(y_train), np.min(y_train))
      print(type(y_test), y_test.shape, np.max(y_test), np.min(y_test))
      

      [image]
    2. データの確認表示

      MatplotLib を用いて,複数の画像を並べて表示する.

      plt.style.use('default')
      plt.figure(figsize=(10,10))
      for i in range(25):
        plt.subplot(5,5,i+1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)
        plt.imshow(x_train[i], cmap=plt.cm.binary)
        plt.xlabel(y_train[i])
      
      plt.show()
      

      [image]
    3. ニューラルネットワークの作成と確認とコンパイル

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

      • Flatten の層: 画像(32 かける 32 かける 3)を 1次元の配列に変換する.
      • 1層目: Dense全結合),ニューロン(ユニット)の個数: 128
      • 2層目: Dense全結合),ニューロン(ユニット)の個数: 10
      • 2層目のニューロン(ユニット)の種類: softmax
      • 1番目のDense の層と2番目のDense の層の間の結合については,ドロップアウトを行う.

      ADAM を使う場合のプログラム例

      NUM_CLASSES = 10
      
      m = tf.keras.Sequential()
      m.add(tf.keras.layers.Flatten(input_shape=(32, 32, 3)))
      m.add(tf.keras.layers.Dense(units=1024, activation='relu'))
      m.add(tf.keras.layers.Dropout(rate=0.5))
      m.add(tf.keras.layers.Dense(units=NUM_CLASSES, activation='softmax'))
      m.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
                    loss='sparse_categorical_crossentropy',
                    metrics=['accuracy'])
      

      [image]

      SGD を使う場合のプログラム例

      NUM_CLASSES = 10
      
      m = tf.keras.Sequential()
      m.add(tf.keras.layers.Flatten(input_shape=(32, 32, 3)))
      m.add(tf.keras.layers.Dense(units=1024, activation='relu'))
      m.add(tf.keras.layers.Dropout(rate=0.5))
      m.add(tf.keras.layers.Dense(units=NUM_CLASSES, activation='softmax'))
      m.compile(optimizer=tf.keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True),
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])
      

      [image]
    4. ニューラルネットワークの確認表示
      print(m.summary())
      

      [image]
    5. モデルのビジュアライズ

      Keras のモデルのビジュアライズについては: https://keras.io/ja/visualization/

      ここでの表示で,エラーメッセージが出る場合でも,モデル自体は問題なくできていると考えられる.続行する

      from tensorflow.keras.utils import plot_model
      import pydot
      plot_model(m)
      

      [image]

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

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

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

      EPOCHS = 50
      history = m.fit(x_train, y_train, validation_data=(x_test, y_test), verbose=2, epochs=EPOCHS)
      

      [image]
    2. ディープラーニングによるデータの分類

      x_test を分類してみる.

      print(m.predict(x_test))
      

      [image]

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

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

      [image]

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

      print(y_test[1])
      

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

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

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

      [image]
    4. 学習曲線のプロット

      外部ページへのリンク】 訓練の履歴の可視化については,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]