トップページ -> コンピュータ実習 -> Keras の体験,応用例 -> ニューラルネットワークの作成,訓練(学習),予測(TensorFlow, Keras と Iris データセットを利用)
[サイトマップへ], [サイト内検索へ],

ニューラルネットワークの作成,訓練(学習),予測(TensorFlow, Keras と Iris データセットを利用)

サイト構成 連絡先,業績など コンピュータ実習 データの扱い コンピュータ設定 教材(公開) サポートページ

Keras は TensorFlow, CNTK, Theano 上で動くニューラルネットライブラリです.

ここで行うこと

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

先人に感謝.


前準備

Python のインストール

TensorFlow, Keras のインストール

Python パッケージのインストール

Windows のときは, コマンドプロンプトを管理者として実行し,次のコマンドを実行

py -m pip install --upgrade pip
pip install -U scikit-learn 

Ubuntu のときは, 端末で,次のコマンドを実行

sudo python3 -m pip install --upgrade pip
sudo apt-get -yV install python3-sklearn

iris データ(scikit-learn 同封のもの)

iris データの先頭部分

  1. Python プログラムを動かす.

    ※ そのために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

  2. (オプション)もし、virtualenv のPython 仮想環境にインストールしていて、それを使いたいときは、有効化する

    ※ virtualenv のPython 仮想環境を有効化したいときに限る(「ai」のところは,Python仮想環境の名前に変えること)

    workon ai
    

  3. X, yiris データを設定

    次の Python プログラムを実行

    import sklearn.datasets
    iris = sklearn.datasets.load_iris()
    X = iris.data
    y = iris.target
    

    実習課題

    iris データについて,配列の形,次元数,データの中身を,次のプログラムで確認しなさい.

    X は外花被片、内花被片の幅と高さである

    print( X.shape )
    print( X.ndim )
    print( X )
    

    配列(アレイ)の形:サイズは 150 × 4.次元数は 2

    y は花の種類のデータである

    print( y.shape )
    print( y.ndim )
    print( y )
    

    配列(アレイ)の形:サイズは 150.次元数は 1


Keras を使ってみる

  1. Python プログラムを動かす.

    ※ そのために, Windows では,「python」コマンドやPythonランチャーである「py」を使う. Ubuntu では「python3」コマンドを使う. あるいは, PyCharmなどにある Python コンソールも便利である.

  2. X_train, y_train, X_test, y_test に iris データを設定

    次の Python プログラムを実行

    import numpy as np
    import keras
    import sklearn.model_selection
    
    import sklearn.datasets
    iris = sklearn.datasets.load_iris()
    X = iris.data
    y = iris.target
    
    X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, train_size=0.5) 
    # 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
    def normalizer(A):
        M = np.reshape(A, (len(A), -1))
        M = M.astype('float32')
        max = M.max(axis=0)
        min = M.min(axis=0)
        return (M - min)/(max - min)
    
    X_train = normalizer(X_train)
    X_test = normalizer(X_test)
    y_train_logit = keras.utils.to_categorical(y_train)
    y_test_logit = keras.utils.to_categorical(y_test)
    

  3. 学習に使うデータ X_train, y_train の確認
    print(X_train)
    print(y_train)
    

  4. ニューラルネットワークを作成してみる
    • ニューラルネットワークの種類: 層構造 (Sequential Model)

    • ニューラルネットワークの構成
      • 入力の次元数: 4
      • 入力層のユニット(ニューロン)の個数: 64(1層)
      • 出力層のユニット(ニューロン)の個数: 3以下 (学習データに応じて、3以下に自動調整)
      • 出力層のユニット(ニューロン)の種類: softmax (活性化するのは一度に1つ)

    次の Python プログラムを実行

    import tensorflow as tf
    import keras
    from keras.models import Sequential
    from keras.layers import Dense, Activation
    
    m = tf.keras.models.Sequential([
        tf.keras.layers.Dense(units=64, input_dim=len(X_train[0]), activation=tf.nn.relu),
        tf.keras.layers.Dense(units=max(set(y_train)) - min(set(y_train)) + 1, activation=tf.nn.softmax)
    ])
    

  5. 訓練(学習)について定める

    損失関数: categorical crossentropy, 最適化法: 確率的勾配降下法 (SGD), 尺度; accuracy

    次の Python プログラムを実行

    m.compile(loss='sparse_categorical_crossentropy',
                  optimizer='sgd',
                  metrics=['accuracy'])
    

  6. 以上で、ニューラルネットワークの作成が終わった。確認表示する
    print(m.summary())
    

  7. X_trainy_trainを用いて、ニューラルネットワークの学習を行う
    m.fit(X_train, y_train, epochs=200)
    

  8. ニューラルネットワークによる予測を行う.

    予測を行わせたいデータは、X_test である

    ※ 予測させたいデータX_test は、Xの中からランダムに選ばれるので、実行結果は下の図と違うものになる

    m.predict(X_test)
    

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

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

    正解と比べてみる

    print(y_test)
    

  9. 予測結果を評価する

    予測の正しさを検証するために,正解データ(y_test)を使う。Keras の機能 evaluate を使う

    score=m.evaluate(X_test, y_test, batch_size=1)
    print(score)
    

  10. 別のニューラルネットワークを作成してみる

    「optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True」のところが、変更されたところ

    import numpy as np
    import keras
    import sklearn.model_selection
    
    import sklearn.datasets
    iris = sklearn.datasets.load_iris()
    X = iris.data
    y = iris.target
    
    X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, train_size=0.5) 
    # 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
    def normalizer(A):
        M = np.reshape(A, (len(A), -1))
        M = M.astype('float32')
        max = M.max(axis=0)
        min = M.min(axis=0)
        return (M - min)/(max - min)
    
    X_train = normalizer(X_train)
    X_test = normalizer(X_test)
    y_train_logit = keras.utils.to_categorical(y_train)
    y_test_logit = keras.utils.to_categorical(y_test)
    
    import tensorflow as tf
    import keras
    from keras.models import Sequential
    m = Sequential()
    from keras.layers import Dense, Activation
    
    m.add(Dense(units=64, input_dim=len(X_train[0])))
    m.add(Activation('relu'))
    m.add(Dense(units=max(set(y_train)) - min(set(y_train)) + 1))
    m.add(Activation('softmax'))
    m.compile(loss=keras.losses.sparse_categorical_crossentropy,
                  optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
    m.fit(X_train, y_train, epochs=200)
    m.predict(X_test)
    score2=m.evaluate(X_test, y_test, batch_size=1)
    print(score2)