AI/DeepLearning

RNN 모델 정리 2

soccerda 2020. 10. 10. 03:16
반응형

6. MLP DNN(다입력 다:다)

2개의 컬럼에 각 3개씩 데이터를 입력받아, 2개의 값으로 출력되는 모델을 만들자.

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

 

 

(10,3)의 데이터이다. split_xy3 함수를 이용하여 x를 2개 컬럼 3개씩 , y를 1개 컬럼 2개씩 다음 형태로 잘라준다.

x y
1 11 21
2 12 22
3 13 23
4 14 24
5 15 25
6 16 26
7 17 27
8 18 28
9 19 29
10 20 30
def split_xy3(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column - 1
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :-1]
    tmp_y = dataset[x_end_number-1 : y_end_number, -1] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy3(dataset, 3, 2) 

#print(x, "\n", y)
print(x.shape)
print(y.shape)

실행결과 

(7,3,2)

(7,2)

x의 shape는 (7,3,2) y의 shape (7,2)이므로 RNN에 넣기에 적합하게 잘 잘렸다. 모델을 구성하자

 

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(LSTM(64, input_shape=(3, 2)))
model.add(Dense(2))

x의 shape는 (7,3,2)이고, y의 shape는 (7,2)이므로 input_shape는 (3,2)이고 output은 Dense(2)이다.

훈련과 평가 예측은 MLP RNN 모델(다입력 다:1)과 동일하다. x_pred값의 shape만 주의하자.

 

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[9,10,11],[19,20,21]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] , x_pred.shape[1])
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

mse : 0.012044521048665047

(1, 3, 2)

[[28.9687 29.90554]]

 

7. MLP DNN 모델(다입력 다:다)

이번에는 앞에서 만들었던 RNN 모델을 DNN으로 리파인해보자.

 

input의 shape만 주의해서 reshape만 잘 하면 어떤 모델이든 잘 돌아간다.

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

(10,3)의 데이터이다. split_xy3 함수를 이용하여 x를 2개 컬럼 3개씩, y를 1개 컬럼 2개씩 다음 형태로 잘라준다.

 

x y
1 11 21
2 12 22
3 13 23
4 14 24
5 15 25
6 16 26
7 17 27
8 18 28
9 19 29
10 20 30
def split_xy3(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column - 1
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :-1]
    tmp_y = dataset[x_end_number-1 : y_end_number, -1] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy3(dataset, 3, 2) 

#print(x, "\n", y)
print(x.shape)
print(y.shape)

실행결과

(7,3,2)

(7,2)

 

y는 모델에 입력할 수 있는 적합한 형태이나, x는 DNN 모델에 입력할 수 있도록 reshape해주어야 한다.

RNN의 입력 shape는 3차원이고, DNN의 입력 shape는 2차원이므로 (7,3,2)의 shape를 (7, 3*2)로 reshape해주면 된다.

 

x = x.reshape(x.shape[0], x.shape[1] * x.shape[2])
print(x.shape)

실행 결과

(7,6)

 

x값도 이제 DNN에 넣을 수 있는 2차원 shape로 변경했다. 

 

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
#model.add(LSTM(64, input_shape=(3, 2)))
model.add(Dense(64, input_shape=(6,)))
model.add(Dense(2))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

예측값 역시 DNN모델에 맞도록 2차원으로 변경하자.

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[9,10,11],[19,20,21]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])
print(x_pred.shape)

 

실행 결과

(1,6)

x_pred를 입력하고 실행하자

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

실행결과

 

mse : 4.884506132896149e-09 (1, 6) [[31.00003 32.000168]

 

 

전체 소스

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy3(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column - 1
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :-1]
    tmp_y = dataset[x_end_number-1 : y_end_number, -1] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy3(dataset, 3, 2) 

#print(x, "\n", y)
print(x.shape)
print(y.shape)

x = x.reshape(x.shape[0], x.shape[1] * x.shape[2])
print(x.shape)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
#model.add(LSTM(64, input_shape=(3, 2)))
model.add(Dense(64, input_shape=(6,)))
model.add(Dense(2))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[9,10,11],[19,20,21]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

 

 

8. RNN 모델(다입력 다:다 두 번째)

이번엔 전체 컬럼을 행 별로 잘라서 시계열 데이터를 만든 데이터로 RNN 모델을 구현해보자.

1 11 21  
2 12 22 x
3 13 23  
4 14 24 y
5 15 25  
6 16 26  
7 17 27  
8 18 28  
9 19 29  
10 20 30  

 

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

(10,3)의 데이터를 준비하자. slplit_xy5 함수를 이용하여 데이터를 자르자.

 

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 1) 

print(x, "\n", y)
print(x.shape)
print(y.shape)

x의 shape는 (7,3,3), y의 shape는 (7,1,3)으로 잘랐다. x의 데이트는 RNN의 input_shape에 맞으나 y값은 아웃풋에 맞으려면 2차원이 되어야 하므로 reshape하도록 하자.

 

y = y.reshape(y.shape[0], y.shape[2])
print(y.shape)

 

