python - CNN(Python Keras)的训练过程

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

考虑以下 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 层的输出会在周期内发生变化吗?
  2. 如果(Flatten 层)的输出发生变化,是否意味着 Flatten 层之前(Conv2d->Conv2D->MaxPooling2D->Flatten 之间)也存在反向传播过程?
  3. 在 MaxPooling2D 层(或展平之前的任何层)之后使用 Dropout 的必要性是什么?

最佳答案

  1. 展平层仅获取前一层的输出,并将所有内容展平为一个长向量,而不是将其保留为多维数组。因此,展平层本身不需要学习任何权重,并且它计算输出的方式永远不会改变。当你训练时,它的实际输出确实会改变,因为前面的层正在接受训练,所以它们的输出正在改变,因此扁平化的输入正在改变。

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

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

在网络中的特定点包含丢失是否有用取决于您的特定用例。例如,如果您没有遇到网络过度拟合的问题,那么 dropout 可能无助于改善您的结果。通常,要准确决定何时使用 dropout 以及使用多少,需要通过实验来确定什么对您的数据有效。

关于python - CNN(Python Keras)的训练过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51910188/

相关文章:

.net - 如何快速(易于编写脚本)预览 3D 矢量/线条?

python - 如何从 namespace Django URL 获取绝对字符串?

python-3.x - 如何在 python 中只运行一次算法

python - 日期时间差异(以小时为单位),不包括周末

python - TensorFlow InvalidArgumentError : Matrix size-compatible: In[0]: [100, 784], In[1] : [500, 10]

python - 在标准 CNN 上应用批量归一化的位置

python - 自定义 keras 层引发 : ValueError: An operation has `None` for gradient

python - argparse。 nargs + 自定义类型时不起作用

python - 基于Python的cmd模块创建交互式shell的自动化测试

python-3.x - Python 海象运算符在范围内失败