为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的训练过程。
答案 0 :(得分:1)
扁平化层仅获取上一层的输出并将所有内容扁平化为一个长向量,而不是将其保留为多维数组。因此,展平层本身无需学习任何权重,并且其计算输出的方式也不会改变。训练期间它的实际输出确实发生了变化,因为前面的层正在训练中,因此它们的输出也在变化,因此要展平的输入也在变化。
平坦层没有什么独特之处可以防止反向传播应用于之前的层。如果有的话,那将阻止对先前的层进行培训。为了在压平之前训练层,必须进行反向传播。反向传播是用于更新网络中权重的过程。如果从未将其应用于起始层,则将永远不会对其进行更新,并且他们将永远不会学到任何东西。
下降层用于其正则化效果,以减少过度拟合。通过随机选择一些在任何给定运行中将被停用的神经元,辍学尝试迫使网络学习更多独立,强大的功能。它不能依赖一小部分神经元,因为它们可能不会被使用。平坦层之前和之后都适用相同的想法。
在网络的特定位置是否包括辍学是否有用将取决于您的特定用例。例如,如果您不为网络过度安装而苦苦挣扎,那么辍学可能无济于事。通常,确切地决定何时使用辍学以及使用多少辍学只是一个实验问题,以查看对您的数据有效的方法。