실행결과

(7,3)

 

y의 shape인 (7,1,3)을 (7,3)으로 reshape 했다.

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(LSTM(64, input_shape=(3, 3)))
model.add(Dense(3))

x의 shape가 (7,3,3)이므로 input_shape는 (3,3)이 되고 y의 shape가 (7,3)이므로 최종 아웃풋 레이어의 Dense의 출력은 3이 된다.

 

훈련은 동일하다

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

mse로 평가한다.

mse : 0.002653567586094141

평범한 값이 나왔다.

 

 

predict를 할 데이터를 준비하자

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
print(x_pred)
print(x_pred.shape)

[[ 8 9 10]

[ 18 19 20]

[28 29 30]]

(3, 3)

3행 3열로 출력이 되지만 자세히 보면 뭔가 다르다. 열과 행이 바뀌었다. 원래 필요한 데이터는 

8 18 28

9 19 29

10 20 30

 

trnaspose를 사용하여 열과 행을 바꾸자.

 

[[10.078248 20.175526 30.064285]]

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
print(x_pred)
print(x_pred.shape)

실행겨로가

[[[ 8 18 28]

[ 9 19 29]

[10 20 30]]]

(3, 3)

 

현재 x_pred의 차원은 2차원이라 3차원으로하여 정상적인 입력값으로 변환하자.

x_pred = x_pred.reshape(1, x_pred.shape[0], x_pred.shape[1])

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

[[10.078248 20.175526 30.064285]]

원래 예측값은 11,21,31인데 좀 차이가 난다. 튜닝하자.

 

전체소스

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 1) 

print(x, "\n", y)
print(x.shape)
print(y.shape)

y = y.reshape(y.shape[0], y.shape[2])
print(y.shape)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(LSTM(64, input_shape=(3, 3)))
model.add(Dense(3))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0], x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

 

9. DNN 모델 (다입력 다:다 두 번째

앞에서 했던 RNN 모델을 DNN으로 변경하자. (10,3)의 데이터를 준비하자.

 

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

 

x와 y를 분리하자

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 1) 

print(x, "\n", y)
print(x.shape)

y = y.reshape(y.shape[0], y.shape[2]
print(y.shape)

 

현재 x의 shape는 (7,3,3)이고 y의 shape는 (7,3)이다. y는 DNN에 넣을 수 있는 출력 형태가 되었으나, x는 차원이 1개가 더 많다. reshape하자

x = x.reshape(x.shape[0], x.shape[1]*x.shape[2])
print(x.shape)

실행 결과

(7,9)

 

 

DNN에 입력할 수 있는 2차원의 형태로 변환했다.

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(Dense(64, input_shape=(9, )))
model.add(Dense(3))

LSTM일 경우 inut_shape가 (3,3)이던 것을 DNN으로 바꾸면서 (3*3) = (9,)로 바꿨다.

 

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

x_pred의 shape는 (3,3)이다. DNN 모델에서 사용할 수 있도록 (1,9)로 reshape 하자.

 

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

최종 실행 결과

 

mse : 1.6598276572632464e-11

[[10.999997 21. 30.999998]]

mse는 아주 낮은 값이 나왔고, 예측 결과도 매우 좋게 나왔다.

 

전체 소스

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 1) 

print(x, "\n", y)
print(x.shape)

x = x.reshape(x.shape[0], x.shape[1]*x.shape[2])
print(x.shape)

y = y.reshape(y.shape[0], y.shape[2])
print(y.shape)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(Dense(64, input_shape=(9, )))
model.add(Dense(3))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

 

 

10. RNN 모델(다입력 다:다 세 번째)

전체 컬럼의 위에서부터 3행을 x로 그 다음 2행을 y로 구성하는 데이터이다.

1 11 21
2 12 22
3 13 23
4 14 24
5 15 25
6 16 26
7 17 27
8 18 28
9 19 29
10 20 30

10행 3열 데이터를 준비하자.

 

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

split_xy5함수를 준비해 dataset을 3행과 2행으로 나눈다.

 

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 2) 

print(x, "\n", y)
print(x.shape)
print(x.shape)

실행 결과

(6,3,3)

(6,2,3)

 

x의 shape는 (6,3,3), y의 shape는 (6,2,3)으로 x는 RNN에 입력할 수 있는 3차원 shape가 되었으나, y는 출력 아웃풋이 shape인 2차원이 아니라서 y를 2차원으로 reshape하도록 하자.

 

y = y.reshape(y.shape[0], y.shape[1] * y.shape[2])
print(y.shape)

실행결과 (6,6)

 

y의 출력에 맞는 차원으로 잘 reshape되었다.

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(LSTM(64, input_shape=(3, 3)))
model.add(Dense(6))

input LSTM이므로 3차원의 구조를 가지고 input_shape(3,3)의 구조를 가진다.

아웃풋은 (6,3,2)를 2차원으로 reshape한 (6,6)의 구조이다.

 

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

mse : 0.021899471059441566

 

 

