【问题标题】:How to add Dropout in CNN如何在 CNN 中添加 Dropout
【发布时间】:2019-10-19 16:47:24
【问题描述】:

我正在使用 CNN 训练一个时尚 MNIST 数据。由于过度拟合,我尝试添加 Dropout 层。但它不起作用

在我添加 Dropout 之前,模型运行良好。

def fashion_model()
    batch_size = 64
    epochs = 20
    num_classes = 10
    fashion_drop_model = Sequential()
    fashion_drop_model.add(Conv2D(32, kernel_size=(3, 3),activation='linear',padding='same',input_shape=(28,28,1)))
    fashion_drop_model.add(LeakyReLU(alpha=0.1))
    fashion_drop_model.add(MaxPooling2D((2, 2),padding='same'))
    fashion_drop_model.add(Dropout(0.25))

    fashion_drop_model.add(Conv2D(64, (3, 3), activation='linear',padding='same'))
    fashion_drop_model.add(LeakyReLU(alpha=0.1))
    fashion_drop_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
    fashion_drop_model.add(Dropout(0.25))

    fashion_drop_model.add(Conv2D(128, (3, 3), activation='linear',padding='same'))
    fashion_drop_model.add(LeakyReLU(alpha=0.1))                  
    fashion_drop_model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
    fashion_drop_model.add(Dropout(0.4))

    fashion_drop_model.add(Flatten())
    fashion_drop_model.add(Dense(128, activation='linear'))
    fashion_drop_model.add(LeakyReLU(alpha=0.1))           
    fashion_drop_model.add(Dropout(0.3))
    fashion_drop_model.add(Dense(num_classes, activation='softmax'))

    return fashion_drop_model.summary()

fashion_model()

我得到的错误是:UnboundLocalError: local variable 'a' referenced before assignment

PS:在逐行浏览代码后,我发现错误正在蔓延到第 8 行 (fashion_drop_model.add(Dropout(0.25)))

【问题讨论】:

  • 你能告诉我们你的整个代码吗?我认为问题不在于Dropout 层。你在哪里使用变量a
  • 你用的是哪个版本的tensorflow/python?
  • 看起来更像是 Python 错误。检查您的代码是否存在虚假的a
  • @VishnuDasu 变量 a 不在我的代码上下文中——可能来自模块 Dropout。
  • @ThibaultBacqueyrisses 版本:Python 3.7.3、Keras==2.2.4、tensorflow==1.13.1

标签: python machine-learning keras deep-learning conv-neural-network


【解决方案1】:

您的 Python 函数定义中缺少一个冒号:

def fashion_model(): #<--

完成此操作后,代码应该运行。在 Google Colaboratory 中运行此程序,您会看到生成了您的模型的摘要:

注意

强烈建议不要在卷积层之后使用 Dropout 层。卷积层的重点是利用空间邻域内的像素来提取正确的特征以馈送到密集层。 Dropout 会破坏这种关系,从而阻止您的模型成功学习这些特征。

有关详细信息,请参阅 Reddit 上的此讨论:https://www.reddit.com/r/MachineLearning/comments/42nnpe/why_do_i_never_see_dropout_applied_in/

【讨论】:

  • 感谢您的帮助。该代码适用于 Google Collab,但不适用于 localhost jupyter notebook。我使用的是 python 3.7.3,而 google collab 使用的是 3.7.6。我将 jupyter notebook (local) 的版本更改为 3.7.6,现在可以使用了。
  • 让我补充一点,虽然最初确实认为 dropout 层不应该在卷积层之后使用,但最近有一些研究表明这样做可能会有一些好处;请参阅 SE 线程 Where should I place dropout layers in a neural network? 以及其中提供的链接。
  • @desertnaut 指出。谢谢!看起来我们可以添加它们……只是在合并层之后才有意义……尽管丢弃率较低,但也有意义。
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 2021-03-27
  • 2018-07-18
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2020-02-27
相关资源
最近更新 更多