파이썬/딥러닝

[딥러닝] Simple RNN 단어의 다음 알파벳 맞추기 [광주인공지능학원]

취준생코린이 2021. 8. 22. 23:41
728x90

오늘은 광주인공지능학원에서 진행된 알파벳 맞추기를 진행하겠습니다

(본 글의 자료는 광주인공지능학원에서 제공되었습니다.)

 

CNN 입력값 파라미터

  • (sample, height, weight, chanel)
  • sample: 데이터의 수
  • height: 세로
  • weight: 가로
  • chanel: 1 (grayscale) 3 (RGB) 4(RGBA) * A 투명도

 

RNN 파라미터

  • (sample, timesteps, features)
  • sample: 데이터의 수
  • timesteps: 몇 단계로 이루어 질것인지
    • 내일 주식가격 예측을 위해서 과거 5일의 데이터를 가져옴: 5

나는 오늘 집에 가서 밥을 __: 5

  • features: 특징의 수
    • 예를들어) 음악: 미 레 도 레 _ 음계: features: 1 음계, 박자: features: 2

 

문제) 다음주 에너지 사용량 맞추기

  • 사용되는 데이터는 이전 4주차 에너지 데이터
  • 에너지가 사용되는 건물 전체의 에너지 데이터
  • 총 20명 학생에게 데이터를 받아옴

답)

sample: 20

timestep: 4

features: 1

 

 


SimpleRNN 사용하기

  • hello
  • hell을 썼을때 o를 맞추는 모델
  • 과거 4개의 char를 이용해서 다음에 등장할 char를 예측하는 모델 만들기

hello, apple, lobby, daddy, bobby, holly, bubbl, olleh각 char를 원 핫 인코딩으로 수치화 시키자

  • h, e, l, o, a, p, b, d, y, u
  • 총 10개 단어 사용
  • feature: 10개

원핫 인코딩을 시키면

  • h: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  • e: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  • l: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
  • o: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
  • a: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
  • p: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
  • b: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
  • d: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
  • y: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
  • u: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

 

import numpy as np

 

다음과 같이 단어에 마지막 알파벳을 제외한 알파벳을 배열로 만들어줍니다.

hello, apple, lobby, daddy, bobby, holly, bubbl, olleh
X_train = np.array([[
    [['h'],['e'],['l'],['l']],
    [['a'],['p'],['p'],['l']],
    [['l'],['o'],['b'],['b']],
    [['d'],['a'],['d'],['d']],
    [['b'],['o'],['b'],['b']],
    [['h'],['o'],['l'],['l']],
    [['b'],['u'],['b'],['b']],
    [['o'],['l'],['l'],['e']]
]])

 

 그후에 

  • h: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  • e: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  • l: [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
  • o: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
  • a: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
  • p: [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
  • b: [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
  • d: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
  • y: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
  • u: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

이 위에 써진대로 알파벳을 벡터형식으로 바꿔줍니다. 

X_train = np.array([
    [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 1, 0, 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, 0, 0, 0, 1, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0]],
    [[0, 0, 1, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0, 0, 0]],
    [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],[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, 0, 1, 0, 0]],
    [[0, 0, 0, 0, 0, 0, 1, 0, 0, 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, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]],
    [[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]],
    [[0, 0, 0, 1, 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, 0, 0]]
])

 

정답값인 y값도 똑같이 벡터로 바꿔줍니다.

여기서 정답값이란 hello에서의 o입니다.

apple에서는 e, lobby에서는 y 등

y_train = np.array([
    [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0],
    [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
])

 

X_train.shape, y_train.shape

저랑 똑같은 단어로 똑같이 만들었다면 X_train, y_train의 행렬은 위와 같아야 합니다.

 

반응형

그럼 이제 딥러닝 모델을 만들겁니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN

 

# hello, apple, lobby, daddy, bobby, holly, bubbl, olleh
model = Sequential()

# timesteps: 4
# features: 10
# 입력, 은닉
model.add(SimpleRNN(3, input_shape = (4, 10))) # sample, (timestep, features)

# 출력
model.add(Dense(10, activation = "softmax")) # 다중분류

model.summary()

 

 

# 컴파일
model.compile(loss = 'categorical_crossentropy',
                 optimizer = 'adam',
                 metrics = ['accuracy'])
history1 = model.fit(X_train, y_train, epochs = 800, batch_size=30)

저는 일단 간단한 연습이기 때문에 반복은 800만 잡아줬습니다.

 

만들어진 모델로 예측을 진행해봅시다.

# 예측
# 문제: apple
# 정답: e > [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] > class: 1
model.predict_classes([[[0, 0, 0, 0, 1, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0]]])

 예측이 결과가 1이 나올걸 보니 예측이 잘된걸 확인할 수 있습니다.

 

다음은 반복횟수별 train의 예측값이 얼마나 나온지를 확인할 수 있습니다.

import matplotlib.pyplot as plt
acc = history1.history['accuracy']
# val_acc = history1.history['val_accuracy']

epoch = range(1, len(acc)+1)

plt.plot(epoch, acc, c = 'red', label = 'Train acc')
# plt.plot(epoch, val_acc, c = 'blue', label = 'Test acc')
plt.legend()
plt.plot()

 

더 자세한 사항은 광주인공지능학원에서!!

 

 

 

광주인공지능학원에서 진행된 수업을 기반으로 작성되었습니다.

 

[광주인공지능학원 링크]

https://www.smhrd.or.kr/

 

728x90