トップページ -> 最新情報技術の実習と研究ツール -> Keras 2 の利用 -> Keras を用いたニューラルネットワークの作成,学習,予測
[サイトマップへ]  

Keras を用いたニューラルネットワークの作成,学習,予測

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

ここで行うこと

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

先人に感謝.


前準備

Anaconda のインストール

前準備として,Python 開発環境の Anaconda のインストールが終わっていること Windows では Chocholatey のインストールが終わっていること

Windows での Anaconda のインストール手順は、 別の Web ページに記載しています

Ubuntu での Anaconda のインストール手順は、 別の Web ページに記載しています

隔離された Python 環境の作成.Tensorflow, Keras, OpenCV, spyer のインストール

Windows での 手順は、 「Windows で,隔離された Python 環境 + Keras + TensorFlow + OpenCV + spyder + Dlib 環境を作る(Anaconda を利用)」のページで説明しています.

以下,Windows での Anaconda をインストール済み, 隔離された Python 環境(名前は ai)に、Tensorflow, Keras, OpenCV, spyder をインストール済みであるものとして説明を続けます.


iris データ

iris データの先頭部分

  1. IPython シェルのコンソールで、Python 環境(名前は ai)を使う

    Windows では、Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

    ※ Windows で、あるPython 環境(名前は aiとする)の spyder を使いたいとき:

    • Windows のスタートメニューに「spyder (ai)」が増えるので、それを使う。あるいは
    • コマンドプロンプトで「activate ai」を実行したあとに「spyder」

  2. 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. IPython シェルのコンソールを使う

    Windows では、Anacondaに入っている開発環境 spyder を実行し,右下の ipython コンソールを使うのが簡単.

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

    次の Python プログラムを実行

    import numpy as np
    import keras
    import sklearn.model_selection
    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)
    

CIFAR10 データセット

CIFAR10: カラー画像 60000枚, カテゴリーラベル (category label)

  1. CIFAR10 データセットの読み込み
    from keras.datasets import cifar10
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()
    X_train = X_train / 255
    X_test = X_test / 255
    y_train = y_train.ravel()
    y_test = y_test.ravel()
    

  2. 配列 X_train, y_train, X_test, y_test のサイズ確認
    print( X_train.shape )
    print( y_train.shape )
    print( X_test.shape )
    print( y_test.shape )
    

  3. X_train の先頭要素の表示(確認のため)

    X_train はカラー画像の集まりである

    import matplotlib.pyplot as plt
    plt.imshow( X_train[0] )
    

  4. y_train の表示(確認のため)

    y_train の要素は 0 から 9 の数値である

    print(y_train) 
    

  5. y_train が数字表示だとわかりにくい。分かりやすく英語で表示できるように下準備
    label_names = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]
    

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

    次の Python プログラムを実行

    import tensorflow as tf 
    import keras 
    from keras.models import Sequential
    from keras.layers import Dense, Activation
    
    m = tf.keras.Sequential([tf.keras.layers.Conv2D(16, (3, 3), input_shape=(X_train.shape[1], X_train.shape[2], X_train.shape[3]), activation="relu"),
        tf.keras.layers.MaxPool2D((2, 2)),
        tf.keras.layers.Conv2D(32, (3, 3), activation="relu"),
        tf.keras.layers.MaxPool2D((2, 2)),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512),
        tf.keras.layers.Dense(10, activation="softmax")
    ])
    

  7. 学習過程(訓練過程)を定める

    次の Python プログラムを実行

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

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

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

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

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

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

    m.predict(X_test)
    

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

    (画像10000個でテストしている。10000個の数字は表示しきれない。大部分を省略)

    for i in size 
    print( m.predict(X_test).argmax(axis=1) )
    

    正解と比べてみる

    (画像10000個でテストしている。10000個の数字は表示しきれない。大部分を省略)

    print(y_test)