最近勉強を始めたMachine learningやDeep learningについてPythonでコードを書いて実践してみたのでメモとして。完全に初心者向けです。
なお、今回の記事はO'Reillyの「ゼロから作るDeep Learning」を参考にしています。
##Neural Network (3層) の実装
まずは超シンプルに下の画像のようなネットワークをPythonで書いてみます。(適当な画像が見つからなかったので実際は出力層以外の各層の一番上のノードはbias unitと考えてください。)出力層での活性化関数にはシグモイド関数を使用します。
まずはシグモイド関数の実装及び各層の重みを設定します。また、biasは常に1であると想定し予め重みをかけ合わせておきます。
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def init_network():
network = {}
network['w1'] = np.array([[0.2, 0.4, 0.8], [0.7, 0.1, 0.9]])
network['b1'] = np.array([0.1, 0.3, 0.5])
network['w2'] = np.array([[0.1, 0.8], [0.6, 0.7], [0.3, 0.6]])
network['b2'] = np.array([0.1, 0.2])
network['w3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
network['b3'] = np.array([0.1, 0.2])
return network
次に入力から出力方向へのForward propagationを行う関数を作ります。
def forward_prop(network, x):
w1, w2, w3 = network['w1'], network['w2'], network['w3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, w1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, w2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, w3) + b3
y = a3
return y
実行すると、
network = init_network()
x = np.array([1.0, 0.5])
y = forward_prop(network, x)
print(y) #[0.33488935 0.73821001]
という結果が得られました。今までMatlabを使っていた身からすると、Numpyの多次元アレイは便利だなというのと素人目にもコードが読みやすいなと思いました。
今回は出力層のノードが二つだったためよりシンプルなシグモイド関数での実装を行いましたが、多クラス分類の場合にはsoftmax関数なんかを使うこともあります。またその際にはオーバーフロー対策としてNormalizationが必要になってきたりしますが、その辺は次の記事でまた書いていきたいと思います。