简体   繁体   English

Keras model.evaluate_generator 不打印预期损失(和准确性?)

[英]Keras model.evaluate_generator not printing expected loss (and accuracy?)

Problem问题

I want to increase the image size from 64 to 128 to see how that would affect my model.我想将图像大小从 64 增加到 128,看看这将如何影响我的 model。 However, this makes the dataset too large to fit into memory.但是,这会使数据集太大而无法放入 memory。 Therefore, I tried to switch to using Keras generators to fit my model while using image size 64 to make sure my implementation is correct.因此,我尝试切换到使用 Keras 生成器来适应我的 model,同时使用图像大小 64 来确保我的实现是正确的。 model.fit_generator seems to be working as expected when comparing the train and validation logs to model.fit 's logs, but model.evaluate_generator is not showing expected results when compared to the model.evaluate output. model.fit_generator seems to be working as expected when comparing the train and validation logs to model.fit 's logs, but model.evaluate_generator is not showing expected results when compared to the model.evaluate output.

The loaded model was trained using model.fit .加载的 model 使用model.fit进行训练。 I don't know if this affects anything.我不知道这是否会影响任何事情。 There are 5000 validation imgs for validation_generator (chosen by ImageDataGenerator) and 5000 randomly selected validation imgs in X_val and Y_val validation_generator 有 5000 个validation_generator imgs(由 ImageDataGenerator 选择)和X_val和 Y_val 中随机选择的 5000 个验证Y_val

Using model.evaluate_generator使用 model.evaluate_generator

IMG_SIZE = 64
BATCH_SIZE = 32
EPOCHS = 30
datagen = ImageDataGenerator(validation_split=.2)
train_generator = datagen.flow_from_directory(directory=TRAIN_DIR, target_size=(IMG_SIZE, IMG_SIZE), class_mode='categorical', batch_size=BATCH_SIZE, shuffle=True, subset='training')
validation_generator = datagen.flow_from_directory(directory=TRAIN_DIR, target_size=(IMG_SIZE, IMG_SIZE), class_mode='categorical', batch_size=BATCH_SIZE, shuffle=False, subset='validation')
predict_generator = datagen.flow_from_directory(directory=TEST_DIR, target_size=(IMG_SIZE, IMG_SIZE), class_mode=None, batch_size=1, shuffle=False)

Evaluating:评估:

cat_dog_model = keras.models.load_model('model/'+MODEL_NAME)
results = cat_dog_model.evaluate_generator(generator=validation_generator, steps=validation_generator.samples//BATCH_SIZE, verbose=1)

evaluate_generator outputs this: evaluate_generator 输出:

# with validation_generator batch_size=32
156/156 [==============================] - 18s 118ms/step - loss: 10.3093 - accuracy: 0.7957
# with validation_generator batch_size=1
5000/5000 [==============================] - 36s 7ms/step - loss: 10.3888 - accuracy: 0.7952

Using model.evaluate使用 model.evaluate

Evaluating:评估:

results = cat_dog_model.evaluate(X_val, Y_val, batch_size=32, verbose=1)

evaluate output:评估 output:

157/157 [==============================] - 15s 96ms/step - loss: 0.2297 - accuracy: 0.9066

It is a bit hard to tell without the complete code and data.如果没有完整的代码和数据,这有点难以判断。 However, it seems like the input is indeed different.但是,似乎输入确实不同。 You say你说

There are 5000 validation imgs for validation_generator (chosen by ImageDataGenerator) and 5000 randomly selected validation imgs in X_val and Y_val validation_generator 有 5000 个验证 imgs(由 ImageDataGenerator 选择)和 X_val 和 Y_val 中随机选择的 5000 个验证 imgs

And I can see that the input variables are indeed different, X_val, Y_val vs validation_generator.而且我可以看到输入变量确实不同,X_val、Y_val vs validation_generator。

However, please note that evaluate (and same for fit) is able to handle generators.但是,请注意,evaluate(和 fit 相同)能够处理生成器。 There is no need for fit on generator and evaluate generator.不需要适合生成器和评估生成器。 Actually you should have gotten a warning that these functions are deprecated.实际上,您应该已经收到警告,这些功能已被弃用。 You can use:您可以使用:

results = cat_dog_model.evaluate(validation_generator)

or或者

results = cat_dog_model.evaluate(validation_generator, steps=validation_generator.samples//BATCH_SIZE, verbose=1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM