【问题标题】:How to improve the performance of CNN Model for a specific Dataset? Getting Low Accuracy on both training and Testing Dataset如何提高特定数据集的 CNN 模型的性能?在训练和测试数据集上都获得低准确率
【发布时间】:2022-01-02 07:53:23
【问题描述】:

我们被分配了一个任务,我们应该在其中实现我们自己的神经网络,以及另外两个已经开发的神经网络。我已经这样做了,但这不是作业的要求,但我仍然想知道我可以遵循哪些步骤/程序来提高模型的准确性?

作为一个整体,我对深度学习和机器学习还很陌生,所以不太了解。

给定的数据集总共包含 15 个类别(飞机、椅子等),我们在训练数据集中提供了每个类别的大约 15 张图像。测试数据集每个类别有 10 张图像。

我的代码的完整 github 存储库可以在这里找到(Jupyter Notebook 文件):https://github.com/hassanashas/Deep-Learning-Models

我首先用自己的 CNN 进行了尝试(使用 Youtube 教程制作了一个)。 代码如下,

X_train = X_train/255.0
model = Sequential()

model.add(Conv2D(64, (3, 3), input_shape = X_train.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))

model.add(Dense(16)) # added 16 because it model.fit gave error on 15 
model.add(Activation('softmax'))

对于Model的编译,

from tensorflow.keras.optimizers import SGD

model.compile(loss='sparse_categorical_crossentropy', 
             optimizer=SGD(learning_rate=0.01), 
             metrics=['accuracy'])

我使用稀疏分类交叉熵,因为我的“y”标签是整数值,范围从 1 到 15。

我用以下方式运行这个模型,

model_fit = model.fit(X_train, y_train, batch_size=32, epochs=30, validation_split=0.1)

training dataset 上的准确度为 0.2030testing dataset 上的准确度仅为 0.0733(这两个数据集都存在于 github 存储库中)

然后,我试用了 AlexNet CNN(按照 Youtube 教程获取其代码)

我在同一个数据集上运行 AlexNet 15 个 epoch。它将训练数据集的准确率提高到 0.3317,但测试数据集的准确率甚至比我自己的 CNN 还要差,只有 0.06

之后,我又按照 Youtube 教程尝试了 VGG16 CNN

我在 Google Colab 上运行了 10 个 Epoch 的代码。在第 8 个 epoch 中,它成功地将 training dataset 的准确率提高到 100%。但是这个模型在测试数据集上给出了所有三个中最差的准确度,只有 0.0533

我无法理解所有这些模型的这种对比行为。我尝试了不同的纪元值、损失函数等,但当前的相对给出了最好的结果。当我在 100 个 epoch 上运行时,我自己的 CNN 能够达到 100% 的准确度(但是,它在测试数据集上的结果很差)

我可以做些什么来提高这些模型的性能?具体来说,为了提高深度学习模型的效率,人们应该始终尝试遵循哪些关键事项?我在 Stackoverflow 上查找了多个类似的问题,但几乎所有这些问题都在处理 tensorflow 提供的数据集,例如 mnist 数据集等,但我没有从这些问题中找到太多帮助。

【问题讨论】:

  • 可能过度拟合?
  • 两个观察结果。 (1) 你的数据集感觉非常小(每类训练 15 张图像),这对于网络学习来说可能太少了训练数据。 (2) 训练数据的 100% 准确率是模型过度拟合的指标。这基本上意味着网络记住了训练数据但未能学习任何有意义的模式,这就是为什么它对于测试数据基本上是随机的。
  • @Hassan Ashas 您是否设法提高了准确性?你应用了哪些技术,结果如何?我认为将这些信息分享给未来的读者会很有用。

标签: tensorflow keras deep-learning conv-neural-network


【解决方案1】:

免责声明:我自己玩 CNN 已经有几年了,所以我只能传递一些一般性的意见和建议。

首先,我想谈谈您目前取得的成果。您训练的前两个网络似乎至少从训练数据中学到了一些东西,因为它们的性能比仅仅随机猜测要好。

但是:测试数据的表现表明网络没有学到任何有意义的,因为这些数字表明网络与随机猜测一样好(或仅略好于)。 p>

至于第三个网络:训练数据的高准确率与测试数据的低准确率相结合意味着您的网络已经过拟合。这意味着网络已经记住了训练数据,但没有学习任何有意义的模式。

继续训练已经开始过度拟合的网络毫无意义。因此,一旦连续几个 epoch 的训练准确率提高而测试准确率下降,您就可以停止训练。

增加数据集大小

神经网络依赖大量良好的训练数据来学习模式。您的数据集包含 15 个类,每个类 15 张图像,训练数据非常少。

当然,如果您能获得额外的高质量训练数据来扩展您的数据集,那就太好了,但这并不总是可行的。因此,另一种方法是人为地扩展您的数据集。您可以通过对原始训练数据应用一系列转换轻松地做到这一点。想一想:镜像、旋转、缩放和裁剪。

请记住,不要随意应用这些转换,它们必须有意义!例如,如果您希望网络识别椅子,您是否也希望它识别倒置的椅子?或者用于检测路标:镜像它们没有意义,因为文本、数字和图形在现实生活中永远不会出现镜像。

从您所拥有的课程(飞机和椅子等等......)的简要描述来看,我认为水平镜像可能是最初应用的最佳转换。这将使您的训练数据集大小翻倍。

另外,请记住,人为夸大的数据集永远不如包含所有真实、真实图像的相同大小的数据集。镜像图像包含与其原始图像大部分相同的信息,我们只是希望它能够延迟网络过度拟合,并希望它能够学习重要的模式。

降低学习率

这是一个附带说明,但请尝试降低学习率。您的网络似乎只在几个非常快的时期就过拟合了。显然,降低学习率不会对抗过度拟合,但会发生得更慢。这意味着您有望在过度拟合发生之前找到一个整体性能更好的 epoch。

请注意,较低的学习率永远不会神奇地使表现不佳的网络变好。这只是定位一组性能稍微好一点的参数的一种方法。

随机化训练数据顺序

在训练期间,训练数据分批呈现给网络。这通常在所有迭代中以固定顺序发生。这可能会导致网络出现某些偏差。

首先,确保训练数据至少洗牌一次。您不想一个一个地呈现这些类,例如首先是所有平面图像,然后是所有椅子等等……这可能导致网络在每个 epoch 结束时忘记第一类的大部分内容。

另外,在 epoch 之间重新洗牌训练数据。这将再次避免由于训练数据顺序造成的潜在小偏差。

改进网络设计

您设计了一个只有两个卷积层和两个全连接层的卷积神经网络。也许这个模型太浅了,无法学会区分不同的类。

知道卷积层倾向于首先提取小的视觉特征,然后倾向于将它们组合成更高级别的模式。所以也许添加第三个卷积层可以帮助网络识别更有意义的模式。

显然,网络设计是您必须尝试的东西,而使网络过于深入或复杂也是一个需要提防的陷阱!

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 2020-05-07
    • 2021-06-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2020-11-06
    • 2020-04-27
    相关资源
    最近更新 更多