<目次>
多クラスのロジスティック回帰をKerasで実装した例をご紹介
(1-1) 実装のフローとポイント
●STEP1:モデルの定義
●STEP2:誤差関数の定義
●STEP3:最適化手法の定義(例:勾配降下法)
●STEP4:セッションの初期化
●STEP5:学習
実装例
多クラスのロジスティック回帰をKerasで実装した例をご紹介
(1-1) 実装のフローとポイント
●STEP1:モデルの定義

●STEP2:誤差関数の定義
●STEP3:最適化手法の定義(例:勾配降下法)
●STEP4:セッションの初期化
●STEP5:学習
(1-2) 実装例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
from sklearn.utils import shuffle
# 入力xの次元
M = 2
# 出力yの次元(クラス数)
K = 3
# 入力データセットの総
nc = 10
# 入力データセットの総数
N = nc * K
# ミニバッチのサイズ
mini_batch_size = 5
def mc_logistic_regression(Xarg,targ):
############################################
# STEP1:モデルの定義
############################################
# 入力の電気信号xの初期化
X = np.array(Xarg)
# 正解値tの定義
t = np.array(targ)
# 入力層 - 出力層の定義
# Dense(input_dim=M, units=K):入力がM次元、出力がK次元のネットワーク
# ⇒ W[K行×M列] × xn[M行×1列] + b[K行×1列]に相当
# Activation('softmax'):活性化関数として、シグモイド関数を指定
# ⇒ y = e^{xi}/Σe^{xi} = softmax(Wx + b)に相当
model = Sequential([
Dense(input_dim=M, units=K),
Activation('softmax')
])
# 別の記述方法:add関数でも記述可能
#model = Sequential()
#model.add(Dense(input_dim=M, units=K))
#model.add(Activation('softmax'))
############################################
# STEP2:誤差関数の定義
############################################
# ⇒今回は不要
# (確率的勾配降下法を使うため、誤差関数Eは計算不要)
############################################
# STEP3:最適化手法の定義(例:確率的勾配降下法)
############################################
# loss='categorical_crossentropy'
# 誤差関数の種類を指定。
# 多クラス値(例:晴、雨、曇、雷、雪)の交差エントロピー関数の計算をさせる。
# SGD(lr=0.1)
# 最適化の手法を指定している。「SGD」は確率的勾配降下法で「lr」はその学習率。
# それぞれ「Stochastic Gradient Descent」と「learning rate」の頭文字を取っている。
model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1))
############################################
# STEP4:セッションの初期化
############################################
# ⇒今回は不要
# (TensorFlow v2以降はSessionを使用しないため)
############################################
# STEP5:学習
############################################
# データをシャッフル
X_,t_ = shuffle(X,t)
# 指定したエポック数、繰り返し学習を行う
# 第1引数:Xは入力データ(入力の電気信号)
# 第2引数:tは正解データ(出力の電気信号の正解値)
# 第3引数:エポック(データ全体に対する反復回数)の数
# 第4引数:ミニバッチ勾配降下法(N個の入力データをM個ずつのグループに分けて学習する際のMの値)
model.fit(X_,t_,epochs=10,batch_size=mini_batch_size)
############################################
# STEP6:学習結果の確認
############################################
# 分類が正しい結果になっているか?の確認
# model.predict(X_,batch_size=mini_batch_size)
# ⇒各「入力」に対する「出力」の確率(ソフトマックス)の確認
# np.argmax(●)で[X,X,X]の最大のインデックスを抽出
# (例) [[0,1,0],[0,0,1],[1,0,0]]⇒[1,2,0]
# axis=1の場合は横軸単位で比較する。
# axis=0の場合は縦軸同士で比較する。
classes = np.argmax(model.predict(X_,batch_size=mini_batch_size),axis=1)
# 正解のインデックス情報
# t_でデータ数N回ループし、正解のindexを抽出してリスト化け
# (例)[[0,1,0],[0,0,1],[1,0,0]]⇒[1,2,0]
t_index = np.argmax(t_,axis=1)
# 別の方法で、forループを使ったワンライナーでも記述可能。
#t_index = [index for i in range(len(t_)) for index in range(K) if t_[i][index] == 1]
# ネットワークの出力「y」の計算結果を取得
prob = model.predict(X_,batch_size=mini_batch_size)
print("*******************************")
# 分類出来たか?はyの最大index(classes)と、tの最大index(t_index)を比較
print("classified: ",t_index==classes)
print("probability: ",prob)
print("*******************************")
def main():
# データセット
np.random.seed(0)
X1 = np.random.randn(nc,M) + np.array([0,10])
X2 = np.random.randn(nc,M) + np.array([5,5])
X3 = np.random.randn(nc,M) + np.array([10,0])
t1 = np.array([[1,0,0] for i in range(nc)])
t2 = np.array([[0,1,0] for i in range(nc)])
t3 = np.array([[0,0,1] for i in range(nc)])
X = np.concatenate((X1,X2,X3), axis=0)
t = np.concatenate((t1,t2,t3), axis=0)
mc_logistic_regression(X,t)
if __name__ == "__main__":
main()
(実行結果)
Epoch 1/100 6/6 [==============================] - 1s 2ms/step - loss: 1.1570 Epoch 2/100 6/6 [==============================] - 0s 3ms/step - loss: 0.2156 ~中略~ Epoch 99/100 6/6 [==============================] - 0s 4ms/step - loss: 0.0199 Epoch 100/100 6/6 [==============================] - 0s 4ms/step - loss: 0.0199 ******************************* classified: [ True True True True True True True True True True True True True True True True True True True True True True True True True True True True True True] probability: [[9.9979442e-01 2.0564573e-04 6.9575461e-16] [6.8023434e-04 9.9855763e-01 7.6216529e-04] [2.7667065e-04 9.9887377e-01 8.4964035e-04] [5.3225842e-04 9.7713977e-01 2.2328045e-02] [5.4088702e-07 9.0682417e-01 9.3175314e-02] [2.6710026e-05 9.9393141e-01 6.0418919e-03] [9.9897790e-01 1.0221774e-03 5.7566677e-14] [9.8033327e-01 1.9666675e-02 2.9477646e-12] [6.0400196e-15 2.7859520e-05 9.9997211e-01] [2.3286204e-15 3.0343992e-05 9.9996960e-01] [9.8259991e-01 1.7400024e-02 8.2299827e-12] [9.9748623e-01 2.5137293e-03 3.0121305e-13] [3.4205001e-04 9.9940085e-01 2.5713860e-04] [9.9972636e-01 2.7364912e-04 8.0947373e-15] [9.9926609e-01 7.3387736e-04 8.4396743e-16] [1.7663404e-01 8.2335490e-01 1.1121567e-05] [9.9800259e-01 1.9974094e-03 1.5093994e-12] [1.4875893e-09 9.6363313e-02 9.0363663e-01] [2.3149002e-14 1.6481348e-04 9.9983513e-01] [9.0435299e-04 9.9881858e-01 2.7706698e-04] [4.3301537e-14 2.1774136e-04 9.9978226e-01] [3.5343241e-05 9.9989510e-01 6.9516667e-05] [5.6887115e-05 9.9984455e-01 9.8624521e-05] [1.5095936e-12 7.0888322e-04 9.9929106e-01] [9.9516159e-01 4.8384019e-03 1.2704730e-12] [3.7335708e-14 5.4447009e-04 9.9945551e-01] [1.0045675e-12 1.5028779e-03 9.9849713e-01] [9.2725194e-01 7.2748050e-02 2.7557953e-10] [7.4297244e-14 7.8656414e-04 9.9921346e-01] [1.0353001e-11 4.9560051e-03 9.9504399e-01]] *******************************
(図121)
