데이터셋 구축하기
- 문자 하나하나를 단위로 RNN을 사용해보자!
- hello, apple, lobby, daddy, bobby
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 문제 데이터는 hell, appl, lobb, dadd, bobb
# 정답 데이터는 o, e, y, y, y
# timesteps는? 4번(순환 횟수)
# RNN 구조 파악을 위하여 직접 원핫인코딩을 해보자
# 문제 데이터
X_train = np.array(
[
# 각각의 단어들
[ [1,0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0] ], # h,e,l,l
[ [0,0,0,0,1,0,0,0,0],[0,0,0,0,0,1,0,0,0],[0,0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0,0] ], # a,p,p,l
[ [0,0,1,0,0,0,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,1,0,0] ], # l,o,b,b
[ [0,0,0,0,0,0,0,0,1],[0,0,0,0,1,0,0,0,0],[0,0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,0,1] ], # d,a,d,d
[ [0,0,0,0,0,0,1,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,1,0,0] ] # b,o,b,b
]
)
# 정답 데이터
y_train = np.array(
[
[0,0,0,1,0,0,0,0,0], # o
[0,1,0,0,0,0,0,0,0], # e
[0,0,0,0,0,0,0,1,0], # y
[0,0,0,0,0,0,0,1,0], # y
[0,0,0,0,0,0,0,1,0] # y
]
)
X_train.shape, y_train.shape
# X_train : (samples(데이터의 수), timesteps(순환횟수), features(데이터의 특성수 = 원핫인코딩 된 레이블 수))
((5, 4, 9), (5, 9))
RNN 신경망 모델링
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN
model = Sequential()
# RNN 입력층 + 중간층
# 8개의 뉴런(임의값)을 가지고 각 뉴런이 4번씩 순환하며 각 순환마다 9개의 숫자가 들어감
model.add(SimpleRNN(8, input_shape=(4, 9)))
# 출력층
# 사용되는 문자가 총 9개이고 그 중에서 정답(다음에 나올 단어)을 찾아내는 것이므로 다중분류로 볼 수 있음
model.add(Dense(9, activation='softmax'))
model.summary()
# RNN은 가중치가 두 종류가 있음(과거데이터의 가중치, 현재데이터의 가중치)
# 현재데이터의 가중치 -> 9(입력특성수) * 8(RNN층 뉴런수) + 8(RNN층 뉴런수=b값)
# 과거데이터의 가중치 -> 8(RNN층 뉴런수) * 8(RNN층 뉴런수)
# RNN층의 각 뉴런들이 뽑아낸 결과는 다시 같은층 모든 뉴런들에게 과거데이터로 들어가게 됨
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn (SimpleRNN) (None, 8) 144
dense (Dense) (None, 9) 81
=================================================================
Total params: 225
Trainable params: 225
Non-trainable params: 0
_________________________________________________________________
model.compile(loss='categorical_crossentropy',
optimizer='Adam',
metrics=['acc']
)
h = model.fit(X_train, y_train, epochs=200)
plt.figure(figsize=(15,5))
plt.plot(h.history['acc'], label='acc')
plt.legend()
plt.show()
'딥러닝' 카테고리의 다른 글
[딥러닝] OpenCV (0) | 2022.07.28 |
---|---|
[딥러닝] 로이터뉴스 카테고리분류(RNN+LSTM) (0) | 2022.07.28 |
[딥러닝] 데이터 증강(ImageDataGenerator) (0) | 2022.07.26 |
[딥러닝] VGG16 모델 (0) | 2022.07.26 |
[딥러닝] CNN 모델 (0) | 2022.07.26 |