Загрузка весов в модель Keras 2, которые были сохранены из модели Keras 1 - PullRequest
0 голосов
/ 14 мая 2019

У меня есть файл весов mnist.h5, который был сохранен для набора данных MNIST с save_weights() с Keras 1.

У меня есть код ниже, который загружает файл весов mnist.h5 и оценивает точность модели,При работе с Keras 1.2.2 он выводит:

Loaded model test accuracy: 99.08%

Однако при работе с Keras 2.2.4 код выводит:

Loaded model test accuracy: 12.78%

В примечаниях к выпуску Keras 2.0 предполагается, чтоФайлы весов, сохраненные с помощью Keras 1, можно загружать в модели Keras 2.

Изменен формат сохраненных весов для многих слоев.Однако файлы весов, сохраненные с Keras 1, все еще можно загрузить в модели Keras 2.

https://blog.keras.io/introducing-keras-2.html

При работе с Keras 2 я пробовал точно такой же код (документация вссылка выше также утверждает, что Keras 2 поддерживает API Keras 1, например, для Convolution2D), а также с изменением:

Convolution2D(nb_filters, nb_conv, nb_conv)

на API Keras 2:

Conv2D(nb_filters, (nb_conv, nb_conv))

Нопроблема остается той же: оценка классификации от model.evaluate все еще составляет около 12% с Keras 2.2.4.

Конечно, когда я добавляю:

for layer in model.layers:
    weights = layer.get_weights()
    print(weights)

Это показывает, что когдапри работе с Keras 1.2.2 и с 2.2.4 формы и значения массива печатных весов отличаются.

Вот необработанный результат выполнения кода с Keras 1.2.2, а затем с 2.2.4: https://gist.github.com/robstewart57/fe85603cb5cfc7380d917f215a1467fd

Файл mnist.h5 находится здесь: https://www.dropbox.com/s/d5728ah8o41tpom/mnist.h5?dl=0.

Похоже, что он не поддерживает примечания к выпуску Keras 2.0 в приведенном выше URL-адресе.

  1. Удивительно ли, что model.evaluate возвращает разные выходные результаты?

  2. Как изменить код так, чтобы Keras 1.2.2 и 2.2.4 выдали одинаковый результат ~ 99%, который выводит Keras 1.2.2?

Вот код:

import os
from keras import *
from keras.layers import *
from keras.models import *
from keras.utils import np_utils
from keras.datasets import mnist as mm

#network/data constants
nb_classes = 10
img_channels = 1
img_rows, img_cols = 28, 28
nb_filters = 32
nb_pool = 2
nb_conv = 3

# get mnist data
(X_train, Y_train), (X_test, Y_test) = mm.load_data()
X_train = X_train.reshape(X_train.shape[0], img_channels, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], img_channels, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')
Y_train = np_utils.to_categorical(Y_train, nb_classes)
Y_test = np_utils.to_categorical(Y_test, nb_classes)

model = Sequential()
model.add(Conv2D(nb_filters, (nb_conv, nb_conv),
                            padding='valid',
                            input_shape=(1, img_rows, img_cols)))

# Keras 1.2.2
# model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
#                             border_mode='valid',
#                             input_shape=(1, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Conv2D(nb_filters, (nb_conv, nb_conv)))
# Keras 1.2.2
# model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))

model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])

# print architecture
model.summary()

# load weights form file
model.load_weights('mnist.h5')
print("Model loaded! Testing.........")

for layer in model.layers:
    weights = layer.get_weights()
    print(weights)

# test
score = model.evaluate(X_test, Y_test, verbose=0)
print("Loaded model test accuracy: " + str(score[1]*100) + "%")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...