【问题标题】:Why is the accuracy of CNN model changing every time?为什么CNN模型的准确率每次都在变化?
【发布时间】:2021-07-14 14:29:48
【问题描述】:

当我通过 CNN 运行图像分类代码时,我收到此错误“73138176 的分配超过系统内存的 10%”。我使用不同的解决方案来解决我的问题。但是,它改变了每次测试中的模型精度。

此处的模型准确度为 0.6761

model.fit(X, y, batch_size=32, epochs=9, validation_split=0.3)

然后,当我将 batch_size 降低到 2 时,这里的准确度增加到 0.8451。此外,它没有给出任何与分配问题有关的错误。

model.fit(X, y, batch_size=2, epochs=9, validation_split=0.3)

然后,我也很好奇一个代码也解决了分配问题。然而,这一次,这里的模型准确率是 0.7183。代码是;

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

model.fit(X, y, batch_size=32, epochs=9, validation_split=0.3)

我的问题是,您实际上建议我应该遵循哪个代码?另外,请你告诉我为什么每次精度都会改变?

感谢您的每一个帮助和建议。

【问题讨论】:

  • 如果没有有关数据集和模型架构的信息,真的不可能回答这个问题。模型训练时间在运行之间可能会有很大差异,并且比较一定数量的 epoch 的准确性不是一个好主意。您应该遵循准确度/验证准确度曲线(或损失曲线),例如i.stack.imgur.com/boKiX.png 。使用相同的参数再次训练您的模型,您可能会看到非常不同的结果。 TF_CPP_MIN_LOG_LEVEL 只是一个调试器标志,不应影响训练。
  • @NiteyaShah 非常感谢。我通过 TensorBoard 获取了准确度/验证图。但是,在每次运行中,精度值也会发生变化。我认为你再次训练模型是对的。
  • 我正在使用@sentdex 在 YouTube 上分享的方法。他用; --> 导入随机 --> random.shuffle(training_data)。你认为这是因为我们随机获取 training_data 吗?
  • 如前所述,提高日志级别并不能解决问题,它只会删除消息。这不是错误,更像是内存使用量变得非常高的警告。解决此问题的唯一方法是减少内存使用量(例如减少批量大小)或获得更多内存。
  • 不,它与随机化数据集无关。这是神经网络的固有属性,这并没有错。只需训练您的模型进行更多的 epoch,您就应该让所有运行都达到几乎相同的准确度。

标签: python python-3.x python-2.7 tensorflow conv-neural-network


【解决方案1】:

如果您想要完全可重复的训练结果,您需要消除所有随机性来源。对于典型的模型训练,主要来源在 1:您的数据集;测试/训练拆分的随机化,或批次生成顺序的随机化。和2:模型初始化;如果要每次都训练相同的模型,则每次都需要从相同的初始参数开始。如何确保每次训练运行都获得“相同的随机数”因框架而异;几年前我在 TF 中尝试的最后一次是不合理的痛苦;但它可以做到,如果你在 TF 中搜索修复随机种子,谷歌应该知道该怎么做。

但是,修复随机种子可能不是您感兴趣的;为了进行可重复的实验,这就是您想要的。但就您的模型的生产质量而言,那是另一回事。如果您发现最终得到的模型根据种子的不同表现得相当不同(许多问题本质上都具有此属性,其中存在多个“同样有效”但存在相当不同的解释),训练此类模型的集合,使用每个不同的随机种子,是一件有用的事情;通过这种方式,您可以清楚地了解您的模型和数据集留有多少“解释空间”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多