tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大
Posted
技术标签:
【中文标题】tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大【英文标题】:Huge difference between in accuracy between model.evaluate and model.predict for tensorflow CNN model 【发布时间】:2020-10-14 19:45:56 【问题描述】:我将 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.compile()
声明更新您的问题,特别是损失和指标
@strider0160 完成
不确定您的生成器是如何工作的,但您确定y_val
和model.predict
中使用的图像之间的类正确排列吗?
@MZ y_val 值全部按类排序。无论如何,我不再收到错误了。我认为这与拥有两个独立的生成器实例有关。
@MZ 每个 ImageDataGenerator 分别提供给 train_gen 和 val_gen。他们得到相同的种子但不同的子集参数,“训练”和“验证”。训练者获得所有增强,而验证者只获得重新缩放参数。可能与增强或单独的实例有关。
【参考方案1】:
model.evaluate 和 model.predict 的准确度值不同的问题似乎可以通过创建不同的 ImageDataGenerator() 实例但具有相同的种子来解决。
此外,有时在训练 KeyInterrupts 或加载检查点期间,应重新初始化生成器实例,因为可能会出现问题。
【讨论】:
以上是关于tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大的主要内容,如果未能解决你的问题,请参考以下文章
Tensorflow 中带有 model.fit 的 InvalidArgumentError
是否可以在 TensorFlow 上加载学习模型(.t7)?
TensorFlow学习笔记--- 使用CPABD实现最简单的CNN模型