【问题标题】:Autokeras exported model performs not as expectedAutokeras 导出的模型表现不如预期
【发布时间】:2019-04-13 05:35:51
【问题描述】:

我刚刚在 python3.6 上安装了 autokeras。经过一些错误修复后,它运行良好,我可以使用我的数据集训练模型。 训练后,我得到一个精度为 0.991 且损失为 0.06 的模型。使用预测功能,它几乎没有任何错误地对我的测试数据集进行分类。 但是当我将其导出并保存为 keras 模型时,该模型的性能非常糟糕。它错误地分类了所有内容,并且预测函数只返回随机小数,而不是预期类的数量。 我想我只是缺少一些命令,因为图像分类器运行良好。 任何帮助或提示都会非常好。

编辑: 我基本上遵循了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 形状的图像,因为 autokeras 似乎更适合较小的形状。我的标签是长度为 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: No training configuration found in save file: 模型未编译。手动编译。 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 并尝试了 predict_function:

>>> 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')

一切都很好,我没有收到任何错误。但是当我现在使用 predict_function 时,它会返回错误的结果:

>>> 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 评估相比,这完全是糟糕的,我不知道为什么。

【问题讨论】:

  • 请创建一个minimal reproducible example 并向我们展示您使用的代码。
  • 您是否尝试在“fit/final_fit”之后保存模型?在示例代码中,您只是创建一个新模型并保存它 - 在保存之前您永远不会给它数据进行训练。
  • final_fit 之后,我使用了 clf.load_searcher().load_best_model().produce_keras_model().save('my_model.h5')。我认为 final_fit 可以作为找到模型的训练,然后上面的代码是保存模型。我是否需要再次训练 clf 或将其导出到 keras 模型并在保存之前对其进行训练?我尝试在保存和加载后训练导出的模型,但没有帮助。

标签: keras auto-keras


【解决方案1】:

在新版本(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 模型,但是我们可以得到相同的结果。

【讨论】:

  • 在最新版本中,似乎没有这个功能了
猜你喜欢
  • 2021-09-27
  • 2021-01-06
  • 1970-01-01
  • 2020-04-19
  • 2011-05-19
  • 2021-07-30
  • 1970-01-01
  • 2016-08-14
  • 2012-10-25
相关资源
最近更新 更多