교육을 받은 Keras 모델 로드 및 교육 계속
부분적으로 훈련된 Keras 모델을 저장하고 모델을 다시 로드한 후 교육을 계속할 수 있는지 궁금합니다.
그 이유는 앞으로 더 많은 교육 데이터가 있을 것이고 전체 모델을 다시 교육하고 싶지 않기 때문입니다.
제가 사용하고 있는 기능은 다음과 같습니다.
#Partly train model
model.fit(first_training, first_classes, batch_size=32, nb_epoch=20)
#Save partly trained model
model.save('partly_trained.h5')
#Load partly trained model
from keras.models import load_model
model = load_model('partly_trained.h5')
#Continue training
model.fit(second_training, second_classes, batch_size=32, nb_epoch=20)
편집 1: 완전 작동 예제 추가
10개의 에포크 이후의 첫 번째 데이터 세트에서 마지막 에포크의 손실은 0.0748이고 정확도는 0.9863입니다.
모델을 저장, 삭제 및 다시 로드한 후 두 번째 데이터 세트에서 훈련된 모델의 손실과 정확도는 각각 0.1711과 0.9504가 됩니다.
이것은 새로운 교육 데이터에 의한 것입니까, 아니면 완전히 재교육된 모델에 의한 것입니까?
"""
Model by: http://machinelearningmastery.com/
"""
# load (downloaded if needed) the MNIST dataset
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.models import load_model
numpy.random.seed(7)
def baseline_model():
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
model.add(Dense(num_classes, init='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
if __name__ == '__main__':
# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# flatten 28*28 images to a 784 vector for each image
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# build the model
model = baseline_model()
#Partly train model
dataset1_x = X_train[:3000]
dataset1_y = y_train[:3000]
model.fit(dataset1_x, dataset1_y, nb_epoch=10, batch_size=200, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
#Save partly trained model
model.save('partly_trained.h5')
del model
#Reload model
model = load_model('partly_trained.h5')
#Continue training
dataset2_x = X_train[3000:]
dataset2_y = y_train[3000:]
model.fit(dataset2_x, dataset2_y, nb_epoch=10, batch_size=200, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
편집 2: 텐서 흐름.케라스의 말.
텐서 흐름의 경우.keras는 매개변수 nb_https를 모형 적합치의 에포크로 변경합니다.가져오기 및 기본 모델 기능은 다음과 같습니다.
import numpy
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import load_model
numpy.random.seed(7)
def baseline_model():
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
- 사은실 -model.save
이 경우 교육을 다시 시작하는 데 필요한 모든 정보를 저장합니다.모델을 다시 로드함으로써 손상될 수 있는 유일한 것은 최적화기 상태입니다.하려면 - - - 해보세요.save
모델을 다시 로드하고 교육 데이터에 대해 교육합니다.
위의 답변 대부분은 중요한 점을 다루었습니다.의 Tensorflow를 (Tensorflow를 사용하는 경우)TF2.1
또는 위), 그러면 다음 예제가 도움이 될 것입니다.코드의 모델 부분은 Tensorflow 웹 사이트에서 가져온 것입니다.
import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
return model
# Create a basic model instance
model=create_model()
model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)
모델을 *.tf 형식으로 저장하십시오.내 경험에 따르면, 만약 당신이 custom_loss를 정의했다면, *.h5 형식은 최적화기 상태를 저장하지 않을 것이고, 따라서 우리가 떠난 곳에서 모델을 재교육하고 싶다면 당신의 목적에 부합하지 않을 것입니다.
# saving the model in tensorflow format
model.save('./MyModel_tf',save_format='tf')
# loading the saved model
loaded_model = tf.keras.models.load_model('./MyModel_tf')
# retraining the model
loaded_model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)
이 접근 방식은 모델을 저장하기 전에 떠난 교육을 다시 시작합니다.했듯이, 함수 Checkpoint.save_weights_only=True
,save_freq='epoch'
,그리고.save_best_only
.
다른 최적화 도구를 사용하거나 최적화 도구에 다른 인수를 사용하는 것이 문제일 수 있습니다.방금 사용자 지정 사전 교육된 모델에서 동일한 문제가 발생했습니다.
reduce_lr = ReduceLROnPlateau(monitor='loss', factor=lr_reduction_factor,
patience=patience, min_lr=min_lr, verbose=1)
사전 훈련된 모델의 경우, 원래 학습 속도가 0.0003에서 시작하고 사전 훈련 중에 min_learning 속도인 0.000003으로 감소합니다.
저는 단지 그 선을 사전 훈련된 모델을 사용하는 스크립트에 복사했을 뿐인데, 정확도가 정말 떨어졌습니다.사전 훈련된 모델의 마지막 학습 속도가 최소 학습 속도, 즉 0.000003이라는 것을 알아차리기 전까지.그리고 만약 제가 그 학습 속도로 시작한다면, 저는 사전 훈련된 모델의 결과와 정확히 같은 정확도를 얻게 됩니다. 이것은 말이 됩니다. 사전 훈련된 모델에 사용된 마지막 학습 속도보다 100배 더 큰 학습 속도로 시작하면 GD의 엄청난 오버슈트를 초래하여 정확도가 크게 감소하기 때문입니다.
Keras는 로드된 모델과 관련하여 문제가 발생할 수 있습니다.이렇게 하면 동일한 훈련된 정확도에서 시작하지 않는 경우가 설명될 수 있습니다.
새 관측치를 사용할 수 있을 때 모형을 다시 훈련해야 하는지를 참조하십시오.많은 학술 논문들이 논의하는 재앙적 망각의 개념도 있습니다.MNIST와 함께하는 것은 치명적인 망각의 경험적 조사입니다.
위의 모든 방법을 사용하면 모델 및 가중치가 저장되었을 때 LR과 동일한 학습 속도()에서 다시 시작해야 합니다.옵티마이저에 직접 설정합니다.
모형이 국부 최소값(전지구적인 최소값)에 도달했을 수 있기 때문에 개선이 보장되지 않습니다.학습 속도를 제어된 방식으로 높이고 멀지 않은 곳에서 모델을 더 나은 최소값으로 밀어넣을 의도가 아니라면 다른 로컬 최소값을 검색하기 위해 모델을 다시 시작하는 것은 의미가 없습니다.
TF2를 사용하는 경우 새 saved_model 메서드(형식 pb)를 사용합니다.자세한 내용은 여기와 여기에서 확인할 수 있습니다.
model.fit(x=X_train, y=y_train, epochs=10,callbacks=[model_callback])#your first training
tf.saved_model.save(model, save_to_dir_path) #save the model
del model #to delete the model
model = tf.keras.models.load_model(save_to_dir_path)
model.fit(x=X_train, y=y_train, epochs=10,callbacks=[model_callback])#your second training
저장된 모델을 사용하여 모델을 교육해도 전혀 문제가 없습니다.저장된 모델을 동일한 데이터로 교육했더니 정확도가 우수했습니다.게다가, 각 시대에서 소요되는 시간이 상당히 짧았습니다.
다음은 코드를 참조하십시오.
from keras.models import load_model
model = load_model('/content/drive/MyDrive/CustomResNet/saved_models/model_1.h5')
history=model.fit(train_gen,validation_data=valid_gen,epochs=5)
언급URL : https://stackoverflow.com/questions/42666046/loading-a-trained-keras-model-and-continue-training
'programing' 카테고리의 다른 글
스프링 부트 3의 스프링 보안 (0) | 2023.07.22 |
---|---|
왜 공포증을 사용할 수 없습니까? (0) | 2023.07.22 |
Oracle DataReader를 통해 읽을 때 NULL 값을 처리하시겠습니까? (0) | 2023.07.22 |
Visual Studio Code에서 긴 줄 자동 줄 바꿈 사용 안 함 (0) | 2023.07.22 |
장고 메모리 사용량을 줄입니다.낮게 매달린 과일? (0) | 2023.07.22 |