Правильный способ сохранить модель в Керасе - PullRequest
0 голосов
/ 13 февраля 2020

Я пытался внедрить трансферное обучение в свои исследования. Я решил go с VGG16, как указано в keras.applications.

Я загружаю модель и замораживаю ее веса следующим образом:

vgg16 = VGG16(weights='imagenet', include_top=False,input_shape=(img_rows, img_cols, 3), pooling = None)
for layer in vgg16.layers:
    layer.trainable = False

Затем добавляю верхние слои для классификации:

model = Sequential()
model.add(vgg16)
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

Я компилирую и обучаю модель на мои данные, чтобы сначала прогреть верхние слои:

EPOCHS = 4000

history = model.fit_generator(datagen_train.flow(X_train, y_train, batch_size=100),
                        validation_data = datagen_val.flow(X_val, y_val, batch_size=100),
                        epochs = EPOCHS,
                        steps_per_epoch = np.ceil(len(X_train) / 100),
                        validation_steps = np.ceil(len(X_val) / 100),
                        callbacks=[es, mc]
                       )

Я сохраняю модель, используя обычную команду Keras: save_model.

Моя следующая цель - разморозить некоторые из верхних слоев VGG16 и снова тренируй модель (точная настройка). Однако после загрузки модели с load_model я обнаружил, что модель выглядит неподготовленной. Я проверил ее, прежде чем сэкономить на наборе тестовых данных, и производительность была высокой в ​​диапазоне 70%. После загрузки той же модели я обнаружил, что производительность набора тестовых данных составляет около 20%, что почти меньше шансов, учитывая, что у меня есть пять меток классов.

Что произошло между моими командами save_model и load_model?

1 Ответ

0 голосов
/ 07 апреля 2020

Keras поддерживает более простой интерфейс для сохранения весов модели и архитектуры модели вместе в одном файле H5.

Сохранение модели с помощью метода save.model включает в себя все, что нам нужно знать о модели, включая:

  1. Веса модели.
  2. Архитектура модели.
  3. Детали компиляции модели (потери и метрики).
  4. Состояние оптимизатора модели.

Сохраненную модель затем можно загрузить, вызвав функцию load_model () и передав имя файла. Функция возвращает модель с той же архитектурой и весами.

Пример: Я запустил простую модель и сохранил с помощью model.save и загрузил с load_model keras. Вы можете загрузить набор данных из здесь .

Построить и сохранить модель:

# MLP for Pima Indians Dataset saved to single file
import numpy as np
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense

# load pima indians dataset
dataset = np.loadtxt("/content/pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]

# define model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Model Summary
model.summary()

# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)

# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# save model and architecture to single file
model.save("model.h5")
print("Saved model to disk")

Вывод -

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              (None, 12)                108       
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 104       
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 9         
=================================================================
Total params: 221
Trainable params: 221
Non-trainable params: 0
_________________________________________________________________
acc: 77.08%
Saved model to disk

Загрузить модель и оценить для проверки:

# load and evaluate a saved model
from numpy import loadtxt
from keras.models import load_model

# load model
model = load_model('model.h5')

# summarize model.
model.summary()

# load dataset
dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]

# evaluate the model
score = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))

Выход -

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              (None, 12)                108       
_________________________________________________________________
dense_8 (Dense)              (None, 8)                 104       
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 9         
=================================================================
Total params: 221
Trainable params: 221
Non-trainable params: 0
_________________________________________________________________
acc: 77.08%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...