# 환경셋팅
import numpy as np
import random # 파이썬 랜덤수 출력하는 모듈
# simpleRNN 사용하기
# 과거 4개의 알파벳을 기억해서 다음에 등잘할 알파벳을 예측하는 모델 만들기
# hell > o
# appl > e
# 학습 데이터 hello, apple, lobby, daddy, hobby
# h, e, l, o, a, p, d, b, y => 9개
# 알파벳 하나가 특성 1개
# 원핫인코딩
h = [1,0,0,0,0,0,0,0,0]
# len(h)
e = [0,1,0,0,0,0,0,0,0]
l = [0,0,1,0,0,0,0,0,0]
o = [0,0,0,1,0,0,0,0,0]
a = [0,0,0,0,1,0,0,0,0]
p = [0,0,0,0,0,1,0,0,0]
d = [0,0,0,0,0,0,1,0,0]
b = [0,0,0,0,0,0,0,1,0]
y = [0,0,0,0,0,0,0,0,1]
# X(문제데이터)
# 답데이터 : o
# hello
X = np.array([[h, e, l, l],
[a, p, p, l],
[l, o, b, b],
[d, a, d, d],
[h, o, b, b]])
X
# 모델은 문자에 대한 해석 어려움 -> 수치화 학습
# y 데이터 생성
y = np.array([o, e, y, y, y])
y
# 데이터 크기 확인
X.shape, y.shape
# X크기 설명 : (sample, timestep, features)
# y크기 설명 : (sample, features)
### 모델링
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN
# 뼈대 생성
rnn_model = Sequential()
# 층 내용 정의(입력층 + 중간층)
# input_shape=(timestep, features)
rnn_model.add(SimpleRNN(units=2, activation='tanh', input_shape=(4, 9)))
# 출력층
# 다중분류, units label 개수만큼 (9), 'softmax'
rnn_model.add(Dense(units=9, activation='softmax'))
# 모델 요약
rnn_model.summary()
# compile
# 다중분류 컴파일 연결
rnn_model.compile(loss='categorical_crossentropy',
optimizer='Adam',
metrics=['accuracy'])
# fit
# 반복횟수 1000
rnn_model.fit(X, y, epochs=1000)
# 예측
# 답 데이터에 대한 확률 정보 -> 9개가 출력
# 해당 알파벳에 대한 확률 정보가 크다면 -> 인덱스 확인 np.argmax()
class_names = ['h', 'e', 'l', 'o', 'a', 'p', 'd', 'b', 'y']
pre = rnn_model.predict([[h, e, l, l]])
pre
class_names[np.argmax(pre)]
댓글