<目次>
(1) Kerasでロジスティクス回帰を実装した例をご紹介
(1-1) 実装のフローとポイント
(1-2) 実装例
(1) Kerasでロジスティクス回帰を実装した例をご紹介
ロジスティクス回帰を実装する際のポイント(実装のステップ)と、Kerasで実装したサンプルコードをご紹介します。
※ロジスティクス回帰とは?について知りたい方はこちらもご覧ください。
⇒(参考)ロジスティクス回帰とは?Excelで計算する方法もご紹介
(1-1) 実装のフローとポイント
●STEP1:モデルの定義
●STEP2:誤差関数の定義
●STEP3:最適化手法の定義(例:勾配降下法)
●STEP4:セッションの初期化
●STEP5:学習
(1-2) 実装例
############################################
# ロジスティック回帰(Keras版)
# 2022/XX/XX 初版作成
# 2022/08/10 X,tを関数の引数として外出し
#
# ※numpy未導入の場合「pip install numpy」を実行
# ※keras未導入の場合「pip install tensorflow」を実行
############################################
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
# 入力層xの次元
M = 2
# 出力層yの次元(クラス数)
K = 1
# Epoc数の定義
epocs = 300
def or_gate(X_arg,t_arg):
############################################
# STEP1:モデルの定義
############################################
# 入力の電気信号xの初期化
X = X_arg
# 正解値tの定義
t = t_arg
# 入力層 - 出力層の定義
# Dense(input_dim=2, units=1):入力が2次元、出力が1次元のネットワーク
# ⇒ w1*x1 + w2+x2 + bに相当
# Activation('sigmoid'):活性化関数として、シグモイド関数を指定
# ⇒ y = σ(wx + b)に相当
model = Sequential([
Dense(input_dim=M, units=K),
Activation('sigmoid')
])
# 別の記述方法:add関数でも記述可能
#model = Sequential()
#model.add(Dense(input_dim=2, units=1))
#model.add(Activation('sigmoid'))
############################################
# STEP2:誤差関数の定義
############################################
# ⇒今回は不要
# (確率的勾配降下法の最終式を使うため、誤差関数Eは計算不要)
############################################
# STEP3:最適化手法の定義(例:確率的勾配降下法)
############################################
# loss='binary_crossentropy'
# 誤差関数の種類を指定。
# 2値(発火する/しない)の交差エントロピー関数の計算をさせる。
# SGD(lr=0.1)
# 最適化の手法を指定している。「SGD」は確率的勾配降下法で「lr」はその学習率。
# それぞれ「Stochastic Gradient Descent」と「learning rate」の頭文字を取っている。
model.compile(loss='binary_crossentropy',optimizer=SGD(lr=0.1))
############################################
# STEP4:セッションの初期化
############################################
# ⇒今回は不要
# (TensorFlow v2以降はSessionを使用しないため)
############################################
# STEP5:学習
############################################
# 指定したエポック数、繰り返し学習を行う
# 第1引数:Xは入力データ(入力の電気信号)
# 第2引数:tは正解データ(出力の電気信号の正解値)
# 第3引数:エポック(データ全体に対する反復回数)の数
# 第4引数:ミニバッチ勾配降下法(N個の入力データをM個ずつのグループに分けて学習する際のMの値)
model.fit(X,t,epochs=epocs,batch_size=1)
############################################
# STEP6:学習結果の確認
############################################
# 分類が正しい結果になっているか?(発火するかどうか?が正しい結果になっているか)
classes = (model.predict(X,batch_size=1) > 0.5).astype("int32")
# ネットワークの出力「y」の計算結果を取得
prob = model.predict(X,batch_size=1)
print("===================",classes)
print("===================",t)
print("*******************************")
print("classified: ",t==classes)
print("probability: ",prob)
print("*******************************")
def main():
# 入力の電気信号xの初期化
X = np.array([[0,0],[0,1],[1,0],[1,1]])
# 正解値tの定義([0., 1., 1., 1.])
t = np.array([[0],[1],[1],[1]])
or_gate(X,t)
if __name__ == "__main__":
main()
Epoch 1/300 4/4 [==============================] - 0s 2ms/step - loss: 0.6296 Epoch 2/300 4/4 [==============================] - 0s 2ms/step - loss: 0.5790 ~中略~ Epoch 299/300 4/4 [==============================] - 0s 2ms/step - loss: 0.0762 Epoch 300/300 4/4 [==============================] - 0s 2ms/step - loss: 0.0759 ******************************* classified: [[ True] [ True] [ True] [ True]] probability: [[0.15845212] [0.9381554 ] [0.9379867 ] [0.9991801 ]] *******************************