2017-03-08 4 views
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

테스트 해 보셨습니까? 그 일을하지 않을 이유는 없습니다. – maz

+0

지금 보았던 것은 정확하게 모델을로드 한 후 약 10 %의 정확도로 떨어졌습니다 (첫 번째 신기원에서만). 리로딩이 작동하는 경우 이는 물론 새로운 교육 데이터로 인해 발생합니다. 그러나 나는 이것이 정말로 사실인지 확실히하고 싶다. –

+5

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

답변

9

실제로 - model.save은 사례 재교육에 대한 모든 정보를 저장합니다. 모델을 다시로드하여 버릇을 없앨 수있는 유일한 방법은 최적화 프로그램의 상태입니다. 이를 확인하려면 save으로 가서 모델을 다시로드하고 교육 데이터를 교육하십시오.

+0

@Marcin : keras'save()'를 사용할 때 모델의 최상의 결과 (가장 낮은 손실) 또는 모델의 최종 결과 (최종 업데이트)를 저장합니까? 덕분에 –

+0

최종 업데이트. 모델 체크 포인트 콜백은 최상의 체크 포인트 콜백을 저장하기위한 것입니다. – Khaj

2

Keras에는로드 된 모델에 문제가있는 경우가 있습니다 (예 : here). 동일한 훈련 된 정확도로 시작하지 않는 경우가있을 수 있습니다.

-1

다른 옵티 마이저를 사용하거나 옵티 마이저에 대해 다른 인수를 사용하는 것이 문제 일 수 있습니다. 난 그냥 원래의 학습 속도가 0.0003에서 그리고 그것은 0.000003

인 min_learning 속도로 감소 사전 훈련시 시작 됨으로써 pretrained 모델에 대한

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

를 사용하여 사용자 정의 pretrained 모델과 같은 문제가 있었다

나는 미리 훈련 된 모델을 사용하고 실제로는 정확도가 떨어지는 스크립트로 그 라인을 복사했다. 전 훈련 된 모델의 마지막 학습 속도가 최소 학습 속도, 즉 0.000003이라는 것을 알기 전까지는. 그 학습 속도로 시작한다면 사전 훈련 된 모델의 출력과 정확히 똑같은 정확도를 얻을 수 있습니다 - 사전 학습 된 모델에서 사용 된 마지막 학습 속도의 100 배인 학습 속도로 시작하는 의미가 있습니다 모델은 GD의 거대한 오버 슛을 초래하여 정확도가 크게 떨어집니다.

관련 문제