考虑以下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的培训过程 .
-
训练模型时,Flatten图层的输出会在纪元期间发生变化吗?
-
如果(Flatten图层)的输出发生变化,这是否意味着在Flatten图层之间存在反向传播过程(在Conv2d-> Conv2D-> MaxPooling2D-> Flatten之间)?
-
在MaxPooling2D图层(或展平之前的任何图层)之后使用Dropout的必要性是什么?
1 回答
展平图层简单地获取前一层的输出,并将所有内容展平为一个长向量,而不是将其保持为多维数组 . 因此,展平图层本身没有任何要学习的权重,并且计算其输出的方式永远不会改变 . 当你训练时,它的实际输出会发生变化,因为前面的图层正在训练,因此它们的输出正在改变,因此变平的输入正在改变 .
展平层没有什么独特之处可以阻止反向传播应用于它之前的层 . 如果有,那将阻止前面的层被训练 . 为了在压平之前训练层,必须进行反向传播 . 反向传播是用于更新网络中权重的过程 . 如果它从未应用于起始层,它们将永远不会被更新,并且它们永远不会学到任何东西 .
Dropout图层用于正则化效果,以减少过度拟合 . 通过在任何给定的运行中随机选择一些要停用的神经元,辍学尝试强制网络学习更独立,更健壮的功能 . 它不能依赖于一小部分神经元,因为它们可能不被使用 . 同样的想法适用于展平层之前和之后 .
是否在网络中的特定点包含丢失将取决于您的特定用例 . 例如,如果您没有在网络过度拟合方面苦苦挣扎,那么辍学可能无助于改善您的结果 . 通常决定何时使用辍学和使用多少是一个实验问题,看看什么对你的数据有用 .