У меня есть файл весов 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-адресе.
Удивительно ли, что model.evaluate
возвращает разные выходные результаты?
Как изменить код так, чтобы 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) + "%")