【问题标题】:Training process of a CNN (Python Keras)CNN(Python Keras)的训练过程
【发布时间】:2019-01-25 08:52:47
【问题描述】:

考虑以下 CNN 架构,(code fragment was referred from this link)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

我的问题基本上是关于 CNN 的训练过程。

  1. 当您训练模型时,Flatten 层的输出是否会在 epoch 期间发生变化?
  2. 如果(Flatten 层的)输出发生变化,是否意味着在 Flatten 层(Conv2d->Conv2D->MaxPooling2D->Flatten 之间)之前也存在反向传播过程?
  3. 在 MaxPooling2D 层(或展平之前的任何层)之后使用 Dropout 的必要性是什么?

【问题讨论】:

  • @Downvoter 你能解释一下对这个问题投反对票的原因吗?

标签: python python-3.x tensorflow keras keras-layer


【解决方案1】:
  1. 扁平化层只是简单地获取前一层的输出并将所有内容扁平化为一个长向量,而不是将其保持为多维数组。所以 flatten 层本身不需要学习任何权重,它计算输出的方式也不会改变。它的实际输出在你训练时确实会发生变化,因为前面的层正在被训练,所以它们的输出也在变化,因此 flatten 的输入也在变化。

  2. 扁平层没有什么独特之处可以防止反向传播应用于它之前的层。如果有,那将阻止前面的层被训练。为了在展平之前训练层,必须进行反向传播。反向传播是用于更新网络中权重的过程。如果它从未应用于起始层,它们将永远不会被更新,也永远不会学到任何东西。

  3. Dropout 层用于其正则化效果以减少过度拟合。通过在任何给定的运行中随机选择一些要停用的神经元,dropout 试图迫使网络学习更独立、更强大的特征。它不能依赖一小部分神经元,因为它们可能不会被使用。同样的想法适用于展平层之前和之后。

在您的网络中的特定点包括 dropout 是否有用取决于您的特定用例。例如,如果您没有为网络过度拟合而苦苦挣扎,那么 dropout 可能无助于改善您的结果。通常准确地决定何时使用 dropout 以及使用多少是一个实验问题,以查看什么对您的数据有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2019-04-15
    • 2018-11-14
    • 2018-12-16
    • 2017-10-14
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多