Экспортируемая модель Autokeras работает не так, как ожидалось - PullRequest
0 голосов
/ 09 ноября 2018

Я только что установил autokeras на python3.6. После некоторого исправления ошибки это работает хорошо, и я могу обучать модели с моим набором данных. После тренировки я получаю модель с точностью 0,991 и потерей 0,06. С помощью функции предсказания он классифицирует мой тестовый набор данных практически без ошибок. Но когда я экспортирую и сохраняю это как модель keras, модель работает очень плохо. Он все неправильно классифицирует, а функция предиката возвращает случайные десятичные числа, а не номер ожидаемого класса. Я думаю, что мне просто не хватает некоторых команд, так как классификатор изображений работает хорошо. Любая помощь или советы будут очень хорошими.

Edit: Я в основном следовал примеру на https://autokeras.com/start/. Я предварительно обработал свои данные, чтобы они были в форме (n, 150, 150, 3) и находились в диапазоне от 0 до 1. Код для каждого изображения следующий:

img='/home/example_image.png'
x=image.img_to_array(image.load_img(img, target_size=(150, 150)))
x=x.reshape(1, 150, 150, 3)
x = x.astype('float32') / 255

Я также пробовал использовать для изображений 50x50, потому что автокера, кажется, лучше работает с меньшими фигурами. Мои метки - это список длиной n. Тогда я использую код с сайта:

clf = ImageClassifier(verbose=True)
clf.fit(x_train, y_train, time_limit=12 * 60 * 60)
clf.final_fit(x_train, y_train, x_test, y_test, retrain=True)
y = clf.evaluate(x_test, y_test)
print(y)

Возвращает очень хорошую модель с высокой точностью и небольшими потерями. Я не могу показать вам скриншоты вывода, потому что я сейчас дома, и мой ноутбук слишком слаб, чтобы воспроизвести эту проблему. Когда я использую следующую команду:

clf.predict(example_img)

Я также получаю правильный результат с номером объекта на изображении. Моя проблема начинается, когда я пытаюсь экспортировать модель с помощью команд, приведенных на их сайте:

from autokeras import ImageClassifier
clf = ImageClassifier(verbose=True, augment=False)
clf.load_searcher().load_best_model().produce_keras_model().save('my_model.h5')

После этого я загружаю свою модель.

import keras
from keras.models import load_model
model = load_model('my_model.h5')

Это дает мне ошибку:

"UserWarning: Конфигурация обучения не найдена в файле сохранения: модель не была скомпилирована. Скомпилируйте ее вручную. warnings.warn ('В файле сохранения не найдена конфигурация обучения:' "

Я искал это, но люди сказали игнорировать это. Но когда я пытаюсь использовать прогнозирование с этой загруженной моделью, я всегда получаю массив случайных десятичных значений, которые часто бывают отрицательными. Классификация всегда неверна, так как самое высокое значение в этом массиве для неправильного класса.

Я отредактирую этот текст с большим количеством скриншотов и подробностей, когда я снова буду в офисе с моим компьютером ML.

Редактировать 2: Когда я тренирую модель, это лучшая модель:

+--------------------------------------------------------------------------+
|    Father Model ID     |                 Added Operation                 |
+--------------------------------------------------------------------------+
|                        |           ('to_add_skip_model', 1, 5)           |
|                        |            ('to_wider_model', 1, 64)            |
|                        |            ('to_wider_model', 5, 64)            |
|           5            |          ('to_conv_deeper_model', 9, 3)         |
|                        |         ('to_conv_deeper_model', 23, 3)         |
|                        |          ('to_concat_skip_model', 5, 9)         |
+--------------------------------------------------------------------------+

Saving model.
+--------------------------------------------------------------------------+
|        Model ID        |          Loss          |      Metric Value      |
+--------------------------------------------------------------------------+
|           6            |  0.014135746611282229  |          1.0           |
+--------------------------------------------------------------------------+

После этого я воспользовался final_fit и попробовал функцию предсказания:

>>> clf.predict(test_images)
array([ 0.,  0.,  0., ..., 12., 12., 12.])

Это ожидаемый результат. Оценка также дает хорошие результаты:

>>> y = clf.evaluate(test_images, test_labels)
>>> print(y)
0.9969230769230769

Затем я экспортирую модель как модель keras и загружаю ее снова:

>>> from keras import models
>>> clf.load_searcher().load_best_model().produce_keras_model().save('keras_best_model.h5')
>>> model = models.load_model('keras_best_model.h5')

Все отлично, и я не получаю ошибки. Но теперь, когда я использую функцию Предсказание, она возвращает неверные результаты:

>>> model.predict(test_images[0].reshape(1, 50, 50, 3))
array([[ 2.5287893, -2.2281592, -2.8172228,  1.1171696, -5.8477755,
        -3.1250796,  1.4904132,  1.1068834, -4.982565 , -1.6350467,
        -4.3806715, -2.7464929, -6.1051216]], dtype=float32)

Итак, clf.predict дает мне одно число, а model.predict - массив. Разве это не должно быть то же самое? Почти все прогнозы неверны. Когда я оцениваю модель, это вывод:

>>> model.evaluate(test_images, test_labels1)
2600/2600 [==============================] - 1s 569us/step
[5.251570468682509, 0.10115384615384615]

Это абсолютно плохо по сравнению с оценкой clf, и я не знаю почему.

1 Ответ

0 голосов
/ 07 февраля 2019

В новой версии (0.3.6) кажется

clf.load_searcher().load_best_model().produce_keras_model().save('keras_best_model.h5') 

удалено. На данный момент вы можете использовать «autokeras.utils.pickle_to_file» для сохранения и «autokeras.utils.pickle_from_file» для загрузки модели. Это не обычная модель keras, однако мы можем получить те же результаты.

...