728x90
SimpleRNN
가장 간단한 형태의 RNN 레이어
x: 입력값, h: 출력값, U와 W는 입출력에 곱해지는 가중치
활성화 함수로는 tanh가 쓰인다. (ReLU 같은 다른 활성화 함수를 사용할 수도 있음)
레이어 생성 코드
rnn1 = tf.keras.layers.SimpleRNN(units=1, activation='tanh', return_sequences=True) |
units: 뉴런의 수, return_sequences: 시퀀스 전체를 출력할지 여부 (여러 개 RNN레이어 쌓을 때 쓰임)
예제
[0.0, 0.1, 0.2, 0.3]이라는 연속된 숫자가 주어졌을 때 [0.4]를 예측하는 네트워크를 만들자
-학습 데이터 생성
X=[] Y=[] for i in range(6): #정수 시퀀스 만들기 lst = list(range(i, i+4)) #구한 시퀀스의 숫자들을 각각 10으로 나눈 다음 저장 #simpleRNN에 하나씩 숫자가 들어가기 떄문에 분리해서 배열에 저장 X.append(list(map(lambda c: [c/10], lst))) #정답에 해당하는 4, 5 등의 정수도 10으로 나눠서 저장 Y.append((i+4)/10) X=np.array(X) Y=np.array(Y) for i in range(len(X)): print(X[i], Y[i]) |
-학습 모델 만들기
model = tf.keras.Sequential([ tf.keras.layers.SimpleRNN(units=10, return_sequences=False, input_shape=[4,1]), tf.keras.layers.Dense(1) ]) model.compile(optimizer='adam', loss='mse') model.summary() |
input_shape의 [4,1]는 각각 timesteps, input_dim을 나타낸다.
타임스텝: 순환 신경망이 입력에 대해 계산을 반복하는 횟수
input_dim: 입력 벡터의 크기
=>X는 [1,4,1]차원 벡터
4 타임스텝에 걸쳐 입력받고, 마지막에 출력값을 다음 레이어로 반환
추가한 dense 레이어는 별도 활성화 함수 X = h3은 바로 y3이 된다.
이 값과 0.4의 차이가 mse가 된다. (mean squared error)
-훈련
model.fit(X, Y, epochs=100, verbose=0) print(model.predict(X)) |
verbose = 0: 훈련 과정에서의 출력이 나오지 않게 함 (출력 볼 필요없고 훈련만 시키고 싶을때 유용)
얼추 비슷하게 예측하고 있음을 확인 할 수 있다.
그렇다면 학습과정에서 본 적이 없는 테스트 값을 넣어보자
print(model.predict(np.array([[[0.6],[0.7],[0.8],[0.9]]]))) print(model.predict(np.array([[[-0.1],[0.0],[0.1],[0.2]]]))) |
결과를 개선하려면 훈련 데이터를 더 많이 넣어주는 것이 좋다. 하지만 많은 값을 훈련데이터에 넣더라도 테스트 데이터에 대한 시퀀스를 정확히 예측하게 하는 것은 쉬운 문제가 아니다.
SimpleCNN은 가장 간단한 형태이며 빠르게 모델 만들어볼 때 유용하다.
728x90
반응형
'Machine Learning > Tensorflow' 카테고리의 다른 글
[순환 신경망] 긍정, 부정 감정 분석 (0) | 2021.01.27 |
---|---|
[순환신경망]GRU 레이어 (0) | 2021.01.25 |
[순환 신경망] LSTM 레이어 (0) | 2021.01.15 |
순환 신경망 (RNN) (0) | 2021.01.15 |