##ポイント
➀ニュートラルネットワークの構造
・入力ノードは二個 中間ノードは二個 出力ノードは一個
⇒中間層に必要な重みは四個 出力層に必要な重みは二個
➁重みやバイアスを変更することで、様々な出力状態を表現できるため、試してみるとよい。
➂活性化関数としては、今回シグモイド関数以外に恒等関数を用いた。
➃重みとバイアスのサイズが異なるため、演算時にはブロードキャストの知識が必要になる。
➄行列同士の計算では、dotにより実装することができる。
➅行列の初期化では、zerosやonesがよく使われる(zeros⇒0詰め行列 ones⇒1詰め行列)
##ソース
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
#x,yともに、10個のデータを準備する
X=np.arange(-1.0,1.0,0.2)
Y=np.arange(-1.0,1.0,0.2)
#10x10の0詰め行列の準備
Z=np.zeros((10,10))
#重み行列
#中間層(2x2)
w_middle=np.array([[-4.0,-4.0],
[4.0,-4.0]])
#出力層(2x1)
w_out=np.array([[1.0],[-1.0]])
#バイアス行列
#中間層
b_middle=np.array([3.0,-3.0])
#出力層
b_out=np.array([0])
#中間層の実装
def middle_layer(x,w,b):
u=np.dot(x,w)+b#線形変換
return 1/(1+np.exp(-u))#非線形変換(シグモイド関数)
#出力層の実装
def out_layer(x,w,b):
u=np.dot(x,w)+b #線形変換
return u #非線形変換(恒等関数)
#ニュートラルネットワークの実装
for i in range(10):
for j in range(10):
#入力層
inp=np.array([X[i],Y[j]])
#中間層
mid=middle_layer(inp,w_middle,b_middle)
#出力層
out=out_layer(mid,w_out,b_out)
#出力データの格納
Z[j][i]=out[0]
#グリッド表示
plt.imshow(Z,"gray",vmin=0.0,vmax=1.0)
plt.colorbar()
plt.show()
##補足
・ブロードキャスト(サイズの異なる行列の演算)
a=np.array([[1,1],[1,1]])#2x2の行列
b=np.array([1,2])#一次元配列
c=np.array([[1],[2]])#2x1の行列
print(a+b)
print(a+c)
>>>
[[2 3]
[2 3]]
[[2 2]
[3 3]]
・行列同士の積(一般的に、MxHの行列とHxNの行列の積の結果はMxNの行列となる)
x=np.array([[2,3],[1,2],[5,6]])#3x2の行列
y=np.array([[3,3,2],[3,7,9]])#2x3の行列
print(np.dot(x,y))#3x3の行列が出力される
>>>
[[15 27 31]
[ 9 17 20]
[33 57 64]]
・行列の初期化(0詰め行列と1詰め行列の生成)
np.zeros((2,3))
>>>
array([[0., 0., 0.],
[0., 0., 0.]])
np.ones((2,3))
>>>
array([[1., 1., 1.],
[1., 1., 1.]])
##関連記事
ニュートラルネットワーク(重みとバイアス)