앞의 신경망 추론 과정을 파이선과 넘파이를 이용해 구현해보자
가중치와 편향을 이용해 결과값을 도출하는 과정을 Affine(아핀) layer라고 정의한다
Affine layer 과정에서 나온 결과값을 Sigmoid 함수를 이용해 비선형화 하는 것을 Sigmoid layer라고 정의한다
앞에서 설명된 신경망 추론과정과 그에 매칭시켜 구현하기 위한 구성도는 아래와 같다.
구현 규칙 :
파이썬을 이용해 위 모델을 구현시 Affine, Sigmoid 모두 클래스로 구현할 것이며
각 클래스는 params, grads 속성을 갖도록 한다
params는 가중치 행렬과 편향행렬을 저장한다,
grads는 params에 저장된 각 행렬에 대응되는 기울기(미분)행렬을 저장
각 클래스는 신경망 추론, 학습과정을 위해 대표 함수 forward를 제작하여 제공하도록 한다.
Affine layer 클래스 구현소스
class Affine:
def __init__(self, W, b):
self.params = [W, b]
def forward(self, x):
W, b = self.params
out = np.matmul(x, W) + b
return out
Sigmoid layer 클래스 구현소스
class Sigmoid:
def __init__(self):
self.params = []
def forward(self, x):
return 1 / (1 + np.exp(-x))
이제 신경망의 기본이 되는 위 두개 클래스 Affine과 Sigmoid를 이용하여 신경망 추론을 모델링한 클래스를 제작한다
이름은 TwoLayerNet 으로 한다
class TwoLayerNet:
#클래스 생성자에서 입력층, 은닉층, 출력층의 행렬 사이즈를 입력받고 가중치, 편향 초기화
#Layer들을 구성하여 params 속성에 가중치, 편향 행렬을 저장한다
def __init__(self, input_size, hidden_size, output_size):
I, H, O = input_size, hidden_size, output_size;
#가중치와 편향 초기화
Wh = np.random.randn(I, H)
bh = np.random.randn(H)
Wy = np.random.randn(H, O)
by = np.random.randn(O)
#계층 생성(위 구성도 기준으로 구현)
self.layers = [
Affine(Wh, bh),
Sigmoid(),
Affine(Wy, by)
]
#모든 가중치를 리스트에 모은다
self.params = []
for layer in self.layers:
self.params += layer.params
def predict(self, x):
for layer in self.layers:
x = layer.forword(x)
return x
'인공지능 > DeepLearning from Scratch 2' 카테고리의 다른 글
DeepLearning from scratch2 - 1.3.3 연쇄법칙 (딥러닝 학습) (0) | 2019.07.11 |
---|---|
DeepLearning from scratch2 - 1.3.2 미분과 기울기 (딥러닝 학습) (0) | 2019.07.11 |
DeepLearning from scratch2 - 1.3.1 손실함수 (딥러닝 학습) (0) | 2019.07.09 |
DeepLearning from scratch2 - 1.2.1 신경망 추론 (딥러닝 학습) (0) | 2019.07.04 |
DeepLearning from scratch2 - 1.1 수학과 파이썬 복습 (딥러닝 학습) (0) | 2019.07.01 |