トップページ情報工学を学ぶCIFAR 10 の画像分類を行う畳み込みニューラルネットワーク (CNN) の学習,転移学習CNN による画像分類,モデルの作成と学習と検証(MobileNetV2,ResNet50,DenseNet 121,DenseNet 169,NASNet,TensorFlow データセットのCIFAR 10 データセットを使用)(Google Colab 上もしくはパソコン上)

CNN による画像分類,モデルの作成と学習と検証(MobileNetV2,ResNet50,DenseNet 121,DenseNet 169,NASNet,TensorFlow データセットのCIFAR 10 データセットを使用)(Google Colab 上もしくはパソコン上)

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

[image]

CNN の作成,学習,画像分類を行う. TensorFlow データセットCIFAR 10 データセットを使用する. CNN としては,次のものを使用する.

目次

  1. Google Colab へのリンク
  2. 前準備
  3. CIFAR 10 データセットのロード
  4. CIFAR 10 データセットの確認
  5. ニューラルネットワークの作成(MobileNetV2 を使用)
  6. ニューラルネットワークの学習(MobileNetV2 を使用)
  7. ニューラルネットワークの作成(ResNet50 を使用)
  8. ニューラルネットワークの学習(ResNet50 を使用)
  9. ニューラルネットワークの作成(DenseNet 121 を使用)
  10. ニューラルネットワークの学習(DenseNet 121 を使用)
  11. ニューラルネットワークの作成(DenseNet 169 を使用)
  12. ニューラルネットワークの学習(DenseNet 169 を使用)
  13. ニューラルネットワークの作成(NASNet を使用)
  14. ニューラルネットワークの学習(NASNet を使用)

サイト内の関連ページ

外部へのリンク

1. Google Colab へのリンク

Google Colaboratory のページ:

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

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

2. 前準備

Python の準備

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

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

TensorFlow,tensorflow_datasets,numpy,matplotlib, seaborn, scikit-learn のインストール

3. CIFAR 10 データセットのロード

  1. パッケージのインポート,TensorFlow のバージョン確認など
    from __future__ import absolute_import, division, print_function, unicode_literals
    import tensorflow.compat.v2 as tf
    tf.enable_v2_behavior()
    from tensorflow.keras import backend as K 
    K.clear_session()
    print(tf.__version__)
    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]
  2. CIFAR 10 データセットのロード
    tensorflow_datasets の loadで, 「batch_size = -1」を指定して,一括読み込みを行っている.
    cifar10, cifar10_info = tfds.load('cifar10', with_info = True, shuffle_files=True, as_supervised=True, batch_size = -1)
    

    [image]

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

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

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

    %matplotlib inline
    import matplotlib.pyplot as plt
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    NUM = 0
    # NUM 番目の画像を表示
    plt.imshow(cifar10['train'][0][NUM])
    

    [image]

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

    def plot25(ds, start):
        plt.figure(figsize=(10,10))
        for i in range(25):
            plt.subplot(5,5,i+1)
            plt.xticks([])
            plt.yticks([])
            plt.grid(False)
            image, label = ds[0][i + start], ds[1][i + start]
            plt.imshow(image)
            plt.xlabel(label.numpy())
        plt.show()
    
    plot25(cifar10['train'], 0)
    

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

    [image]
  3. cifar10['train'] と cifar10['test'] の形と次元を確認

    cifar10['train']: サイズ 32 かける 32 の 50000枚のカラー画像,50000枚のカラー画像それぞれのラベル(0 から 9 のどれか)

    cifar10['test']: サイズ 32 かける 32 の 10000枚のカラー画像,10000枚のカラー画像それぞれのラベル(0 から 9 のどれか)

    print(cifar10['train'][0].shape)
    print(cifar10['train'][1].shape)
    print(cifar10['test'][0].shape)
    print(cifar10['test'][1].shape)
    

    [image]

5. ニューラルネットワークの作成(MobileNetV2 を使用)

  1. ニューラルネットワークの作成と確認とコンパイル
    Keras の MobileNet を使う. 「weights=None」を指定することにより,最初,重みはランダムに設定する.

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

    NUM_CLASSES = 10
    INPUT_SHAPE = [32, 32, 3]
    m1 = tf.keras.applications.mobilenet.MobileNet(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)
    m1.summary()
    m1.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

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

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

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

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

