programing

교육을 받은 Keras 모델 로드 및 교육 계속

cafebook 2023. 7. 22. 10:24
반응형

교육을 받은 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

반응형