深さ学習基礎0325 Fri
25822 ワード
preview
パラメータ論:入力値に重み付けを乗算した後、結果が0より大きい場合は1を返します.そうでない場合は0を出力し、次のレベルに値を移動します.
すなわち,重み付けとステップ関数=>ステップ関数を順番に実行することでPerceptronがアクティブであるか否かが決まるので,ステップ関数をアクティブ関数と呼ぶ.
信号:ニューラルネットワークでよく使われるアクティブ化関数.ステップ関数とは異なり、S字形曲線形式の連続関数です.
ステップ関数と信号の違いは、0を基準として入力値が0より大きい場合は1、0より小さい場合は0を出力し、ギャップ値を表すことができないステップ関数が異なり、信号は滑らかなステップ関数形状であり、値を連続的に表すことができる.
線形vs非線形関数
リニアリニアリニア:入力定数倍になる関数を出力する
f(x)=ax+b(aとbは定数)
非線形ひせんけい:非線形関数ひせんけいかんすう
ニューラルネットワークにおける非線形関数=>人工ニューラルネットワーク刺激値を活性化する活性化関数は線形関数ではない.
h(x)=線形関数、例えばcxを使用する場合.
これは,層がどんなに深くても最終的には線形になることを意味する.
なんとも言えませんが、
例えば、h(x)からなるニューラルネットワークが100層堆積したと仮定する.
でもc(c(x))...このようにして戻り値をパラメータとして使用し、戻り値をパラメータとして使用するには、100回繰り返すだけです.
これは単純なa=(c^100)*xにすぎず,最終的に多層を積み重ねても第1層と変わらない.
ReLU関数
入力が0より大きいと通過し、入力が0より小さいと出力0になります.
多次元配列の計算
Numpiを用いた多次元配列計算=>ニューラルネットワークを効率的に実装
import numpy as np
A = np.array([[1,2],[3,4]])
print(A.shape) # 행렬 구조(?행?열)
B = np.array([[5,6],[7,8]])
print(B.shape)
print(np.dot(A, B)) # 행렬의 곱
# 2 x 3 행렬와 3 x 2 행렬의 곱 계산
C = np.array([[1,2,3],[4,5,6]])
print(C.shape)
D = np.array([[1,2],[3,4],[5,6]])
print(D.shape)
print(np.dot(C, D))
# 다음 코드의 문제점은?
print(C.shape)
E = np.array([[1,2],[3,4]])
print(E.shape)
print(np.dot(C, E))
# 2 x 3 행렬과 2 x 2 행렬의 곱 계산으로 오류 발생 => 행렬의 곱에서 서로 대응하는 차원의 수를 일치시켜야.
ニューラルネットワークにおけるマトリクスの積
さんそうニューラルネットワーク
0層->1層信号伝達
# a1 노드 계산의 파이썬 구현
X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])
print(W1.shape)
print(X.shape)
print(B1.shape)
A1 = np.dot(X, W1)+B1
print(A1)
def sigmoid(x):
return 1 / (1 + math.e ** -x)
Z1 = sigmoid(A1) # 활성화함수
print(Z1)
第1層->第2層信号伝達# 1층 => 2층 신호전달 구현
W2 = np.array([[0.1, 0.4],[0.2, 0.5],[0.3, 0.6]])
B2 = np.array([0.1, 0.2])
print(Z1.shape) # (3, )
print(W2.shape) # (3, 2)
print(B2.shape) # (2, )
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
レイヤ2->出力レイヤ信号伝達出力レイヤは、他の関数を使用せずに、自分の値を直接出力します.
# 2층 => 출력층 신호전달 구현
def idenity_function(x):
return x
W3 = np.array([[0.1, 0.3],[0.2, 0.4]])
B3 = np.array([0.1, 0.2])
A3 = np.dot(Z2, W3) + B3
Y = idenity_function(A3) # or Y = A3 도 같은 결과
print(Y) # 결과: [0.31682708 0.69627909]
最終コード# 3층 신경망 구현 정리
import numpy as np
# 시그모이드 함수 구현
def sigmoid(x):
return 1/(1+np.exp(-x))
# 항등 함수 구현(입력을 그대로 출력)
def identify_function(x):
return x
# 가중치, 편향을 초기화 하고 network에 저장
# 딕셔너리 변수인 network에는 각 층에 필요한 매개변수(가중치와 편향) 저장
def init_network():
network = {}
network['W1'] = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]]) # 0->1 가중치
network['b1'] = np.array([0.1, 0.2, 0.3]) # 0->1 편향
network['W2'] = np.array([[0.1, 0.4],[0.2 ,0.5], [0.3, 0.6]]) # 1->2 가중치
network['b2'] = np.array([0.1, 0.2]) # 1->2 편향
network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]]) # 2->3 가중치
network['b3'] = np.array([0.1, 0.2]) # 2->3 편향
return network
def forward(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 # 0->1 가중치 계산
z1 = sigmoid(a1) # 0->1 활성화
a2 = np.dot(z1, W2) + b2 # 1->2 가중치 계산
z2 = sigmoid(a2) # 1->2 활성화
a3 = np.dot(z2, W3) + b3 # 2->3 가중치 계산
y = identify_function(a3) # 2->3 활성화
return y
network = init_network()
x = np.array([1.0, 0.5]) # 입력값
y = forward(network, x) # 출력값
print(y) # [0.31682708 0.69627909]
Reference
この問題について(深さ学習基礎0325 Fri), 我々は、より多くの情報をここで見つけました https://velog.io/@allzeroyou/딥러닝기초0325Friテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol