gpt4 book ai didi

tensorflow - 使用 TensorFlow 2 将 Dropout 添加到 MobileNet

转载 作者:行者123 更新时间:2023-12-04 01:40:47 27 4
gpt4 key购买 nike

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

这是明智的,还是可行的?

或者,我能想到的唯一其他想法是:
  • 捕获更多图像,使训练更加困难 - 但我认为每个项目 750 应该足以做得很好。
  • 不要使用 MobileNet,从头开始创建神经网络或使用另一个预先存在的神经网络。
  • 最佳答案

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

  • Shuffle数据,通过使用 shuffle=Truecnn_model.fit .代码如下所示:
    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 l2Regularizer = 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))
  • 尝试更换 GlobalAveragePooling2DMaxPool2D
  • 您可以尝试使用 BatchNormalization .
  • 使用 ImageDataGenerator 执行图像数据增强.引用 this link有关更多信息。
  • 如果Pixels不是 Normalized ,将像素值除以 255也有帮助。
  • 最后,如果仍然没有变化,您可以尝试其他Pre-Trained Models喜欢 ResNet , Vgg Net , DenseNet (正如 Mohsin 在评论中提到的)
  • 关于tensorflow - 使用 TensorFlow 2 将 Dropout 添加到 MobileNet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57524334/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com