【问题标题】:What happens if my Dropout is too high? what Dropout to use on my 2048-neuron-dense layer? (very little data)如果我的 Dropout 太高会怎样?在我的 2048 神经元密集层上使用什么 Dropout? (数据很少)
【发布时间】:2021-01-25 01:41:50
【问题描述】:

我对此很陌生,我正在用 keras 写我的学士论文。我有这个大的 CNN,构建类似于 vgg,但有点不同,因为我有更大的分辨率图像,而且我的池更多一点。我在顶部添加了一个 2048 密集层。我使用什么 Dropout。我想要一个高辍学,因为我的数据很少(请阅读下文)并且我添加了许多神经元。但是当它太高时会发生什么?

我之所以问,是因为我的时间有限,而且网络需要大约 3 天的时间来训练。如果有人以任何方式知道答案或提示,我将不胜感激。任何其他关于改变或做什么的建议/提议,什么对你有用,也非常欢迎。

提前致谢! 以下是我构建模型的方式:

model = Sequential()
model.add(Conv2D(64, (3, 3), strides=1, activation='swish', input_shape = input_shape, trainable=True))
model.add(MaxPooling2D((2, 2), name='pool0'))
model.add(Conv2D(64, (3, 3), strides=1, activation='swish', trainable=True))
model.add(MaxPooling2D((2, 2), name='pool1'))

model.add(Conv2D(128, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(128, (3, 3), strides=1, activation='swish', trainable=True))
model.add(MaxPooling2D((2, 2),name='pool2'))

model.add(Conv2D(256, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(256, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(256, (3, 3), strides=1, activation='swish', trainable=True))
model.add(MaxPooling2D((2, 2),name='pool3'))

model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(MaxPooling2D((2, 2),name='pool4'))

model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(Conv2D(512, (3, 3), strides=1, activation='swish', trainable=True))
model.add(MaxPooling2D((2, 2),name='pool5')) 

model.add(Flatten())
model.add(Dense(2048,activation='swish', name='vgg_int'))
model.add(Dropout(0.65))
model.add(Dense(17,activation='softmax')) 

我还想补充一点,我可以训练的数据很少。这就是为什么我想要大辍学。我每堂课大约有100张照片。有时甚至只有 60 个,有时是 200 个:


Found 1807 images belonging to 17 classes.
Found 170 images belonging to 17 classes.

我相信它可以在验证集上超过 90%,但是最好的方法是什么,我真的不知道。如果我辍学 90% 会怎样?我目前运行 60%,但模型较小,顶部只有 1024 个神经元:

Epoch 19/50
226/226 [==============================] - 4966s 22s/step - loss: 0.5661 - accuracy: 0.8307 - val_loss: 0.5752 - val_accuracy: 0.8412
Epoch 20/50
226/226 [==============================] - 4157s 18s/step - loss: 0.5511 - accuracy: 0.8329 - val_loss: 0.5042 - val_accuracy: 0.8647

我正在运行 batch_size = 8 并且:optimizer=optimizers.Adam(learning_rate=0.0000015)

再次,非常感谢!

【问题讨论】:

    标签: machine-learning keras conv-neural-network dropout image-classification


    【解决方案1】:

    Dropout 用于防止模型过拟合。我可以理解您为什么要使用高辍学,因为您的数据集非常小。但是使用高 dropout 值对您的模型有害,并且会妨碍您的模型正确学习。由于您有一个验证集,请使用它来了解您的模型是否过度拟合。当训练准确度和验证准确度之间存在较大差距时,您可以停止训练模型。如果您对模型的性能不满意,我建议您从 0.5 的 Dropout 开始并逐渐增加它。

    【讨论】:

    • 一般来说,Dropout 没有最佳值,它都是关于测试和实验的。此外,如果您发现您的模型仍然过拟合,那么您可以减少模型的架构,因为您的训练数据很少
    猜你喜欢
    • 2017-10-20
    • 2019-06-16
    • 2020-07-17
    • 2019-08-09
    • 2020-08-25
    • 2016-12-05
    • 2022-01-10
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多