首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Keras的evaluate_generator和评估报告对同一数据的不同准确性?

为什么Keras的evaluate_generator和评估报告对同一数据的不同准确性?
EN

Stack Overflow用户
提问于 2020-01-29 00:11:11
回答 1查看 296关注 0票数 0

我使用Keras的ImageDataGeneratorflow_from_directory来训练一个神经网络。我遇到的问题是,evaluate_generatorevaluate对相同的数据报告了不同的准确性。下面是一个极小例子,它从evaluate_generator报告的精度为0.24,而从evaluate则报告为0.44。

代码语言:javascript
复制
import os
import numpy as np
import cv2
import keras
import tensorflow as tf

np.random.seed(1)
tf.set_random_seed(1)

test_data_path = os.path.join("data", "test")

def load_data_from_image_files(base_data_path):
    X = []
    y = []
    for data_folder in os.listdir(base_data_path):
        data_folder_path = os.path.join(base_data_path, data_folder)
        if os.path.isdir(data_folder_path):
            for filename in os.listdir(data_folder_path):
                if filename.endswith(".jpg"):
                    X.append(cv2.imread(os.path.join(data_folder_path, filename)))
                    if data_folder == "null":
                        y.append([0])
                    else:
                        y.append([1])
    return np.array(X).astype("float32") / 255.0, np.array(y)

with open("model.json", "r") as json_file:
    model = keras.models.model_from_json(json_file.read())
model.load_weights("model.h5")
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])

X_test, y_test = load_data_from_image_files(test_data_path)
test_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
    test_data_path,
    target_size=(96, 96),
    batch_size=1,
    shuffle=False,
    class_mode="binary")
_, generator_test_accuracy = model.evaluate_generator(generator=test_generator, steps=test_generator.samples)
_, test_accuracy = model.evaluate(X_test, y_test)
print("evaluate_generator: %.3f, evaluate: %.3f" % (generator_test_accuracy, test_accuracy))

(这是来自keras生成器的test.py -最小示例回购。)此脚本加载的预培训模型定义如下:

代码语言:javascript
复制
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=(96, 96, 3)))
model.add(keras.layers.Dense(4, activation="relu"))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dense(1, activation="sigmoid"))
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])

建立和训练模型的完整脚本是这里

我的问题是,在上面的例子中,model.evaluate_generatormodel.evaluate应该报告同样的准确性,还是我搞砸了什么?如果我只是缺少一个参数或其他什么,我会非常感谢一个推动正确的方向。

附带注意:这个吉特布问题似乎是相关的,尽管在该问题的评论中提出的各种修复方案并不能为我解决问题。设置shuffle=Falseworkers=1和/或max_queue_size=1不会改变任何事情,而设置use_multiprocessing=True会导致在我的终端中出现以下几个错误,并且脚本挂起:

代码语言:javascript
复制
/home/jack/.local/lib/python3.6/site-packages/keras/utils/data_utils.py:616: UserWarning: The input 0 could not be retrieved. It could be because a worker has died.
  UserWarning)

因为我还没能解决这个次要问题,所以我不知道在evaluate_generator中设置evaluate_generator是否能够解决我所拥有的不匹配的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-29 20:19:52

结果表明,这种差异是由OpenCV的imread使用BGR格式,而Keras的flow_from_directory 默认情况下期望RGB造成的。逆转RGB的通道解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59958934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档