#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 |