가중치의 종류
W_xh : 입력 값에 대한 가중치, 가중치 연산 결과가 노드 입력이 된다.
W_hy : 노드 출력에 대한 가중치, 예측값이 된다.
W_hh : 노드 출력에 대한 가중치, 다음 노드 입력에 사용된다.
원하는 크기의 입력에 대한 출력의 크기를 지정할 수 있다.
시퀀스 투 시퀀스
시퀀트 투 벡터
벡터 투 시퀀스
벡터 투 벡터
각 종류와 그 크기별로 가중치들의 행렬 크기가 바뀐다.
class RNN:
"""
순환 신경망의 계산
"""
# 입력 가중치
input_w = []
# 이전 출력에 대한 가중치
before_w = []
# 출력 가중치
result_w = []
# 편향 값 bais
bias = []
# 노드 입력
node_input = []
def cal_rnn(self, input, target, input_w, before_w, result_w, bias):
self.input_w = input_w
self.before_w = before_w
self.result_w = result_w
# 이전 노드의 출력, 첫 부분의 경우 이 값이 0이다.
before = np.zeros((target.shape[0], target.shape[1]))
self.node_input.append((before_w @ before) + (input_w @ input) + bias)
RNN 클래스와 노드 입력까지의 연산,
해당 노드 입력에 활성화 함수 연산을 통해 노드 출력값을 계산한다.
노드 내 활성화 함수 연산을 위한 activation_function 클래스 호출
# 활성화 함수
class activation_function:
# 시그모이드 함수
def sigmoid(self, x):
return 1 / (1+np.e**-x)
# 시그모이드 함수의 미분 함수
def sigmoid_diff(self, x):
return x * (1 - x)
시그모이드 함수를 활성화 함수로 사용한다.
이를 통해 노드 출력값을 계산할 수 있다.
node_output = self.activation.sigmoid(node_input)
self.node_output.append(node_output)
이 노드 출력은 출력 가중치에 의한 행렬곱 연산을 통해 예측값을 계산한다.
# 예측값 계산
predict = result_w @ node_output
self.predict.append(self.activation.sigmoid(predict))
가중치와 행렬곱 연산과 함께 활성화 함수 연산을 통해 예측값을 구할 수 있다.
다음 노드의 입력값은 이전 출력에 대한 가중치를 통해 구할 수 있다.
# 순환 노드의 다음 노드 입력값의 계산
before = self.before_w @ predict
해당 값에는 활성화 함수 연산을 하지 않는다.
'implement_ml_models > RNN' 카테고리의 다른 글
implement_RNN (delta-to-sequence 2) (0) | 2023.02.26 |
---|---|
implement_RNN (delta-to-sequence 1) (0) | 2023.02.24 |
implement_GRU(h) (0) | 2022.12.13 |
implement_GRU(g) (0) | 2022.12.13 |
implement_GRU(r) (0) | 2022.12.13 |