AI/DeepLearning

케라스 모델의 파라미터들과 기타 기법들

soccerda 2020. 10. 6. 00:57
반응형
#2. 모델구성
from keras.models import load_model
model = load_model("savetest01.h5")

from keras.layers import Dense  #추가
model.add(Dense(1)) #추가

model.summary()​
#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=1)

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)

y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

1. verbose

 

model.fit과 predict에서 사용하는 파라미터이다. LSTM 소스를 예제로 하겠다.

 

#1. 데이터

import numpy as np

x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])

y_train = np.array([6,7,8])



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



print("x_train.shape : ", x_train.shape) #(3,5,1)

print("y_train.shape : ", y_train.shape) #(3,)



#2. 모델구성

from keras.models import Sequential

from keras.layers import Dense, LSTM

model = Sequential()



model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))

model.add(Dense(4))

model.add(Dense(1))



model.summary()



#3. 훈련

model.compile(loss='mse', optimizer='adam', metrics=['mse'])

model.fit(x_train, y_train, epochs=100, batch_size=1)



#4. 예측

x_predict = np.array([[4,5,6,7,8]])

print(x_predict.shape) #(1,5)

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

print("x_predict.shape : ", x_predict.shape) # (1,5,1)



y_predict = model.predict(x_predict)

print("예측값 :", y_predict)

model.fit에 verbose를 추가하자.

model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=0)

 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=0)

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)

y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

실행하면 터미널 창에 훈련하는 과정이 나타나지 않는다. 만약 많은 데이터를 훈련한다면 속도를 지연할 수도 있다. 이 때 verbose=0을 사용하면 조금이나마 단축할 수 있다. 

 

model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=1)

을 하면 없을 때랑 동일하다 지정하지 않으면 verbose는 디폴트 값이 1이라 그렇다.

 

verbose=1일 때 화면에 두 가지를 보여준다. 먼저 진행 상황을 보여주고, 그 다음 훈련되고 있는 두 가지에 대해 출력값을 보여준다.

 

첫 번째는  loss이다. 모델을 compile 할 때 loss를 지정한다. 이 소스에서는 mse로 지정했다. 이 loss에 대해서 명시된다.

그리고 두 번째로 metrics에 명시한 것을 보여준다.

 

model.compile(loss='mse', optimizer='adam', metrics=['mse'])

 

metrics에 mse(mean_squared_error)를 명시했다. 그래서 터미널 창에 훈련할 때 loss와 mse가 출력되었다.

metrics의 값을 바꿔 볼까? mse 대신 acc를 입력해보자.

 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['acc'])
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=1)

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)

y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

model.compile(loss='mse', optimizer='adam', metrics=['acc'])

 

이번에는 loss에는 mse metrics에 mae(mean absolute error)를 넣어보자.

model.compile(loss='mse', optimizer='adam', metrics=['mae'])

 

 

verbose=2일 때

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=2)

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)

y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

Epoch 와 loss, mse만 화면에 간단하게 출력되고 훈련이 진행되는 것을 보여주는 프로그래스바는 나오지 않는다.

 

 

2. EarlyStopping

모델을 짜고 실행을 하다 보면, 1만 번의 훈련을 시켰는데 3천 번 정도에 최적의 loss 값이 나오는 경우가 많이 있다. 이 후에는 오히려 성능 저하가 발생하는 과적합 단계로 빠진다. 이럴 때마다 일일이 수동으로 변경하는 것은 매우 힘들다.

 

케라스에서는 어느 정도의 결과값이 나오게 되면 멈추게 하는 기능을 제공한다. 바로 EarlyStopping이다.

 

이 기능은 fit에서 사용한다. 이전 소스의 fit 부분을 수정하자. 우선 EarlyStopping을 import하자. 그리고 early_stopping을 정의한다.

 

from keras.callbacks import  EarlyStopping

early_stopping = EarlyStopping(monitor='loss', patience=10, mode='min')

 

monitor는 loss값을 사용하겠다. patience는 성능이 증가하지 않는 epoch가 10번 이상 반복되면 중지를 하라는 것이다.

 

mode는 monitor의 loss 값이 min값 그러니까 최소값일 때 적용하라는 것이다. 

정리하면 loss 값이 최소값에서 10번 이상 변함이 없거나 올라가면 중지한다.  이제 early stopping을 적용하자.

early stopping을 적용하기 위해 epochs를 1000으로 입력하고, verbose=2를 사용하겠다.

 

model.fit(x_train, y_train, epochs=1000, batch_size=1, verbose=2, callbacks=[early_stopping]

 

fit의 callbacks라는 파라미터에 리스트 형태로 입력을 해주면 된다. 이 부분을 수정한 전체 소스이다.

 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='loss', patience=10, mode='min')
model.fit(x_train, y_train, epochs=1000, batch_size=1, verbose=2, callbacks=[early_stopping])

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)


y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

1000번의 epoch를 시켰으나 570번 만에 중단되었다. 

 

early_stopping은 실무에 꼭 필요한 기술이다.

 

 

3. TensorBoard

모델을 만들고 우리는 summary만을 이용하여 확인하였다. 그러다 보니 답답한 생각이 들것이다.

 

우리는 웹에서 깔끔하게 우리의 모델을 볼 수 있는 TensorBoar를 사용해보겠다.

 

우선 keras.callbacks에 있는 TensorBoar를 import 하자. 그리고 변수에 정의한다.

 