x_pred = np.array([[8,9,10],[18,19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0], x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

[[ 9.039297 19.089817 29.112782 9.962656 19.91906 30.110039]]

 

mse 결과가 별로 좋지 않아서인지, 예측값이 그리 썩 좋지 않다. 일반적으로 생각하면 11,21,31,12,22,32가 나와야 하지만 많이 어긋난다.

 

전체소스

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 1) 

print(x, "\n", y)
print(x.shape)

x = x.reshape(x.shape[0], x.shape[1]*x.shape[2])
print(x.shape)

y = y.reshape(y.shape[0], y.shape[2])
print(y.shape)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(Dense(64, input_shape=(9, )))
model.add(Dense(3))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[8,9,10],[18, 19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

 

11. DNN 모델 (다입력 다:다 세 번째)

이전 RNN모델을 DNN으로 변경하자.

 

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 2) 

RNN을 DNN으로 구성을 변경하는 것이니 x의 차원을 3차원에서 2차원으로 바꾼다. 현재 x의 shape가 (6,3,3)이므로 (6,9)으로 차원을 바꾸자. y 역시 현재 3차원으로 (6,2,3)이므로 2차원 형태인 (6,6)으로 변경하자.

 

x = x.reshape(x.shape[0], x.shape[1] * x.shape[2])
print(x.shape)
y = y.reshape(y.shape[0], y.shape[1] * y.shape[2])
print(y.shape)

실행결과 

(6,9)

(6,9)

 

x와 y가 모두 3차원에서 2차원으로 잘 reshape가 되었다. 

 

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM

model = Sequential()
model.add(Dense(64, input_shape=(9, )))
model.add(Dense(6))

LSTM 모델 레이어를 Dense 모델 레이어로 변경해준다.

 

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

실행결과

mse : 5.922705104133286e-10

mse가 상당히 좋은 값이다. LSTM 때보다 더 나은 결과이다.

 

새로운 데이터로 예측하자.

x_pred = np.array([[8,9,10],[18,19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

입력 데이터를 reshape하는 부분을 주의 깊게 보자. (3,3)의 shape를 (1,3*3)으로 reshape했다.

실행결과

[[11.000045 21.000067 31.000088 12.000045 22.000002 32.000027]]

LSTM으로 했을 때보다 훨씬 더 좋은 결과가 나왔다.

분명 시계열일 경우에는 LSTM이 DNN보다 우수하다고 했는데 의외이다. 이유는 하이퍼파라미터 튜닝과 데이터의 크기 때문이다.

 

파라미터 튜닝이 잘 안 될 경우에는 DNN의 경우 1차 함수(y=wx+b)를 충실히 따르기 때문에 적은 데이터에서도 더 좋은 결과가 나올 수 있다.

하지만 DNN이든 LSTM이든 간에 어떤 것이 좋다는 건 결국 사용자의 주관적인 평가 결과로 나올 수 있고, 파라미터 튜닝과 전처리를 통해서 더 좋으 모델을 만들 수 있다.

 

전체 소스

 

#1. 데이터 
import numpy as np 
dataset = np.array([[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],[21,22,23,24,25,26,27,28,29,30]]) 
print("dataset.shape ", dataset.shape)

dataset = np.transpose(dataset)
print(dataset)
print("dataset.shape :", dataset.shape)

def split_xy5(dataset, time_steps, y_column): 
  x, y = list(), list() 
  for i in range(len(dataset)): 
    x_end_number = i + time_steps 
    y_end_number = x_end_number + y_column
    if y_end_number > len(dataset):  
      break 
    tmp_x = dataset[i:x_end_number, :]
    tmp_y = dataset[x_end_number : y_end_number, :] 
    x.append(tmp_x) 
    y.append(tmp_y) 
  return np.array(x), np.array(y) 

x, y = split_xy5(dataset, 3, 2) 

print(x, "\n", y)
print(x.shape)
print(y.shape)

x = x.reshape(x.shape[0], x.shape[1] * x.shape[2])
print(x.shape)
y = y.reshape(y.shape[0], y.shape[1] * y.shape[2])
print(y.shape)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense, LSTM


model = Sequential()
model.add(Dense(64, input_shape=(9, )))
model.add(Dense(6))

#3. 훈련
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=300, batch_size=1)

#4. 평가, 예측
mse = model.evaluate(x, y, batch_size=1)
print("mse :", mse)

x_pred = np.array([[8,9,10],[18,19,20],[28,29,30]])
x_pred = np.transpose(x_pred)
x_pred = x_pred.reshape(1, x_pred.shape[0] * x_pred.shape[1])

print(x_pred)
print(x_pred.shape)

y_pred = model.predict(x_pred, batch_size=1)
print(y_pred)

 

 

 

반응형

'AI > DeepLearning' 카테고리의 다른 글

RNN 모델 정리 1  (0) 2020.10.08
RNN용 데이터 자르기  (0) 2020.10.06
케라스 모델의 파라미터들과 기타 기법들  (0) 2020.10.06
시계열 모델 1 RNN  (0) 2020.10.05
회귀 모델 정리 - 앙상블 및 기타 모델  (0) 2020.07.13