훈련 된 Keras 모델을로드하고 훈련 계속하기


98

부분적으로 훈련 된 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 Epoch 이후의 첫 번째 데이터 세트에서 마지막 Epoch의 손실은 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))

3
테스트 했습니까? 작동하지 않을 이유가 없습니다.
maz

지금 내가 보는 것은 모델을로드 한 후 정확도가 약 10 % 떨어 졌다는 것입니다 (첫 번째 시대에서만). 다시로드가 작동하는 경우 이는 물론 새로운 학습 데이터 때문입니다. 그러나 나는 이것이 실제로 사실인지 확인하고 싶습니다.
Wilmar van Ommeren

7
model.save를 사용하여 모델을 직접 저장하고 있습니까? 아니면 모델 체크 포인트 ( keras.io/callbacks/#example-model-checkpoints ) 를 사용하고 있습니까? model.save를 사용하는 경우 최상의 모델 (가장 낮은 오류) 대신 최신 모델 (예 : 마지막 epoch)을 저장할 가능성이 있습니까? 실제 코드를 제공 할 수 있습니까?
maz

나는 최고의 모델이 아닌 나의 최신 모델을 저장하고있다. 나는 몇 가지 코드 준비
윌마 반 Ommeren

3
그렇다면 다시로드하고 동일한 열차 데이터에 대한 훈련을 계속할 수 없습니까? 이렇게하면 결과가 비슷할 경우 다시로드해도 괜찮다는 것을 확인할 수 있습니다.
Marcin Możejko

답변:


36

사실은 - model.save 귀하의 경우 교육을 다시 시작하는 데 필요한 모든 정보를 저장합니다. 모델을 다시로드하여 손상 될 수있는 유일한 것은 최적화 프로그램 상태입니다. 이를 확인하려면 save모델을 다시로드하고 훈련 데이터에 대해 훈련 시키십시오.


1
@Marcin : keras를 사용할 때 save()모델의 최상의 결과 (최저 손실) 또는 모델의 마지막 결과 (마지막 업데이트)를 저장합니까? 감사
사자 라이

5
마지막 업데이트. 모델 체크 포인트 콜백은 가장 좋은 것을 저장하기위한 것입니다.
Holi

2
@Khaj이 keras.io/callbacks/#modelcheckpoint 를 언급하고 있습니까? 기본적으로는 마지막 업데이트를 저장합니다 (최상의 업데이트는 아님). 가장 좋은 것은이 save_best_only=True명시 적으로 설정된 경우에만 저장됩니다 .
flow2k

7

문제는 다른 옵티 마이저를 사용하거나 옵티 마이저에 다른 인수를 사용한다는 것입니다. 사용자 지정 사전 훈련 된 모델에서 동일한 문제가 발생했습니다.

reduce_lr = ReduceLROnPlateau(monitor='loss', factor=lr_reduction_factor,
                              patience=patience, min_lr=min_lr, verbose=1)

사전 훈련 된 모델의 경우 원래 학습률이 0.0003에서 시작하고 사전 훈련 중에 min_learning rate 인 0.000003으로 감소합니다.

방금 사전 훈련 된 모델을 사용하는 스크립트에 해당 줄을 복사했고 정확도가 매우 떨어졌습니다. 사전 훈련 된 모델의 마지막 학습률이 최소 학습률, 즉 0.000003임을 알 때까지. 그 학습률로 시작하면 사전 훈련 된 모델의 출력과 정확히 동일한 정확도를 얻습니다. 이는 사전 훈련 된 모델에서 사용 된 마지막 학습률보다 100 배 더 큰 학습률로 시작하는 것과 같습니다. 모델은 GD의 엄청난 오버 슈트를 초래하므로 정확도가 크게 떨어집니다.


5

위 답변의 대부분은 중요한 사항을 다루었습니다. 최근 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)

이 접근 방식은 모델을 저장하기 전에 남은 학습을 다시 시작합니다. 다른 사람에 의해 언급 한 바와 같이 가장 모델의 가중치를 저장하려는 경우 또는, 당신은 모델의 가중치를 사용하면 다음과 같은 옵션을 keras 콜백 기능 (ModelCheckpoint)를 사용할 필요가 모든 시대를 저장하려면 save_weights_only=True, save_freq='epoch'하고 save_best_only.

자세한 내용은 여기 를 확인하고 여기 에서 다른 예 를 확인 하세요 .


1
좋습니다, 이것은 매우 유망 해 보입니다-정보 ​​감사합니다. 이 예에서는 학습에 사용 된 것과 동일한 데이터로 모델을 재 학습하는 것처럼 보입니다. 그렇다면 올바른 접근 방식은 (프로세스에 도입되는 새로운 정보를 반영하기 위해) 재교육 할 새로운 훈련 데이터 하위 집합을로드하는 것이라고 생각했을 것입니다.
bibzzzz

1
@bibzzzz 동의합니다. 아주 좋은 댓글입니다. 성능을 향상시키기 위해 동일한 데이터에 대한 재교육을 시연하고 싶었습니다. 요점은 모델을 저장하기 전에 중지 된 성능의 개선을 명확하게 보여줍니다. 다른 데이터에 대한 재교육에 전적으로 동의하고 나중에 시도해 보겠습니다. 감사!
Vishnuvardhan Janapati

훌륭합니다-당신은 이것을 아주 잘 보여주었습니다. 감사합니다.
bibzzzz

2

Keras는 여기 에서와 같이로드 된 모델에 문제가있는 경우가 있습니다 . 이것은 동일한 훈련 된 정확도에서 시작하지 않는 경우를 설명 할 수 있습니다.


1

위의 모든 것이 도움이 되며 모델과 가중치가 저장되었을 때 LR과 동일한 학습률 ()에서 다시 시작 해야합니다 . 옵티 마이저에서 직접 설정하십시오.

모델이 전 세계적 일 수있는 지역 최소값에 도달했을 수 있기 때문에 거기에서의 개선이 보장되지 않습니다. 제어 된 방식으로 학습률을 높이고 모델을 멀지 않은 더 나은 최소값으로 조금씩 이동하지 않는 한 다른 로컬 최소값을 검색하기 위해 모델을 재개 할 필요가 없습니다.


왜 그런 겁니까? 이전보다 더 작은 LR을 사용할 수 없습니까?
lte__

실제로 계속 훈련하면 더 많은 데이터를 수신하면 더 나은 모델을 얻을 수 있습니다. 따라서 다른 지역 최소값을 검색하기 위해 모델을 재개해야하는 지점이 있습니다.
Corey Levinson

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.