Kerasを使って予測モデルを作成してみました

*Keras とは

TensorFlowやTheano上で動く、Pythonの深層学習ライブラリです。
Kerasは簡単に素早くプロトタイプを作成することを目的に作られたライブラリで、文章の自動生成や画像認識、botの作成などといったディープラーニングを簡単に実装することができます。

ディープラーニングのライブラリを使ったことがなかったので、今回はKerasを使った基本的な予測モデルの作成をしてみました。


*参考



*環境

  • MacOS
  • Python 3.6.3
  • Keras 2.2.4
  • tensorflow 1.12.0
  • jupyter 1.0.0
  • matplotlib 3.0.2


*仮想環境の作成

ターミナルで作業ディレクトリを作成し、そのディレクトリ内で仮想環境を作成します。
$ mkdir keras-study
$ cd keras-study/

$ python3 -m venv env
$ source env/bin/activate
(env)$ 


*インストール

仮想環境に入り、Kerasをインストールします。(Kerasを使う際にはTensorflowも必要になります)
また、データ分析用のツールjupyterと、分析結果をグラフ化するためのライブラリmatplotlibもインストールしておきます。
(env)$ pip install tensorflow
(env)$ pip install keras

(env)$ pip install jupyter
(env)$ pip install matplotlib


*基本的な流れ

  • モデルの作成
  • モデルに訓練プロセスを設定
  • データの準備
  • モデルを学習(訓練の実行)
  • モデルの実行


*モデルの作成

今回は、ニューラルネットワークの各層を順番に繋げたモデルであるSequentialを使います。
Sequentialはコンストラクタにレイヤーのインスタンスを与えて作成することができます。
from keras.models import Sequential
from keras.layers import Dense, Activation


# モデルのインスタンス作成
model = Sequential()

# モデルにレイヤーを追加
model.add(Dense(4, input_dim=3))
model.add(Activation('sigmoid'))
model.add(Dense(3))
model.add(Activation('softmax'))

  • Dense
    通常の全結合ニューラルネットワークレイヤーのことで、第1引数はユニット数を設定します。
    (参考:Dense
  • Activation
    出力に活性化関数を適用します。(参考:Activation


*モデルに訓練プロセスを設定

compile()で学習のためのモデルの設定をします。
model.compile(optimizer='adam',
              loss='categorical_crossentropy')

  • optimizer
    勾配法の手法を設定します。(参考:optimizers
  • loss
    目的関数を設定します。(参考:losses


*サマリー出力

作成したモデルはsummary()でサマリーを出力することができます。
model.summary()

<実行結果>
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_4 (Dense)              (None, 4)                 16        
_________________________________________________________________
activation_1 (Activation)    (None, 4)                 0         
_________________________________________________________________
dense_5 (Dense)              (None, 3)                 15        
_________________________________________________________________
activation_2 (Activation)    (None, 3)                 0         
=================================================================
Total params: 31
Trainable params: 31
Non-trainable params: 0
_________________________________________________________________


*訓練データを準備

numpyを使って入力データと正解データを用意します。
import numpy as np

# 入力データ
x = np.array([
    [0, 1, 2],
    [1, 3, 1],
    [3, 1, -1],
    [5, 2, 0],
    [0, 8, 0]
])

# 正解データ
y = np.array([
    [1, 0, 0],
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1],
    [0, 1, 0]
])


*モデルを学習(訓練の実行)

fit()でモデルに学習をさせ、データに基づいた統計量を計算します。
history = model.fit(x, y, epochs=500)

<実行結果>
Epoch 1/500
5/5 [==============================] - 0s 421us/step - loss: 1.4650
Epoch 2/500
5/5 [==============================] - 0s 347us/step - loss: 1.4628
Epoch 3/500
5/5 [==============================] - 0s 355us/step - loss: 1.4605


*モデルの実行

predict()で予測モデルを実行させテストをします。
model.predict(x), y

<実行結果>
(array([[0.61310434, 0.30178922, 0.08510651],
        [0.546213  , 0.3262374 , 0.12754959],
        [0.21882877, 0.47380117, 0.30737013],
        [0.2595698 , 0.3946238 , 0.34580636],
        [0.32039204, 0.59017575, 0.08943215]], dtype=float32),
 array([[1, 0, 0],
        [1, 0, 0],
        [0, 1, 0],
        [0, 0, 1],
        [0, 1, 0]]))


*結果をグラフ化

matplotlibを使って実行結果をグラフに出力してみます。
from matplotlib import pyplot as plt


plt.plot(history.history['loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()












*所感

勾配法や目的関数のことは理解できていないのですが、Kerasを使った予測モデルの基本的な作成方法を知ることができました。
初めてディープラーニングのライブラリを触ってみましたが、業務的なロジックというよりも関数などの使い方を理解して目的によって選別するスキルが必要だと感じました。
まだ理解が浅いので、今後もう少し深く調べてみたいと思います。

Previous
Next Post »

人気の投稿