如果我的 Dropout 太高会怎样?在我的 2048-neuron-dense 层上使用什么 Dropout? (数据很少)
What happens if my Dropout is too high? what Dropout to use on my 2048-neuron-dense layer? (very little data)
我对此很陌生,我正在用 keras 写我的学士论文。我有这个大的 CNN,构建类似于 vgg 但有点不同,因为我有更大分辨率的图像并且我池化了更多一点。我在上面添加了一个 2048 的密集层。我使用什么 Dropout。我想选择一个 high dropout,因为我的数据很少(见下文)并且我添加了很多神经元。但是当它太高时会发生什么?
我问是因为我的时间有限,网络需要大约 3 天的时间来训练。如果有人以任何方式知道答案或提示,我将不胜感激。也非常欢迎任何其他 recommendations/propositions 改变或做的事情,对你有用的事情。
提前致谢!
这是我构建模型的方式:
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'))
我还想补充一点,我的训练数据很少。这就是为什么我想要大辍学。每个 class 我有大约 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 并且:优化器=optimizers.Adam(learning_rate=0.0000015)
再次感谢!
Dropout用于防止模型过拟合。我能理解为什么你会想要使用 high dropout,因为你的数据集非常小。但是使用高 dropout 值对您的模型有害,并且会妨碍您的模型正确学习。由于您有一个验证集,因此可以使用它来了解您的模型是否过度拟合。当训练准确性和验证准确性之间存在较大差距时,您可以停止训练模型。我建议您从 0.5 的 Dropout 开始,如果您对模型的性能不满意,请逐渐增加它。
我对此很陌生,我正在用 keras 写我的学士论文。我有这个大的 CNN,构建类似于 vgg 但有点不同,因为我有更大分辨率的图像并且我池化了更多一点。我在上面添加了一个 2048 的密集层。我使用什么 Dropout。我想选择一个 high dropout,因为我的数据很少(见下文)并且我添加了很多神经元。但是当它太高时会发生什么?
我问是因为我的时间有限,网络需要大约 3 天的时间来训练。如果有人以任何方式知道答案或提示,我将不胜感激。也非常欢迎任何其他 recommendations/propositions 改变或做的事情,对你有用的事情。
提前致谢! 这是我构建模型的方式:
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'))
我还想补充一点,我的训练数据很少。这就是为什么我想要大辍学。每个 class 我有大约 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 并且:优化器=optimizers.Adam(learning_rate=0.0000015)
再次感谢!
Dropout用于防止模型过拟合。我能理解为什么你会想要使用 high dropout,因为你的数据集非常小。但是使用高 dropout 值对您的模型有害,并且会妨碍您的模型正确学习。由于您有一个验证集,因此可以使用它来了解您的模型是否过度拟合。当训练准确性和验证准确性之间存在较大差距时,您可以停止训练模型。我建议您从 0.5 的 Dropout 开始,如果您对模型的性能不满意,请逐渐增加它。