使用 TensorFlow 2 将 Dropout 添加到 MobileNet

     2023-03-13     77

关键词:

【中文标题】使用 TensorFlow 2 将 Dropout 添加到 MobileNet【英文标题】:Adding Dropout to MobileNet with TensorFlow 2 【发布时间】:2019-12-22 18:15:11 【问题描述】:

我正在使用 MobileNet 和 TensorFlow 2 来区分 4 个非常相似的玩具。每个玩具我正好有 750 张图片,一个标签包含 750 张“负面”图片,没有任何玩具。

我之前使用 MobileNet 并取得了相当大的成功,但这种情况导致了很多过度拟合(训练/验证准确度之间存在约 30-40% 的差异)。该模型在 3 个 epoch 内很快训练到大约 99.8% 的训练准确度,但验证准确度停留在 75% 左右。验证数据集是 20% 的输入图像的随机集。在查看模型的准确性时,人们对其中一个玩具有很大的偏见,而很多其他玩具被错误地识别为那个玩具。

我已经尝试了几乎所有的方法来解决这个问题:

我在添加到 MobileNet 顶部的 Conv2D 层之后添加了 Dropout,并尝试了介于 0.2 和 0.9 之间的各种丢弃率。

model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(label_count, activation='softmax')
])

我在 Conv2D 层之前添加了一个额外的 Dropout 层,这似乎稍微改善了一些事情:

model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Conv2D(32, 3, activation='relu'),
  tf.keras.layers.Dropout(0.5),
  tf.keras.layers.GlobalAveragePooling2D(),
  tf.keras.layers.Dense(label_count, activation='softmax')
])

我还添加了更多测试数据,尝试混合各种照明条件和背景下的玩具照片,并生成叠加在随机背景上的玩具图像。这些都不会产生重大影响。

我应该将 dropout 添加到 MobileNet 模型中,而不仅仅是添加到我在它之后添加的层吗?我在 github 上遇到了 this code 这样做,但我不知道这是否真的是一个好主意 - 或者不知道如何使用 TensorFlow 2 实现这一点。

这是明智的还是可行的?

另外,我能想到的唯一其他想法是:

捕获更多图像,使训练更加困难 - 但我认为每个项目 750 应该足以做得很好。 不要使用 MobileNet,而是从头开始创建神经网络或使用另一个预先存在的网络。

【问题讨论】:

1.使用其他架构;我会推荐 Densenet121Densenet169,从 imagenet 权重开始并对其进行微调。 2. 在训练期间添加增强 【参考方案1】:

由于模型过度拟合,您可以

    Shuffle 数据,通过在cnn_model.fit 中使用shuffle=True。代码如下:

    history = cnn_model.fit(x = X_train_reshaped, y = y_train, batch_size = 512, epochs = epochs, callbacks=[callback], verbose = 1, validation_data = (X_test_reshaped, y_test), validation_steps = 10, steps_per_epoch=steps_per_epoch, shuffle = True)

    使用Early Stopping。代码如下所示

callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=15)

    使用Regularization。正则化代码如下(你也可以试试l1 Regularizationl1_l2 Regularization):

    from tensorflow.keras.regularizers import l2

    Regularizer = l2(0.001)

    cnn_model.add(Conv2D(64,3, 3, input_shape = (28,28,1), activation='relu', data_format='channels_last', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

    cnn_model.add(Dense(units = 10, activation = 'sigmoid', activity_regularizer=Regularizer, kernel_regularizer=Regularizer))

    尝试用MaxPool2D替换GlobalAveragePooling2D

    您可以尝试使用BatchNormalization

    使用ImageDataGenerator 执行图像数据增强。有关更多信息,请参阅 this link。

    如果Pixels 不是Normalized,将像素值除以255 也有帮助。

    最后,如果还是没有变化,你可以试试其他Pre-Trained Models,比如ResNetVgg NetDenseNet(在cmets中Mohsin提到过)

【讨论】:

tensorflow学习之使用dropout解决overfitting(过拟合)问题(代码片段)

#使用dropout解决overfitting(过拟合)问题#如果有dropout,在feed_dict的参数中一定要加入dropout的值importtensorflowastffromsklearn.datasetsimportload_digitsfromsklearn.cross_validationimporttrain_test_splitfromsklearn.preprocessi 查看详情

TensorFlow LSTM Dropout 实现

】TensorFlowLSTMDropout实现【英文标题】:TensorflowLSTMDropoutImplementation【发布时间】:2017-07-1805:27:10【问题描述】:在调用tf.nn.rnn_cell.DropoutWrapper()时,tensorflow如何具体应用dropout?我读到的关于将dropout应用于rnn的所有内容都参考了Zar... 查看详情

[tf]tensorflow中dropout小坑记录

tensorflow中dropout小坑记录几天看别人写的代码,有几行总觉得没什么用,自己写了小程序测试了下,果然。虽然平时这么写的人不多,但是还是记录下吧。对tensorflow使用时要转变下思维,和平时写的C++不太一样,只是建立了一个... 查看详情

tensorflow用dropout解决overfitting-老鱼学tensorflow

...增加权重的惩罚机制,比如L2正规化,但在本处我们使用tensorflow提供的dropout方法,在训练的时候, 查看详情

TensorFlow CNN 出错 - 没有属性 Dropout

】TensorFlowCNN出错-没有属性Dropout【英文标题】:TensorFlowCNNgeterror-noattributeDroupout【发布时间】:2020-02-2703:36:08【问题描述】:实验在Windows10ProIntel(R)Core(TM)i5-4590CPU@3.3GHz上进行,基于Anaconda平台和SpyderPython3.7.150,通过Python语言和Pyth... 查看详情

tensorflow之tf.nn.dropout():防止模型训练过程中的过拟合问题(代码片段)

一:适用范围:  tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层二:原理:  dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其... 查看详情

mlp中实现dropout,批标准化

...93%左右)相比,使用批标准化的网络准确率由明显的提高dropout是一种常见的防止过拟合的方法,通过将网络中的神经元随机的置0来达到防止过拟合的目的pytorch中使用torch.nn.Dropout()和torch.nn.Dropout2/3d()函数构造,且该层只在训练... 查看详情

将 tensorflow 从 2.1.2 升级到 2.3.0 后,Tensorboard 无法使用

】将tensorflow从2.1.2升级到2.3.0后,Tensorboard无法使用【英文标题】:Tensorboardnotworkingwithafterupgradingtensorflowfrom2.1.2to2.3.0【发布时间】:2021-05-1901:43:00【问题描述】:我使用的是TensorFlow2.1.2和TensorBoard2.4.1,importos,shutilimporttensorflowastf 查看详情

batchnormalization与dropout的冲突

   BN或Dropout单独使用能加速训练速度并且避免过拟合  但是倘若一起使用,会产生负面效果。  BN在某些情况下会削弱Dropout的效果    对此,BN与Dropout最好不要一起用,若一定要一起用,有2中方法:    1在... 查看详情

在推理时启用 dropout 并禁用 BatchNormalization

...nce【发布时间】:2021-10-2501:34:56【问题描述】:我想使用Tensorflow2.5在训练和推理时启用dropout。为此,我在模型中设置了参数training=True的dropout层。layer=tf.keras.layers.Dr 查看详情

在 colab 崩溃模型中不使用recurrent_dropout?

...2020-09-0316:58:35【问题描述】:我正在尝试训练一个简单的tensorflow模型来检测推文的情绪。数组的数据类型和大小是一致的,并且当recurrent_dropout设置为某个浮点值时,模型训练得很好。但是,这会禁用cuDNN,我真的 查看详情

tensorflow学习教程------过拟合

回归:过拟合情况/分类过拟合防止过拟合的方法有三种:1增加数据集2添加正则项  3Dropout,意思就是训练的时候隐层神经元每次随机抽取部分参与训练。部分不参与最后对之前普通神经网络分类mnist数据集的代码进行优化... 查看详情

使用 Keras 将 Dropout 层添加到 Segmentation_Models Resnet34

】使用Keras将Dropout层添加到Segmentation_ModelsResnet34【英文标题】:AddingDropoutLayerstoSegmentation_ModelsResnet34withKeras【发布时间】:2021-12-1200:15:20【问题描述】:我想使用Segmentation_ModelsUNet(带有ResNet34Backbone)进行不确定性估计,所以我... 查看详情

卷积神经网络 - Dropout 会影响性能

...【发布时间】:2017-11-2511:33:47【问题描述】:我正在使用Tensorflow构建一个卷积神经网络(我都是新手),以便识别字母。我的dropout层有一个非常奇怪的行为:如果我不放它(即keep_proba为1),它会表现得非常好并且可以学习(... 查看详情

将 Keras 与 Tensorflow 2、Theano 或 CNTK 后端一起使用是不是存在语法差异?

】将Keras与Tensorflow2、Theano或CNTK后端一起使用是不是存在语法差异?【英文标题】:AretheresyntaxdifferencesbetweenusingKeraswithaTensorflow2,Theano,orCNTKbackend?将Keras与Tensorflow2、Theano或CNTK后端一起使用是否存在语法差异?【发布时间】:2020-0... 查看详情

使用 tensorflow 2 执行矩阵分解的简单方法

】使用tensorflow2执行矩阵分解的简单方法【英文标题】:SimplewayofperformingMatrixFactorizationwithtensorflow2【发布时间】:2021-02-1218:02:27【问题描述】:我一直在寻找如何为我将展示的这个非常简单和基本的案例执行矩阵分解,但没有找... 查看详情

无法将 GPU 与 Tensorflow 一起使用

】无法将GPU与Tensorflow一起使用【英文标题】:CannotuseGPUwithTensorflow【发布时间】:2017-03-0704:51:41【问题描述】:我已经使用CUDA7.5和cuDNN5.0安装了tensorflow。我的显卡是具有2.1功能的NVIDIAGeforce820M。但是,我收到此错误。Ignoringvisible... 查看详情

tensorflow中使用batchnormalization(代码片段)

在深度学习中为了提高训练速度,经常会使用一些正正则化方法,如L2、dropout,后来SergeyIoffe等人提出BatchNormalization方法,可以防止数据分布的变化,影响神经网络需要重新学习分布带来的影响,会降低学习速率,训练时间等问... 查看详情