トップページ人工知能,実世界DB人工知能による分類 (classification)データの分類,モデルの作成と学習と評価(TensorFlow,Keras,乱数による合成データを使用)(Google Colab 上もしくはパソコン上)

データの分類,モデルの作成と学習と評価(TensorFlow,Keras,乱数による合成データを使用)(Google Colab 上もしくはパソコン上)

ニューラルネットワークの作成,学習,データの分類を行う. 乱数による合成データを使用する.

ここで行うこと

サイト内の関連ページ

参考Webページ:

謝辞

参考Webページ: 「https://keras.io/ja/」の「30 秒で Keras に入門しましょう」 に記載のソースコードを書き換えて使っている.

Google Colab へのリンク

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

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

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

https://colab.research.google.com/drive/1ZxHKflbsMeSLQEFrlK3FFfmAnnaWq735?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 などのインストール

インストール手順の説明

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

ニューラルネットワークの作成,乱数による合成データを用いた学習とデータの分類

  1. パッケージのインポートと TensorFlow のバージョン確認
    from __future__ import absolute_import, division, print_function, unicode_literals
    import tensorflow.compat.v2 as tf
    import tensorflow_datasets as tfds
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    import warnings
    warnings.filterwarnings('ignore')   # Suppress Matplotlib warnings
    tf.enable_v2_behavior()
    from tensorflow.keras import backend as K 
    K.clear_session()
    print(tf.__version__)
    

  2. 合成データの作成

    ここでは,データは乱数で合成している.

    x_train = np.random.rand(10000, 100);
    y_train = np.floor(np.random.rand(10000, 1) * 10)
    x_test = np.random.rand(5000, 100);
    y_test = np.floor(np.random.rand(5000, 1) * 10)
    

  3. x_train, y_train の確認
    print(x_train)
    

    print(y_train)
    

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

    x_train, y_train, x_test, y_test の表示

    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(x_train, y_train, 0.1)
    

    pcaplot(x_test, y_test, 0.1)
    

  5. モデルの作成と確認とコンパイル
    • ニューラルネットワークの種類: 層構造 (Sequential Model)
    • ニューラルネットワークの構成
      • 入力の次元数: 100
      • 入力層のニューロン(ユニット)の個数: 64(1層)
      • 出力層のニューロン(ユニット)の個数: 10
      • 出力層のニューロン(ユニット)の種類: softmax

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

    NUM_CLASSES = 10
    m = tf.keras.Sequential([
        tf.keras.layers.Dense(units=64, input_dim=100, activation='relu'),
        tf.keras.layers.Dropout(0.05),
        tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
    ])
    m.summary()
    m.compile(
        optimizer=tf.keras.optimizers.Adam(0.001),
        loss='sparse_categorical_crossentropy',
        metrics=['sparse_categorical_crossentropy', 'accuracy']
    )
    

  6. モデルのビジュアライズ

    Google Colab では「Google Colab では「!pip install git+https://github.com/lordmahyar/keras-visualizer」を実行

    # Google Colab では「!pip install git+https://github.com/lordmahyar/keras-visualizer」を実行
    !pip install git+https://github.com/lordmahyar/keras-visualizer
    

    from keras_visualizer import visualizer  
    visualizer(m, format='png')
    from IPython.display import Image,display_png
    display_png(Image('graph.png'))
    

  7. 学習(訓練)

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

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

  8. ニューラルネットワークによるデータの分類

    分類を行わせたいデータは、x_test である

    分類させたいデータx_test は乱数なので、実行結果は下の図と違うものになる

    print(m.predict(x_test))
    

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

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

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

    乱数による合成データなので,データの分類がうまくできないのは当然である.

    print(y_test)
    

  9. 学習曲線の確認

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

    乱数による合成データなので,学習の繰り返しにより精度が向上しないのは当然である.

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

  10. 学習曲線のプロット

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

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