1:1모델
데이터 입력과 출력은 Sequential과 동일하다.
#1. 데이터
# 1~7까지 데이터를 훈련시키고 8~10 데이터로 평가, 훈련이 잘되었나 11~13 예측
import numpy as np
x_train = np.array([1,2,3,4,5,6,7])
y_train = np.array([1,2,3,4,5,6,7])
x_test = np.array([8,9,10])
y_test = np.array([8,9,10])
x_predict = np.array([11,12,13])
#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input
input1 = Input(shape=(1,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(1)(dense3)
model = Model(inputs = input1, outputs= output1)
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
# loss는 mse로 구성하여 최저의 손실 값을 구하고 이를 구하기 위한 optimizer는 adam을 사용한다.
# 훈련 내용을 보여주기 위해 metrics는 mse를 사용
# x_train과 t_train을 총 100번 훈련시키고, batch_size 1개씩 잘라 사용한다. default batch_size는 16
#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)
y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)
# x_test 와 y_test로 평가하고, x_predict 11,12,13으로 예측값을 확인한다.
결과값
('mse : ', 9.654983301743414e-08) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[10.999571], [11.999509], [12.999448]], dtype=float32))
Sequential 모델은 위에서 먼저 model=Sequential()로 선언하지만, 함수형 모델은 마지막에 model=Model(inputs, outpus)로 선언하는 차이가 있다.
첫 번째 히든 레이어는 100개, 두 번째는 30개, 세 번째는 5개, 최종 아웃풋 레이어는 1개로 레이어와 노드를 구성한다.
훈련할 때 loss는 mse로 구성하여 최저의 손실 값을 구하고, 이를 구하기 위한 optimizer는 adam을 사용한다. 훈련 내용을 보여주기 위해 metrics는 mse를 사용하며 x_train과 y_train을 총 100번 훈련시키고, batch_size는 1개씩 잘라 사용한다.
다:다
#1. 데이터
# 1~7까지 데이터를 훈련시키고 8~10 데이터로 평가, 훈련이 잘되었나 11~13 예측
import numpy as np
x_train = np.array([[1,2,3,4,5,6,7], [11,12,13,14,15,16,17]])
y_train = np.array([[1,2,3,4,5,6,7], [11,12,13,14,15,16,17]])
x_test = np.array([[8,9,10], [18,19,20]])
y_test = np.array([[8,9,10], [18,19,20]])
x_predict = np.array([[21,22,23], [31,32,33]])
print(x_train.shape)
print(x_test.shape)
print(x_predict.shape)
x_train = np.transpose(x_train)
y_train = np.transpose(y_train)
x_test = np.transpose(x_test)
y_test = np.transpose(y_test)
x_predict = np.transpose(x_predict)
print(x_train.shape)
print(x_test.shape)
print(x_predict.shape)
#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input
input1 = Input(shape=(2,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(2)(dense3)
model = Model(inputs = input1, outputs= output1)
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
# loss는 mse로 구성하여 최저의 손실 값을 구하고 이를 구하기 위한 optimizer는 adam을 사용한다.
# 훈련 내용을 보여주기 위해 metrics는 mse를 사용
# x_train과 t_train을 총 100번 훈련시키고, batch_size 1개씩 잘라 사용한다. default batch_size는 16
#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)
y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)
('mse : ', 0.15481813251972198) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[17.33848 , 31.649454], [18.075365, 32.68336 ], [18.812252, 33.717266]], dtype=float32))
인풋 칼럼이 2개이므로 input_shape=(2,)가 된다. 함수형 모델에서는 input_dim을 사용하지 않는다.
아웃풋 컬럼 역시 2개이므로 최종 레이어를 2로 구성한다.
훈련 및 예측 코드는 1:1과 동일하다.
결과 값은 mse가 0.15 정도로 괜찮게 나온 편이나, 예측한 값이 오차가 크다. 레이어와 노드의 개수를 조절하여 정확도를 높여야 된다.
다:1
#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5,6,7,], [11,12,13,14,15,16,17]])
y_train = np.array([1,2,3,4,5,6,7,])
x_test = np.array([[8,9,10], [18,19,20]])
y_test = np.array([8,9,10])
x_predict = np.array([[21,22,23], [31,32,33]])
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
print(x_predict.shape)
x_train = np.transpose(x_train)
x_test = np.transpose(x_test)
x_predict = np.transpose(x_predict)
print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)
#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input
input1 = Input(shape=(2,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(1)(dense3)
model = Model(inputs = input1, outputs= output1)
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)
y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)
('mse : ', 0.12049577385187149) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[19.077766], [19.992508], [20.90725 ]], dtype=float32))
예측결과는 우리가 생각하는 값(21,22,23)과는 거리가 멀다. 그러나 사실 선형 회귀모델을 그릴 때 입력된 2개의 x값의 범위 자체가 다르기 때문에 어쩌면 나쁘지 않을 수도 있다. 레어이와 노드의 개수를 조절해서 예측값을 조금 더 올리자!
1:다
#1. 데이터
import numpy as np
x_train = np.array([1,2,3,4,5,6,7,])
y_train = np.array([[1,2,3,4,5,6,7,], [11,12,13,14,15,16,17,]])
x_test = np.array([8,9,10])
y_test = np.array([[8,9,10], [18,19,20]])
x_predict = np.array([11,12,13])
print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)
y_train = np.transpose(y_train)
y_test = np.transpose(y_test)
print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)
#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input
input1 = Input(shape=(1,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(2)(dense3)
model = Model(inputs = input1, outputs= output1)
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)
y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)
('mse : ', 6.1819305419921875) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[ 8.178242 , 25.047277 ], [ 8.761525 , 26.65223 ], [ 9.3448105, 28.257185 ]], dtype=float32))
예측값은 범위를 좀 많이 벗어났다. 하이퍼파라미터 튜닝을 좀 더 해서 mse를 더 낮추고 예측값을 올리는 작업이 필요하다.
'AI > DeepLearning' 카테고리의 다른 글
시계열 모델 1 RNN (0) | 2020.10.05 |
---|---|
회귀 모델 정리 - 앙상블 및 기타 모델 (0) | 2020.07.13 |
회귀 모델 정리 - 순차모델 (0) | 2020.07.07 |
회귀 모델 5 - 함수형 모델 (1:1, 다:다, 다:1, 1:다) (0) | 2020.07.01 |
회귀 모델 4 R2, RMSE 추가 (0) | 2020.06.27 |