見出し画像

「Deep Learning」って何? 復習します!まず、ネットワーク!

ここで復習しておきます。これまでやってきたことを振り返り、もう一度最初からみていき理解を深めたいと思います。(pythonでの実装により確認)

ネットワークの基本は「パーセプトロン」でした。

import numpy as np

def AND(x1, x2):
   x = np.array([x1, x2])
   w = np.array([0.5, 0.5])
   b = -0.7
   tmp = np.sum(w*x) + b
   if tmp <= 0:
       return 0
   else:
       return 1

Numpyを使って入力、重みを配列で処理していきます。これは後々の計算式を理解する上でも大事だと思います。

そこに活性化関数を入れてノードを繋いでいきます。パーセプトロンでは

"0","1"だったものを活性化関数、例えば例えばシグモイド関数を使い処理していきます。

def sigmoid(x):
   return 1 / (1 + np.exp(-x))  

この層を何回か重ね、ネットワークが深くなっていきます。ニューラルネットワークの構築です。

ニュートラルネットワークを実装するにあたり、行列の積を表現しないといけません。Numpy を使ってコードを書いていきます。

A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
C = np.dot(A,B)

print(C)
[[19 22]
[43 50]]

と計算されます。ネットワークに必要な「重み」「バイアス」「入力」、「出力」共に配列で入れていけるように設計して数字をなるべくまとめ計算がしやすく、わかりやすいように組めるようになります。

ネットワークは、入力層、隠れ層、出力層とわけていきます。全体像です。

import numpy as np
import matplotlib.pyplot as plt

def init_network():
   network = {}
   network['w1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
   network['b1'] = np.array([0.1, 0.2, 0.3])
   network['w2'] = np.array([[0.1, 0.4], [0.2, 0.5], [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

def forword(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 = identity_function(a3) 

   return y

def sigmoid(x):
   return 1 / (1 + np.exp(-x))

def identity_function(x):
   return x

まず、最初に重み"w"、バイアス"b"の値を決めておきます。

def init_network():
   network = {}
   
   network['w1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
   network['b1'] = np.array([0.1, 0.2, 0.3])
  
   network['w2'] = np.array([[0.1, 0.4], [0.2, 0.5], [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

最初の入力層から第1層目に信号の伝達をする際の重み"w"、バイアス"b"の値を初期化、数値をw1,b1に入れていきます。

network['w1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
network['b1'] = np.array([0.1, 0.2, 0.3])

2層目、3層目も同じように実装しています。

次が実際のネットワークの実装です。

def forword(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 = identity_function(a3) 

   return y

重み、バイアスをw1, w2, w3、b1, b2, b3に入れていき

np.dot(x, w1) + b1

で計算して活性化関数(シグモイド関数)に渡します。

z1 = sigmoid(a1)

"a3"に最終的にデータが伝達されるので、最後に

y = identity_function(a3)

で出力します。identity_function()は恒等関数です。

ネットワークの実装です。Numpyを使うことで多次元配列をうまく使うことができます。

※出力層に使う活性化関数について

出力層に使う活性化関数としてはもう1つ大事なものがあり、それをソフトマックス関数と言います。

使い分けとしては一般的に、回帰問題は恒等関数、分類問題についてはソフトマックス関数を使います。

出力値は高騰関数はそのままの数字を、ソフトマックス関数は0から1.0の実数になり、総和は1となります。

この記事が気に入ったらサポートをしてみませんか?