首页 > 解决方案 > 如何为图像分类问题选择卷积神经网络中密集层的单元数?

问题描述

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

在阅读将图像分类为猫或狗的二元分类问题的代码时,在 Dense 层中,他们使用了 512 个单元。他们是怎么想到的?是否有公式可以获取密集层中的单元数。通常如果有很多特征,我们会在密集层中选择大量的单元。但是在这里我们如何识别特征?我知道输出密集层有一个单元作为它的二进制分类问题,所以输出要么是0 或 1 通过 sigmoid 函数。

标签: tensorflowmachine-learningdeep-learningneural-networkconv-neural-network

解决方案


我对 CNN 的经验是从一个简单的模型开始,然后评估它的性能。如果您达到了令人满意的训练和验证准确度水平,就到此为止。如果不尝试调整学习率等超参数以获得更好的性能,然后再增加模型的复杂性。我发现使用可调节的学习率有助于提高模型性能。为此,请使用 Keras 回调 ReduceLROnPlateau。将其设置为监控验证准确性,如果在指定数量的 epoch 后未能提高,则降低学习率。文档在这里。还可以使用 Keras 回调 ModelCheckpoint 来保存具有最低验证损失的模型。文档在这里。如果这些方法没有达到所需的训练精度水平,那么您可能希望通过向密集层添加更多节点或添加额外的密集层来增加模型复杂性。如果您的模型具有较高的训练准确度但验证准确度较差,则您的模型可能会过度拟合。在这种情况下,添加一个 dropout 层。文档在这里。向模型添加更多复杂性的问题是它倾向于过度拟合。因此,如果您增加密集层中的节点或添加额外的密集层并且验证准确性较差,您将不得不添加 dropout。此外,您可能需要考虑替代方法来控制像正则化器这样的拟合。文档在这里。对于您的具体示例,我认为您需要在密集层中有更多节点。尝试从 64 个节点开始。


推荐阅读