##ポイント
・ニュートラルネットワークのノードに入力されたデータは ➀線形変換 ➁非線形変換 を経てノードから出力される。そのデータは出力されたノードと隣あうノードの入力データとなる。この流れが出力層まで繰り返されていく。
・線形は直線で表現され、非線形は曲線で表現できる。
・重みとバイアスを用いて入力データに対して線形変換が行われる。
・非線形変換では今回、シグモイド曲線を用いた。非線形曲線は別名活性化関数と呼ぶ。
##ソース
import numpy as np
import matplotlib.pyplot as plt
def nuro(x,y,bias):
#xとyについてそれぞれ-1.0,-0.8,-0.6 … 10個のデータを作成する
X=np.arange(-1.0,1.0,0.2)
Y=np.arange(-1.0,1.0,0.2)
#0詰めの10×10の行列を準備
z=np.zeros((10,10))
for i in range(10):
for j in range(10):
#線形変換の実施
u=X[i]*x+Y[j]*y+bias
#非線形変換(シグモイド曲線)の実施
y=1/(1+np.exp(-u))
#非線形変換後の数値を行列に格納する
z[j][i]=y
#グリッド表示
plt.imshow(z,"gray",vmin=0.0,vmax=1.0)
plt.colorbar()
plt.show()
#メイン関数
def main():
#複数の重みの準備
w_x=[1.0,2.0,3.0]
w_y=[3.0,5.0,7.0]
#複数のバイアスの準備
bias=[0.1,0.2,0.3]
for i,j,k in zip(w_x,w_y,bias):
nuro(i,j,k)
if __name__ == "__main__":
main()
#出力
##・図よりわかること
1に近いほど、白く活性化度が強い。逆に、0に近いほど、黒く活性化度が弱い。重みやバイアスを調整することで、微妙に座標に対する活性化度が変化することがわかる。
##補足【シグモイド曲線について】
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(a):
return 1/(1+np.exp(-a))
a=np.arange(-5,5)
b=sigmoid(a)
plt.plot(a,b)
plt.show()
#・シグモイド曲線の特徴
シグモイド曲線のおかげで、出力データは0~1の間に収束することができる。
##関連記事
ニュートラルネットワーク(重みとバイアス)応用