【发布时间】: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.2030,testing 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