CentOSで普段プログラミングしているが、今回はwindows
ただ、内容は一緒なのでOSには依存しないと思う。
まずはライブラリのインポート
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation
model = Sequential()
作成したオブジェクトに.addでネットワークを追加していく
model.add(Dense(4, input_dim = 3))
この段階では以下のようなネットワークとなる。
そして、活性化関数を追加する。今回はsigmoid
\frac{1}{1+e^{-x}}
とすると
model.add(Activation('sigmoid'))
すると以下のようなネットワークになる
更に出力を3つにする
model.add(Dense(3))
そうすると、以下のようになる
最後にsoftmax関数で正規化する
\frac{e^{x_i}}{\sum x_i}
model.add(Activation('softmax'))
そうすると、以下のようになる
ここで、以下を実行するとネットワークのサマリーが出ます
model.summary()
作成したネットワークをコンパイルします。
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy')
これでネットワークの構築ができました。
そして、入力データと教師データをnumpyの配列で適当に作成する
import numpy as np
# 入力データ
x = np.array([
[0,1,1],
[0,0,1]
])
# 教師データ
y = np.array([
[1,0,0],
[0,1,0]
])
学習させる
model.fit(x,y,epochs=1500)
これは[0,1,1]を入力すると[1,0,0]を出力するように、
[0,0,1]を入力すると[0,1,0]を出力するように
ネットワークの重みを計算してくれます。
つまり絵で書くと
epochsは学習回数みたいなものです。多すぎても少なすぎても良くないです。
実際にテストしてみます
print(model.predict(np.array([[0,1,1]])))#試しに[0,1,1]を入力する
print(model.predict(np.array([[0,0,1]])))#試しに[0,0,1]を入力する
[[ 0.82834005 0.16713376 0.00452619]]
[[ 0.20225681 0.77913678 0.01860645]]
んーあんまりよくないですね、、、
つまり、事前に学習したネットワークに値を入れたら
[0,1,1]→[ 0.8, 0.2, 0.0]≒[1,0,0]#教師データと一致?
[0,0,1]→[ 0.2, 0.8, 0.0]≒[0,1,0]#教師データと一致?
となりました。