python - tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大
问题描述
我将 ImageDataGenerator(validation_split).flow_from_directory(subset) 用于我的训练和验证集。所以训练和验证数据有自己的生成器。
训练完数据后,我在验证生成器上运行 model.evaluate() 并获得了大约 75% 的准确率。但是,当我在同一个验证生成器上运行 model.predict() 时,准确度下降到 1%。
该模型是根据分类交叉熵损失和准确度指标编译的多类 CNN,默认为分类准确度。# 编辑:无论如何更改为分类准确度。
# Compile
learning_rate = tf.keras.optimizers.schedules.PolynomialDecay(initial_learning_rate=initial_lr,
decay_steps=steps,
end_learning_rate=end_lr)
model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate),
loss='categorical_crossentropy',
metrics=['categorical_accuracy'])
# Validation set evaluation
val_loss, val_accuracy = model.evaluate(val_generator,
steps=int(val_size/bs)+1)
print('Accuracy: {}'.format(val_accuracy))
# Validation set predict
y_val = val_generator.classes
pred = model.predict(val_generator,
verbose=1
steps=int(val_size/bs)+1)
accuracy_TTA = np.mean(np.equal(y_val, np.argmax(pred, axis=-1)))
print('Accuracy: {}'.format(accuracy_TTA))
解决方案
来自 model.evaluate 和 model.predict 的不同精度值的问题似乎可以通过创建 ImageDataGenerator() 的单独实例但具有相同的种子来解决。
此外,有时在训练 KeyInterrupts 或加载检查点期间,应重新初始化生成器实例,因为可能会出现问题。
推荐阅读
- javascript - 成功登录尝试后重定向到另一个 html 页面
- mongodb - 在 MongoDB 中使用平面文档创建粒度
- reactjs - 与 async 和 await 一起使用时,Axios 似乎没有更新状态
- amazon-web-services - 为 DynamoDB template.yaml 使用 TableName 中的参数
- javascript - 基于子(非父)节点循环遍历对象数组
- android - 计时器问题
- reactjs - 如何在我的 FullStack React Express 应用程序中使用 Redux?
- java - 使用Java创建注册表并将其与在线数据库连接
- css - 顺风将一个 div 放在另一个 div 网格的底部
- excel - 提取保存公式的工作簿名称,而不是当前使用的工作簿名称