keras.callbacks는 EarlyStopping을 할 때 import 했다. 여기에 TensorBoard를 추가하면 된다.

 

from kears.callbacks import EarlyStopping, Tensorboard

tb_hist = TensorBoard(

 log_dir='./graph', histogram_freq=0,

 write_graph=True, write_image=True)

 

이 코드를 fit 전에 삽입한다. 그리고 fit의 callbacks를 수정한다.

 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])

from keras.callbacks import EarlyStopping, TensorBoard
tb_hist = TensorBoard(
 log_dir='./graph', histogram_freq=0,
 write_graph=True, write_images=True)

early_stopping = EarlyStopping(monitor='loss', patience=10, mode='min')
model.fit(x_train, y_train, epochs=1000, batch_size=1, verbose=2, callbacks=[early_stopping, tb_hist])

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)


y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

 

 

graph 폴더 안에 파일이 생성되어 있으면 제대로 실행된 것이다.

명령 프로프트 커맨드 창을 켜자.

 

tensorboard --logdir=f:\study\git\graph

 

엔터 키를 눌러 실행. 시간이 조금 지나면 TensorBoard 1.14.0 at http://gema01-6700k:6006/ (Press CTRL+C to quit)라는 메시지가 뜬다.

 

크롬을 키고 localhost:6060 또는 127.0.0.1:6006 또는 본인의 PC이름:6006 실행하면 TensorBaord가 뜬다.

 

 

4. 모델의 Save

모델을 재사용할 수 있을까? 가능하다. 단, 새로운 데이터에 이미 만들어진 모델이 적용이 잘 되는지는 막상 훈련을 해봐야 알 수 있다.

 

어느 정도 모델링이 가능해지면 진짜 어려워지는 것이 데이터 전처리이다. 깔끔하게 정제된 데이터를 만드는 것은 생각보다 훨씬 어렵다. 

 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)

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

model.add(LSTM(7, input_shape = (5, 1), activation = 'relu'))
model.add(Dense(4))
model.add(Dense(1))

model.save('savetest01.h5')
print('저장 됨.')

5. 모델의 Load

 

모델 불러오기

#2. 모델구성
from keras.models import load_model
model = load_model("savetest01.h5")

model.summary()

기존과 동일하게 잘 출력된다.

 

save할 때는 model.save('파일명')으로 하면되지만, load 할 때는 load_model을 import하고 Sequential이나 함수형 모델을 정의하듯이 model = load_model("파일명")으로 모델을 로드해주어야 한다.

 

이제 저장하고 불러들이는 것은 이해가 되었다.

 

그런데 단순히 저장하고 불러오기만 하면 안된다. 바로 재사용이 가능해야한다. 남이 만들 모델이든 내가 만든 모델이든 간에 불러오기 해서 새로운 레이어들을 추가할 수 있어야 한다.

 

불러오기 한 아래부분에 레이어를 추가해 보자.

 

#2. 모델구성
from keras.models import load_model
model = load_model("savetest01.h5")

from keras.layers import Dense  #추가
model.add(Dense(1)) #추가

model.summary()

Dense 모델이 import되지 않았으므로 Dense를 import하자. 그리고 Dense 레이어 한 개를 추가하자.  모델을 만들 때 모델의 하단에 추가만 해주면 추가 레이어가 연결된다.

 

혹시 에러가 발생(이름충돌)한다면 Dense 레이어에 name을 명시해서 수정하면 된다.

 

#2. 모델구성
from keras.models import load_model
model = load_model("savetest01.h5")

from keras.layers import Dense  #추가
model.add(Dense(1, name='dense_x')) #추가

model.summary()

 

 

 

전체소스

아래 소스는 하나로 묶어 놨지만

 

1,2, 3~4 로 3번에 나눠서 실행하자. 

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])
y_train = np.array([6,7,8])

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

print("x_train.shape : ", x_train.shape) #(3,5,1)
print("y_train.shape : ", y_train.shape) #(3,)


#2. 모델구성
from keras.models import load_model
model = load_model("savetest01.h5")

from keras.layers import Dense  #추가
model.add(Dense(1, name='dense_x')) #추가

model.summary()

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])

from keras.callbacks import EarlyStopping, TensorBoard
tb_hist = TensorBoard(
 log_dir='./graph', histogram_freq=0,
 write_graph=True, write_images=True)

early_stopping = EarlyStopping(monitor='loss', patience=10, mode='min')
model.fit(x_train, y_train, epochs=1000, batch_size=1, verbose=2, callbacks=[early_stopping, tb_hist])

#4. 예측
x_predict = np.array([[4,5,6,7,8]])
print(x_predict.shape) #(1,5)
x_predict = x_predict.reshape(x_predict.shape[0],x_predict.shape[1], 1)
print("x_predict.shape : ", x_predict.shape) # (1,5,1)


y_predict = model.predict(x_predict)
print("예측값 :", y_predict)

1000번의 epoch중 553번째에 early stopping이 되었다.

 

이 처럼 다른 사람이 만든 모델이나 내가 만들 모델들을 불러와 재사용 할 수 있다. 이는 상당히 효율적인 관리가 가능한 방식이다.

 

 

반응형

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

RNN 모델 정리 1  (0) 2020.10.08
RNN용 데이터 자르기  (0) 2020.10.06
시계열 모델 1 RNN  (0) 2020.10.05
회귀 모델 정리 - 앙상블 및 기타 모델  (0) 2020.07.13
회귀 모델 정리 - 함수형 모델  (0) 2020.07.11