Has*_*has 5 deep-learning conv-neural-network keras tensorflow
我们接到的任务是实现我们自己的神经网络,以及另外两个已经开发的神经网络。我已经这样做了,但是,这不是作业的要求,但我仍然想知道我可以遵循哪些步骤/程序来提高模型的准确性?
我对整个深度学习和机器学习相当陌生,所以没有太多想法。
给定的数据集总共包含 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'))
Run Code Online (Sandbox Code Playgroud)
对于模型的编译,
from tensorflow.keras.optimizers import SGD
model.compile(loss='sparse_categorical_crossentropy',
optimizer=SGD(learning_rate=0.01),
metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
我使用稀疏分类交叉熵,因为我的“y”标签是整数值,范围从 1 到 15。
我用以下方式运行这个模型,
model_fit = model.fit(X_train, y_train, batch_size=32, epochs=30, validation_split=0.1)
Run Code Online (Sandbox Code Playgroud)
它给我的准确度为0.2030 ,training dataset而只有0.0733 (testing dataset这两个数据集都存在于 github 存储库中)
然后,我尝试了AlexNet CNN(遵循 Youtube 教程获取其代码)
我在同一数据集上运行了 AlexNet 15 个时期。它将训练数据集的准确性提高到了0.3317,但是测试数据集的准确性甚至比我自己的 CNN 还要差,只有0.06
之后,我再次按照 Youtube 教程尝试了VGG16 CNN 。
我在 Google Colab 上运行了该代码 10 个 Epoch。它在第 8 个 epoch 中成功提高了100% 的准确率training dataset。但该模型在测试数据集上的准确度是这三个模型中最差的,只有0.0533
我无法理解所有这些模型的这种对比行为。我尝试了不同的纪元值、损失函数等,但当前的相对给出了最好的结果。当我运行 100 个 epoch 时,我自己的 CNN 能够达到 100% 的准确率(但是,它在测试数据集上的结果非常差)
我可以做些什么来提高这些模型的性能?具体来说,为了提高深度学习模型的效率,人们应该始终遵循哪些关键的事情?我在 Stackoverflow 上查找了多个类似的问题,但几乎所有问题都在处理由张量流提供的数据集,如 mnist 数据集等,但我没有从这些问题中找到太多帮助。
免责声明:我自己玩CNN已经有几年了,所以我只能传递一些一般性的意见和建议。
首先,我想谈谈你们迄今为止所取得的成果。您训练的前两个网络似乎至少从训练数据中学到了一些东西,因为它们的性能比随机猜测要好。
然而:测试数据的性能表明网络没有学到任何有意义的东西,因为这些数字表明网络与随机猜测一样好(或仅比随机猜测好一点)。
至于第三个网络:训练数据的高精度与测试数据的低精度相结合意味着您的网络已经过度拟合。这意味着网络已经记住了训练数据,但没有学到任何有意义的模式。
继续训练已经开始过度拟合的网络是没有意义的。因此,一旦训练精度连续几个 epoch 增加而测试精度下降,你就可以停止训练。
神经网络依赖大量良好的训练数据来学习模式。您的数据集包含 15 个类,每个类有 15 张图像,训练数据非常少。
当然,如果您能够获得额外的高质量训练数据来扩展您的数据集,那就太好了,但这并不总是可行的。因此,另一种方法是人为扩展数据集。您可以通过对原始训练数据应用一系列转换来轻松地做到这一点。想想:镜像、旋转、缩放和裁剪。
请记住,不要随意应用这些转换,它们必须有意义!例如,如果您希望网络识别一把椅子,您是否也希望它识别倒置的椅子?或者用于检测路标:镜像它们是没有意义的,因为文本、数字和图形在现实生活中永远不会出现镜像。
从您所拥有的课程的简要描述(飞机和椅子等等......)来看,我认为水平镜像可能是最初应用的最佳转换。这已经使你的训练数据集大小增加了一倍。
另外,请记住,人为夸大的数据集永远不如包含所有真实图像的相同大小的数据集。镜像图像包含许多与其原始图像相同的信息,我们只是希望它能够延迟网络过度拟合,并希望它能够学习重要的模式。
这是一个旁注,但请尝试降低学习率。你的网络似乎只在几个时期内就过拟合了,而且速度非常快。显然,降低学习率并不能对抗过度拟合,但会发生得更慢。这意味着您有希望在过度拟合发生之前找到一个整体性能更好的纪元。
请注意,较低的学习率永远不会神奇地使表现不佳的网络变得良好。这只是定位一组性能稍好一点的参数的方法。
在训练过程中,训练数据会批量呈现给网络。这通常在所有迭代中以固定顺序发生。这可能会导致网络中出现某些偏差。
首先,确保训练数据至少被打乱一次。您不想一一呈现类别,例如首先是所有平面图像,然后是所有椅子等......这可能会导致网络在每个时期结束时忘记第一类的大部分内容。
此外,在历元之间重新调整训练数据。这将再次避免由于训练数据顺序而导致潜在的微小偏差。
您设计了一个仅包含两个卷积层和两个全连接层的卷积神经网络。也许这个模型太浅,无法学习区分不同的类别。
要知道,卷积层倾向于首先拾取小的视觉特征,然后倾向于将这些特征组合成更高级别的模式。因此,添加第三个卷积层可能有助于网络识别更有意义的模式。
显然,网络设计是您必须进行试验的事情,并且使网络过于深入或复杂也是一个需要提防的陷阱!
| 归档时间: |
|
| 查看次数: |
18842 次 |
| 最近记录: |