6. ニューラルネットワークの学習(MobileNetV2 を使用)

  1. データセットの生成
    ds_train, ds_test = cifar10['train'], cifar10['test']
    

    [image]
  2. ニューラルネットワークを使うために,データの前処理

    値は,もともと int で 0 から 255 の範囲であるのを, float32 で 0 から 1 の範囲になるように前処理を行う.

    ds_train = (ds_train[0].numpy().astype("float32") / 255., ds_train[1])
    ds_test = (ds_test[0].numpy().astype("float32") / 255., ds_test[1])
    

    [image]
  3. 使用するデータの確認
    print(ds_test[0].shape)
    print(ds_test[1].shape)
    
  4. ニューラルネットワークの学習を行う

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

    EPOCHS = 20
    history = m1.fit(ds_train[0], ds_train[1],
                        epochs=EPOCHS,
                        validation_data=(ds_test[0], ds_test[1]), 
                        verbose=1)
    

    [image]
  5. CNN による画像分類

    ds_test を分類してみる.

    print(m1.predict(ds_test[0]))
    

    [image]

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

    m1.predict(ds_test[0]).argmax(axis=1)
    

    [image]

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

    print(y_test[1])
    

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

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

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

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

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

    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]

7. ニューラルネットワークの作成(ResNet50 を使用)

  1. ニューラルネットワークの作成と確認とコンパイル
    Keras の ResNet50 を使う. 「weights=None」を指定することにより,最初,重みはランダムに設定する.

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

    NUM_CLASSES = 10
    INPUT_SHAPE = [32, 32, 3]
    m2 = tf.keras.applications.resnet50.ResNet50(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)
    m2.summary()
    m2.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

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

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

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

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

8. ニューラルネットワークの学習(ResNet50 を使用)

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

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

    EPOCHS = 20
    history = m2.fit(ds_train[0], ds_train[1],
                        epochs=EPOCHS,
                        validation_data=(ds_test[0], ds_test[1]), 
                        verbose=1)
    

    [image]
  2. CNN による画像分類

    ds_test を分類してみる.

    print(m2.predict(ds_test[0]))
    

    [image]

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

    m2.predict(ds_test[0]).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://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]

9. ニューラルネットワークの作成(DenseNet 121 を使用)

  1. ニューラルネットワークの作成と確認とコンパイル
    Keras の DenseNet121 を使う. 「weights=None」を指定することにより,最初,重みはランダムに設定する.

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

    NUM_CLASSES = 10
    INPUT_SHAPE = [32, 32, 3]
    m3 = tf.keras.applications.densenet.DenseNet121(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)
    m3.summary()
    m3.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

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

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

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

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

10. ニューラルネットワークの学習(DenseNet 121 を使用)

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

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

    EPOCHS = 20
    history = m3.fit(ds_train[0], ds_train[1],
                        epochs=EPOCHS,
                        validation_data=(ds_test[0], ds_test[1]), 
                        verbose=1)
    

    [image]
  2. CNN による画像分類

    ds_test を分類してみる.

    print(m3.predict(ds_test[0]))
    

    [image]

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

    m3.predict(ds_test[0]).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://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]

11. ニューラルネットワークの作成(DenseNet 169 を使用)

  1. ニューラルネットワークの作成と確認とコンパイル
    Keras の DenseNet169 を使う. 「weights=None」を指定することにより,最初,重みはランダムに設定する.

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

    NUM_CLASSES = 10
    INPUT_SHAPE = [32, 32, 3]
    m4 = tf.keras.applications.densenet.DenseNet169(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)
    m4.summary()
    m4.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

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

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

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

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

12. ニューラルネットワークの学習(DenseNet 169 を使用)

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

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

    EPOCHS = 20
    history = m4.fit(ds_train[0], ds_train[1],
                        epochs=EPOCHS,
                        validation_data=(ds_test[0], ds_test[1]), 
                        verbose=1)
    

    [image]
  2. CNN による画像分類

    ds_test を分類してみる.

    print(m4.predict(ds_test[0]))
    

    [image]

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

    m4.predict(ds_test[0]).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://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]

13. ニューラルネットワークの作成(NASNet を使用)

  1. ニューラルネットワークの作成と確認とコンパイル
    KerasNASNet を使う. 「weights=None」を指定することにより,最初,重みはランダムに設定する.

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

    NUM_CLASSES = 10
    INPUT_SHAPE = [32, 32, 3]
    m5 = tf.keras.applications.nasnet.NASNetMobile(input_shape=INPUT_SHAPE, weights=None, classes=NUM_CLASSES)
    m5.summary()
    m5.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

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

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

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

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

14. ニューラルネットワークの学習(NASNet を使用)

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

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

    EPOCHS = 20
    history = m5.fit(ds_train[0], ds_train[1],
                        epochs=EPOCHS,
                        validation_data=(ds_test[0], ds_test[1]), 
                        verbose=1)
    

    [image]
  2. CNN による画像分類

    ds_test を分類してみる.

    print(m5.predict(ds_test[0]))
    

    [image]

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

    cvm5.predict(ds_test[0]).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://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]