이전까지 model=Sequential()을 이용하여 순차적 모델을 만들었었다.
케라스 딥러닝에서는 두 가지 모델을 구성하는 방식이 있는데 순차적 모델과 함수형 모델이 있다.
모델의 간결함은 순차적 모델이 좋으나 모델이 길어지고 앙상블 등의 여러 가지 기법을 사용하고자 하면 함수형 모델은 필수이다.
1:1
#1. 데이터
import numpy as np
x = np.array(range(1,101))
y = np.array(range(1,101))
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
from keras.models import Sequential, Model # Model을 추가해준다.
from keras.layers import Dense, Input # input 레이어를 추가해준다.
input1 = Input(shape=(1,)) # Input 레이어 구성, 입력 shape를 구성 1개의 컬럼이 들어가 1
dense1 = Dense(5, activation='relu')(input1) # 다음 레이어들 부터는 순차형의 시퀀스형처럼 구성하지만 상위층에서 출력된 레이어의 이름을 하위층의 가장 끝에 명시해준다.
dense2 = Dense(3)(dense1)
dense3 = Dense(4)(dense2)
output1 = Dense(1)(dense3)
model = Model(inputs = input1, outputs = output1) # model로 전체 레이어를 엮어준다.
model.summary()
총 49개의 모델을 사용한 간단한 심층 신경망
1:1 최종
#1. 데이터
import numpy as np
x = np.array(range(1,101))
y = np.array(range(1,101))
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
#2. 모델 구성
from keras.models import Sequential, Model
from keras.layers import Dense, Input
# model = Sequential()
input1 = Input(shape=(1,))
dense1 = Dense(5, activation='relu')(input1)
dense2 = Dense(3)(dense1)
dense3 = Dense(4)(dense2)
output1 = Dense(1)(dense3)
model = Model(inputs = input1, outputs = output1)
model.summary()
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
# model.fit(x.y, epochs=100, batch_size=3)
model.fit(x_train, y_train, epochs=100, batch_size=1,
validation_data=(x_val, y_val))
#4. 평가예측
mse = model.evaluate(x_test, y_test, batch_size=3)
print("mse :", mse)
y_predict = model.predict(x_test)
print(y_predict)
#RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE : ", RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print("R2 : ", r2_y_predict)
다:다
1:1일 경우 입력되는 컬럼이 1개일 경우 input_dim=1 또는 input_shape=(1,)) 였는데
지금부터는 2개 이상의 컬럼이 입력되는 경우이다.
1~100까지의 정수와 301~400까지의 정수를 사용하자.
#1. 데이터
import numpy as np
x = np.array([range(100), range(301,401)])
y = np.array([range(100), range(301,401)])
모델에 입력하기 위해서는 행과 열이 맞아야 한다. DNN의 구조에서는 차원(dimention)이 가장 중요하여, 행은 무시되고 열이 우선된다. 그래서 모델에 입력할 때 input_dim=1 또는 input_shape=(1,) 이런 파라미터를 요구하게 된다. 여기서 1은 컬럼이 1개를 나타낸다.
위 x, y 데이터 구조는 2행 100열이다. (행은 가로 열은 세로)
print(x.shape)
print(y.shape)
결과
(2,100)
(2,100)
원래 원하는 구조는 100행 2열인데 행과 열을 바꿔주는 넘파이 transpose()라는 함수가 있다.
x = np.transpose(x)
y = np.transpose(y)
print(x.shape)
print(y.shape)
결과
(100,2)
(100,2)
이제 input_dim=2로 가능하게 데이터의 구조가 만들어졌다.
데이터를 train, test, val로 분리한 후 모델을 구성하겠다. 비율은 6:2:2
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_val, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
# model.add(Dense(5, input_dim = 2, activation ='relu'))
model.add(Dense(5, input_shape = (2, ), activation ='relu'))
model.add(Dense(3))
model.add(Dense(4))
model.add(Dense(2))
input_dim = 1 에서 2로 바뀌고 최종 아웃풋이 1에서 2로 바뀜
#1. 데이터
import numpy as np
x = np.array([range(100), range(301,401)])
y = np.array([range(100), range(301,401)])
#print(x.shape)
#print(y.shape)
x = np.transpose(x)
y = np.transpose(y)
#print(x.shape)
#print(y.shape)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
# model.add(Dense(5, input_dim = 2, activation ='relu'))
model.add(Dense(5, input_shape = (2, ), activation ='relu'))
model.add(Dense(3))
model.add(Dense(4))
model.add(Dense(2))
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=300, batch_size=1,
validation_data=(x_val, y_val))
#4. 평가 예측
mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse :", mse)
y_predict = model.predict(x_test)
# print(y_predict)
#RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE : ", RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print("R2 : ", r2_y_predict)
다:1
다:1 모델은 다:다 모델에서 아웃풋만 1개인 경우
#1. 데이터
import numpy as np
x = np.array([range(100), range(301,401)])
y = np.array(range(201,301))
x = np.transpose(x)
100개의 데이터씩 2개의 컬럼이 입력되고, 100개의 데이터 1개가 출력되는 구조이며 인풋과 아웃풋의 shape만 조절하자.
모델에 적합하게 reshape. 이때 y는 (100, )이므로 (1행 100열이 아니고, 벡터가 100개) transpose가 필요 없다. 최종 아웃풋만 1로 변경
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
# model.add(Dense(5, input_dim = 2, activation ='relu'))
model.add(Dense(5, input_shape = (2, ), activation ='relu'))
model.add(Dense(3))
model.add(Dense(4))
model.add(Dense(1))
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=300, batch_size=1,
validation_data=(x_val, y_val))
#4. 평가 예측
mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse :", mse)
y_predict = model.predict(x_test)
# print(y_predict)
#RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE : ", RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print("R2 : ", r2_y_predict)
최종 소스
#1. 데이터
import numpy as np
x = np.array([range(100), range(301,401)])
y = np.array(range(201,301))
x = np.transpose(x)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
# model.add(Dense(5, input_dim = 2, activation ='relu'))
model.add(Dense(5, input_shape = (2, ), activation ='relu'))
model.add(Dense(3))
model.add(Dense(4))
model.add(Dense(1))
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=300, batch_size=1,
validation_data=(x_val, y_val))
#4. 평가 예측
mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse :", mse)
y_predict = model.predict(x_test)
# print(y_predict)
#RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE : ", RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print("R2 : ", r2_y_predict)
1:다
1개의 컬럼이 입력되어 여려 개의 컬럼으로 출력되는 경우. 데이터 자체로 판단해서는 다소 이상한 모델.
#1. 데이터
import numpy as np
x = np.array([range(100)])
y = np.array([range(201,301), range(301,401)])
x = np.transpose(x)
y = np.transpose(y)
print(x.shape)
print(y.shape)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, random_state=66, test_size=0.4, shuffle=False
)
x_val, x_test, y_val, y_test = train_test_split(
x_test, y_test, random_state=66, test_size=0.5, shuffle=False
)
print(x_test.shape)
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
# model.add(Dense(5, input_dim = 3, activation ='relu'))
model.add(Dense(5, input_shape = (1, ), activation ='relu'))
model.add(Dense(3))
model.add(Dense(4))
model.add(Dense(2))
#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=300, batch_size=1,
validation_data=(x_val, y_val))
#4. 평가 예측
mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse :", mse)
y_predict = model.predict(x_test)
# print(y_predict)
#RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE : ", RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print("R2 : ", r2_y_predict)
x = (100,1) y는 (100,2)의 shpae를 가지고 있는 데이터이다. 입력과 출력의 shape 만 수정하였다.
입력 모델의 input_shpae가 1로 바뀌었고 아웃풋을 2로 변경했다.
predict 한 부분의 값이 엉망이다. 원하는 값이 나온 것 같지 않다. RMSE도 높은 수치이고, R는 아예 음수이다. 결과가 좋지 않지만 이런 모델도 있다.
'AI > DeepLearning' 카테고리의 다른 글
회귀 모델 정리 - 함수형 모델 (0) | 2020.07.11 |
---|---|
회귀 모델 정리 - 순차모델 (0) | 2020.07.07 |
회귀 모델 4 R2, RMSE 추가 (0) | 2020.06.27 |
회귀 모델 3 훈련세트, 검증세트, 테스트세트 분리 (0) | 2020.06.26 |
회귀모델의 판별식 R2, RMSE (0) | 2020.06.23 |