訓練された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です。
モデルを保存、削除、再読み込みした後、2番目のデータセットで訓練されたモデルの損失と精度は、それぞれ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))
テストしましたか?私はそれが働かない理由はないと思う。 – maz
私が今見ているのは、モデルを読み込んだ後の精度が約10%低下することです(最初のエポックでのみ)。再ロードが機能する場合、これはもちろん新しいトレーニングデータによって引き起こされます。しかし、私はちょうどこれが本当に事実であることを確実にしたい。 –
モデルをmodel.saveに直接保存しているのですか、モデルチェックポイント(https://keras.io/callbacks/#example-model-checkpoints)を使用していますか? model.saveを使用している場合は、最新のモデル(つまり、最後のエポック)を最良のもの(最低エラー)ではなく保存する可能性はありますか?実際のコードを提供できますか? – maz