PYTHONでkerasを使う

作成日: 2021/08/24 更新日: 2023/03/25 サイトの紹介と使い方

初めに

①全体像を優先するため、下記のコードにプロット処理を含みません。
②kerasは、スタンドアロンとTensorflow 2.0 に同梱された2種類のkeras が、存在します。
場合によっては、下記のコードが動かない可能性もあります。
③筆者の環境は、Google collaboration なので、同梱版と思われます。

インストールと宣言

①インストール方法


>pip keras
>conda keras

②ソース内での宣言


import keras

機能

①CNN(畳み込みニューラルネットワーク)⇨ディープラーニングのモデル作成と評価を実装します。画像認識が得意です。
②RNN(再帰型ニューラルネットワーク)⇨ディープラーニングのモデル作成と評価を実装します。統計解析・音声認識・自然言語翻訳が得意です。
③LSTM(長・短期記憶)⇨ディープラーニングのモデル作成と評価を実装します。RNNの弱点の補強を行います。

CNN(畳み込みニューラルネットワーク)

モデルの構築

# 宣言部
from keras.models import Sequential
from keras.layers import Dense, Activation
# コード部
model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

①モデルの構築にSequentil()を使用します。
②Dense,Activation は、レイヤです。

モデルのコンパイル

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['acc'])

①optimizer :モデルの最適化手法を指定します。
②loss :損失関数を指定します。
③mtrics :評価関数を指定します。

モデルを使って学習する

model.fit(x_train, y_train,
          epochs=20,
          batch_size=128)

①x_trainは、学習用の説明変数です。
②y_trainは、説明変数と対になる目的変数の正解値です。
③x_train,y_trainは、numpyオブジェクトにしてください。
PYTHONでnumpyを使うを参照してください。
④epochs は、学習する回数です。ディープラーニングは、ぐるぐるとループして学習します。
⑤データを1度に処理する量です。
一般的にこの値が小さいと収束(処理速度も)が遅くなり、大きいとメモリ量が大きくなります。
一概にどの数値がいいとは、言えません。

モデルの保存

import os
json_string = model.to_json()
open( "path名","w" ).write( json_string )
model.save_weights( "h5名" )

①json_string = model.to_json() で、モデル構成をjson_stringに代入します。
②open( "path名","w" ).write( json_string )で、モデル構成をpath名で指定したファイルに保存します。
例えば、ファイル名をmode.jsonなどにすると分かりやすいかもしれません。
③ model.save_weight( "h5名" )で、学習した重み(パラメータ)をh5 名で指定したファイルに保存します。
例えば、ファイル名をmodel.h5やmodel.hdf5などにすると分かりやすいかもしれません。
④後で、上記2つのファイルを呼び出せば、学習した情報で任意の説明変数から目的変数を予測することができます。
⑤Google colaborateを使用しているとき、パス名を明確にしないと保存したファイルを読み込めないことがあります。
お勧めは、Google drive を使用することです。
Google colaborate 上の/content/drive/MyDrive/ が、自分のGoogle drive のホーム(ルート)と一致します。
以下、配下のディレクトリを指定できます。

学習の(内部)評価

from keras.utils import np_utils
y_test = np_utils.to_categorical( y_test, nb_classes )
score  = model.evaluate( x_test, y_test )
print( score[0],score[1] )

①x_trainは、評価用の説明変数です。
②y_trainは、説明変数と対になる目的変数の正解値です。
③x_train,y_trainは、numpyオブジェクトにしてください。
PYTHONでnumpyを使うを参照してください。
④y_test = np_utils.to_categorical( y_test, nb_classes )は、必要ないと思いますが、念のためです。
nb_classes は分類するクラスの数です。ここでは5クラスを想定しています。
この関数は、y_test のデータをone-hot にします。
one-hot とは、次のように自分のデータ(ベクトル)のどれか1つを1にして、他をゼロにするという意味です。
[0,0,1,0,0]とか[1,0,0,0,0]
分類問題で、2つ以上の正答があると上手く評価できないということでしょう。
尚、分類問題以外では使わないでください。
⑤ score = model.evaluate( x_test, y_test )で、score に正答率などが返されます。
print( score[0],score[1] )は、
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])で、
損失関数で1個の評価値を評価関数で1個の評価値を設定したので計2個の評価値が返されます。
⑥ここまでは、教師あり学習なので、目的変数に正解値が与えられていることを想定しています。
つまり、学習の確からしさを評価しています。

モデルの(外部)評価

学習済みモデルの読み出し

import os
from keras.models import model_from_json
json_string = open( "path名","r" ).read()
model       = model_from_json( json_string )
model.load_weights( "h5名" )

①path名とh5名は上記の「モデルの保存」を参照してください。
②json_string = open( "path名","r" ).read()
モデル構成を読み込みます。
③model = model_from_json( json_string )
学習済みモデルの重み(パラメータ)を読み込むモデルオブジェクトを生成します。
④model.load_weights( "h5名" )
学習済みモデルの重み(パラメータ)を読み込みます。

モデルの評価と目的変数(予測)

pre = model.predict( x_test )

①分類問題について記述します。
②pre = model.predict( x_test )のx_test 説明変数です。
③例えば、5つのクラスに分類する場合を考えると、pre はサイズ5の配列になります。
④そして、pre の要素のそれぞれにクラスごとの確率が返されます。
⑤pre をone-hot にしたい時は、例えば、配列変数y_testに最も確率の高いクラスを1に、それ以外をゼロにします。

実用化に向けて

①ここからは、目的変数に正解値が設定されていることを想定していませんが、正解値が設定されていれば、予測の値との比較(目視など手作業をお勧めします)ができます。
②学習済みのモデルを使えば、実用化ができます。
③しかし、どの程度の正解率が出るかは分かりません。
例え、内部評価で高い正解率を出していても実用化に耐えられるかは分かりません。
④実用化の本番はここからです。
⑤何をしたいのか、どのくらいの正答率が求められるのかなどを考えていく必要があります。
⑥正答率を上げるためには、どのモデルを使うか(例えばCNNでいいのか)、その設定(レイヤの数や種類、引数の調整)が必要になります。
⑦また、学習用のデータ数や学習用のデータの選択の調整も必要になります。
⑧④〜⑦の作業は手作業になるので、根気が必要になります。

RNN( LSTM)(再帰型ニューラルネットワーク)

メールアドレス:

お問合せ・御要望

お問合せ

Verified by MonsterInsights
タイトルとURLをコピーしました