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 |