반응형
1. Validation split
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, accuracy_score
from sklearn.datasets import load_iris
import time
#1. 데이터
datasets = load_iris()
print(datasets.DESCR)
print(datasets.feature_names)
#['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
x = datasets.data
y = datasets.target
print(x.shape,y.shape) # (150, 4) (150,) #input_dim = 4
# ### one hot encoding
# from keras.utils import to_categorical
# y = to_categorical(y)
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
print(x_train.shape) #(150, 4) -> (150, 3)
#2. 모델 구성
model = Sequential()
model.add(Dense(100,input_dim=4))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(500))
model.add(Dense(3, activation='softmax'))
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam',
metrics=['accuracy','mse'])
start_time = time.time()
hist = model.fit(x_train, y_train, epochs=100, batch_size=50,
validation_split=0.2) #validation data 0.2 (train 0.6 / test 0.2)
end_time = time.time() - start_time
#4. 평가, 예측
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)
# r2 = r2_score(y_test, y_predict)
# print('r2스코어 : ', r2)
print('걸린 시간 : ', end_time)
# 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.title('Iris_Loss & val_Loss')
plt.plot(hist.history['loss'], marker='.', c='orange', label='loss')
plt.plot(hist.history['val_loss'], marker='.', c='blue', label='val_loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend()
plt.show()
Train-Test Split은 머신러닝 모델을 평가하기 위해 데이터를 나누는 과정입니다.
일반적으로 데이터는 훈련 데이터와 테스트 데이터로 나누어집니다. 훈련 데이터는 모델을 학습시키는 데에 사용되고, 테스트 데이터는 학습된 모델을 평가하는 데에 사용됩니다.
Train-Test Split의 목적은 모델이 처음에 본 데이터에 대한 예측 성능을 평가하기 위해 사용됩니다. 훈련 데이터로 모델을 학습시킨 후, 테스트 데이터로 모델의 성능을 평가하여 일반화(generalization) 능력을 확인합니다.
일반적으로 데이터의 일정 비율을 훈련 데이터와 테스트 데이터로 나눕니다. 예를 들어, 70%의 데이터를 훈련 데이터로 사용하고, 나머지 30%의 데이터를 테스트 데이터로 사용하는 것은 일반적인 방법입니다.
데이터를 나누는 과정에서 데이터의 순서를 랜덤하게 섞어서 골고루 분포되도록 합니다.
Train-Test Split은 모델의 성능을 정확하게 평가하기 위해 필수적인 과정이며, 모델의 일반화 능력을 신뢰할 수 있도록 도와줍니다.
2. Overfitting
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.datasets import fetch_california_housing
import time
# from sklearn.datasets import load_boston #윤리적 문제로 제공안됨
#1. 데이터
# datasets = load_boston()
datasets = fetch_california_housing()
x = datasets.data
# ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
y = datasets.target
# MedInc 블록 그룹의 중간 소득
# HouseAge 중간 블록 그룹의 주택 연령
# AveRooms 가구당 평균 객실 수
# AveBedrms 가구당 평균 침실 수
# Population 인구 블록 그룹 인구
# AveOccup 평균 가구 구성원 수
# Latitude 위도 블록 그룹 위도
# Longitude 경도 블록 그룹 경도
print(datasets.feature_names)
print(datasets.DESCR)
print(x.shape) #(20640, 8)
print(y.shape) #(20640,)
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.6, test_size=0.2, random_state=100, shuffle=True
)
print(x_train.shape) # (14447, 8)
print(y_train.shape) # (14447,)
#2. 모델구성
model = Sequential()
model.add(Dense(8, input_dim=8)) # print(x_train.shape) # (14447, 8) 열 숫자
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(1)) # 회귀분석이므로 출력층은 1
#3. 컴파일, 훈련
from keras.callbacks import EarlyStopping
earlyStopping = EarlyStopping(monitor='val_loss', patience=50, mode='min',
verbose=1, restore_best_weights=True)
model.compile(loss='mse', optimizer='adam',
metrics=['accuracy','mse'])
start_time = time.time()
hist = model.fit(x_train, y_train, epochs=5000, batch_size=200,
validation_split=0.2,
callbacks=[earlyStopping],
verbose=1
)
end_time = time.time() - start_time
#4. 평가, 예측
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)
r2 = r2_score(y_test, y_predict)
print('r2스코어 : ', r2)
print('걸린 시간 : ', end_time)
# 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.title('Califonia Loss & val_Loss')
plt.plot(hist.history['loss'], marker='.', c='orange', label='loss')
plt.plot(hist.history['val_loss'], marker='.', c='blue', label='val_loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend()
plt.show()
3. Early Stopping
from keras.callbacks import EarlyStopping
earlyStopping = EarlyStopping(monitor='val_loss', patience=50, mode='min',
verbose=1, restore_best_weights=True)
#EarlyStopping은 Keras에서 제공하는 콜백 함수 중 하나로, 특정 조건에 도달하면 모델의 훈련을 일찍 중단하는 역할을 합니다. EarlyStopping의 주요 매개변수는 다음과 같습니다.
#monitor: Early stopping을 결정하는 기준이 되는 데이터를 의미합니다. 'val_loss'는 validation loss를 의미하며, 이 값을 기준으로 early stopping이 결정됩니다.
#patience: 개선이 없다고 바로 종료하지 않고, 개선이 없는 에포크를 얼마나 기다릴지 결정합니다. 예를 들어, patience=50이면, validation loss의 개선이 50번의 에포크 동안 없을 경우 학습을 멈춥니다.
#mode: monitor에 설정된 목표치를 최소화(min)할 것인지, 최대화(max)할 것인지 결정합니다. 예를 들어, 'val_loss'를 모니터링 할 경우 mode는 'min'으로 설정하고, 'val_accuracy'를 모니터링 할 경우 'max'로 설정합니다.
#verbose: Early stopping의 진행 사항에 대한 출력 여부를 결정합니다. verbose=1로 설정하면 언제 훈련이 중단되었는지를 출력합니다.
#restore_best_weights: 훈련이 끝난 후 모델의 가중치를 가장 좋은 에포크 시점의 가중치로 복원할지 여부를 결정합니다. 이 매개변수가 True로 설정되면, 가장 좋은 에포크에서의 모델 가중치로 복원됩니다. 이는 early stopping으로 인해 마지막에 저장된 가중치가 최적의 가중치가 아닐 수 있기 때문입니다.
4. Save model
model.save() 함수는 모델의 구조와 가중치를 함께 저장합니다.
따라서 해당 함수를 호출하는 위치에 따라 저장되는 내용이 달라집니다.
#1. 만약 model.save()를 model.compile() 이후, model.fit() 이전, 즉 모델 구성이 완료된 후에 호출한다면,
그 시점의 모델 구조와 초기화된 가중치(훈련 전이므로 무작위로 초기화된 값)가 저장됩니다.
#본 사진에서 주석처리한 부분만큼이 model.save_model 함수가 저장하는 가중치 영역입니다.
#2. 만약 model.save()를 model.fit() 이후에 호출한다면,
그 시점의 모델 구조와 훈련된 가중치가 함께 저장됩니다.
#본 사진에서 주석처리한 부분만큼이 model.save_model 함수가 저장하는 가중치 영역입니다.
5. Save weight
model.save_weights
model.load_weights
모델의 가중치를 저장하기 위해서는 model.save_weights(filepath) 함수를 사용합니다.
여기서 filepath는 가중치를 저장할 경로를 나타냅니다. 저장된 가중치는 model.load_weights(filepath) 함수를 사용하여 다시 로드할 수 있습니다.
#본 사진에서 주석처리한 부분만큼이 model.save_weights 함수가 저장하는 가중치 영역입니다.
6. Model Check Point 와 model.save 의 차이
ModelCheckpoint
ModelCheckpoint
Keras에서 제공하는 콜백(callback) 중 하나로, 훈련 중간에 모델의 가중치 또는 전체 모델을 저장할 수 있습니다.
이를 통해 훈련 과정에서 얻은 최적의 가중치 또는 모델을 자동으로 저장하여, 훈련이 중단되거나 완료된 후에도 최적의 결과를 사용할 수 있습니다.
일반적으로 ModelCheckpoint는 model.fit()의 callbacks 매개변수를 통해 사용됩니다. 이렇게 사용하면 에폭(epoch)이 끝날 때마다 모델이 저장됩니다.
또한 저장할 모델의 조건을 설정할 수 있습니다(예: 검증 성능이 개선될 때만 저장하기).
예시:
from tensorflow.keras.callbacks import ModelCheckpoint
# ModelCheckpoint 콜백 생성
checkpoint = ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True, mode='min')
# 훈련 중 최적의 모델을 저장하기 위해 ModelCheckpoint 콜백 사용
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val), callbacks=[checkpoint])
Model.save
model.save():
이 방법은 훈련 후 모델 전체(구조와 가중치, 옵티마이저)를 저장하는 메서드입니다.
model.save()를 호출하는 시점에 모델의 상태가 저장되며, 훈련 중간에 자동으로 저장되지 않습니다.
따라서 사용자가 코드에서 명시적으로 호출해야 합니다.
예시:
# 모델 훈련
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 훈련 후 모델 저장
model.save('my_model.h5')
요약하면, ModelCheckpoint는 훈련 중간에 최적의 모델을 자동으로 저장하는 데 사용되며, model.save()는 사용자가 코드에서 명시적으로 호출하여 모델을 저장하는 데 사용됩니다.
반응형