5

我用较小的数据集训练了以下 CNN 模型,因此它会过度拟合:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), input_shape=(28,28,1), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))

model.add(Conv2D(32, kernel_size=(3,3), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.4))

model.add(Flatten())
model.add(Dense(512))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer=Adam(), metrics=['accuracy'])

该模型有很多可训练的参数(超过 300 万,这就是为什么我想知道我是否应该使用额外的 MaxPooling 来减少参数数量,如下所示?

Conv - BN - Act - MaxPooling - Conv - BN - Act - MaxPooling - Dropout - Flatten

或者像下面这样额外的 MaxPooling 和 Dropout?

Conv - BN - Act - MaxPooling - Dropout - Conv - BN - Act - MaxPooling - Dropout - Flatten

我试图理解 MaxPooling 的全部意义以及它是否有助于防止过度拟合。

4

2 回答 2

5

当您的数据集不足以容纳您的特征数量时,可能会发生过度拟合。最大池化使用最大操作来池化特征集,从而使您拥有较少数量的特征。因此,最大池化应该在逻辑上减少过拟合。

辍学通过确保某个特征并不总是可用来减少对任何单个特征的依赖,迫使模型寻找不同的潜在提示,而不是仅仅坚持一个——这很容易让模型过度拟合任何明显好的提示。因此,这也应该有助于减少过拟合。

于 2020-01-13T13:24:20.613 回答
0

你不应该使用Max-pooling 来减少过度拟合,虽然它对此影响很小,但是这个小效果还不够,因为你在卷积操作之后应用 Max-Pooling,这意味着特征已经在这一层并且由于使用最大池化来降低输出的高度和宽度,这将使下一层中的特征有更少的卷积操作可供学习,这意味着对过度拟合问题的影响很小,不会解决这个问题。实际上,完全不建议使用 Pooling 来解决此类问题,这里有一些提示:

  1. 减少参数的数量,因为很难(并非不可能)找到足够的数据来训练 300 万个参数而不会过度拟合。
  2. 使用正则化技术,例如非常有效的 Drop-out,或者 L2-regularization 等。
  3. 3.不要使用最大池来减少过度拟合,因为它用于减少表示并使网络对某些功能更加健壮,进一步使用它会使网络对某些功能越来越健壮种特征。

希望有帮助!

于 2020-02-11T11:35:14.720 回答