Процесс обучения нейросети часто происходит часами и днями, и не будет лишним периодически сохранять веса во избежание потери времени.
Для сохранения нам понадобится пакет h5py:
1 | pip install h5py |
Теперь импортируем класс ModelCheckpoint и указываем имя файла в котором сохранятся веса.
1 2 3 | from keras.callbacks import ModelCheckpoint weights_file = "weights.hdf5" checkpoint = ModelCheckpoint(weights_file, monitor='acc', mode='max', save_best_only=True, verbose=1) |
Здесь указывается то, что мы измеряем и каким образом. В нашем примере, в случае роста(mode=’max’) точности на тестовом сете (monitor=’acc’) модель сохранит свои веса в файл weights.hdf5.
Этот чекпоинт добавляется в список колбеков в вызове метода fit модели.
1 | model.fit(..., callbacks=[checkpoint]) |
Теперь каждый раз при улучшении точности, веса нейронной сети будут сохраняться.
Загрузить веса еще проще. Достаточно вызвать метод load_weights перед вызовом compile.
1 2 | loaded_model.load_weights("weights.hdf5") loaded_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) |
После вызова compile модели можно делать предсказания на тестовом сете на расчитанных и сохраненных ранее весах.
Как сохранить саму модель, я описал здесь а сама задача классификации описана тут.
Ниже приведён полный код примера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import numpy as np import pandas as pd from keras.models import Sequential, model_from_json from keras.layers import Dense, Dropout from keras.utils import np_utils from keras.callbacks import ModelCheckpoint from sklearn.metrics import roc_auc_score from sklearn.preprocessing import LabelEncoder from sklearn.cross_validation import train_test_split # random seed seed = 101 np.random.seed(seed) # load and split data dataframe = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) dataset = dataframe.values X = dataset[:, 0:4].astype(float) Y = dataset[:, 4] # encode class values as integers encoder = LabelEncoder() encoder.fit(Y) encoded_Y = encoder.transform(Y) # one-hot dummy_y = np_utils.to_categorical(encoded_Y) # split to test and train X_train, X_test, Y_train, Y_test = train_test_split(X, dummy_y, test_size=.25, random_state=seed) # define model def my_model(): model = Sequential() model.add(Dense(4, input_dim=4, init='normal', activation='relu')) model.add(Dropout(0.2)) model.add(Dense(3, init='normal', activation='sigmoid')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model # save weights weights_file = "weights.hdf5" checkpoint = ModelCheckpoint(weights_file, monitor='acc', mode='max', save_best_only=True, verbose=1) # fit model = my_model() model.fit(X_train, Y_train, batch_size=7, nb_epoch=200, verbose=1, callbacks=[checkpoint]) # save model model_json = model.to_json() with open("model.json", "w") as json_file: json_file.write(model_json) # # # # load model jfile = open("model.json", "r") loaded_json = jfile.read() jfile.close() loaded_model = model_from_json(loaded_json) # weights loaded_model.load_weights("weights.hdf5") # compile model loaded_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # predict predictions = loaded_model.predict_proba(X_test) print('Accuracy: {}'.format(roc_auc_score(y_true=Y_test, y_score=predictions))) |