CNN(Python Keras)的训练过程

时间:2018-08-18 15:39:22

标签: 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. 训练模型时,展平层的输出在各个时期是否发生变化?
  2. 如果(Flatten层的)输出发生变化,是否表示在Flatten层(在Conv2d-> Conv2D-> MaxPooling2D-> Flatten之间)之前还有反向传播过程?
  3. 在MaxPooling2D层(或展平前的任何层)之后使用Dropout有什么必要?

1 个答案:

答案 0 :(得分:1)

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

  2. 平坦层没有什么独特之处可以防止反向传播应用于之前的层。如果有的话,那将阻止对先前的层进行培训。为了在压平之前训练层,必须进行反向传播。反向传播是用于更新网络中权重的过程。如果从未将其应用于起始层,则将永远不会对其进行更新,并且他们将永远不会学到任何东西。

  3. 下降层用于其正则化效果,以减少过度拟合。通过随机选择一些在任何给定运行中将被停用的神经元,辍学尝试迫使网络学习更多独立,强大的功能。它不能依赖一小部分神经元,因为它们可能不会被使用。平坦层之前和之后都适用相同的想法。

在网络的特定位置是否包括辍学是否有用将取决于您的特定用例。例如,如果您不为网络过度安装而苦苦挣扎,那么辍学可能无济于事。通常,确切地决定何时使用辍学以及使用多少辍学只是一个实验问题,以查看对您的数据有效的方法。