批量归一化会破坏验证性能

Batch normalization destroys validation performances

我正在按照一些教程向我的模型添加一些批量归一化以缩短训练时间。 这是我的模型:

model = Sequential()

model.add(Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(64,64,3)))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, kernel_size=(3, 3), activation='relu'))
model.add(BatchNormalization())

model.add(MaxPooling2D(pool_size=(2, 2)))


model.add(Flatten())

model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))

#NB: adding more parameters increases the probability of overfitting!! Try to cut instead of adding neurons!! 
model.add(Dense(units=512, activation='relu'))
model.add(Dropout(0.5))

model.add(Dense(units=20, activation='softmax'))

在没有批量归一化的情况下,我的数据准确率约为 50%。添加批量归一化会破坏我的性能,验证准确率会降低到 10%。

为什么会这样?

我不确定这是否是您要问的,但是批量归一化在验证期间仍然处于活动状态,只是参数是在训练期间定义和设置的,并且在验证期间没有更改。

至于为什么批量归一化通常对您的 model/problem 不利,它就像任何超参数一样,有些适用于某些场景,但不适用于其他场景。您知道这是否是 BN 在您网络中的最佳位置?除此之外,还需要更多地了解您的数据和问题才能做出进一步的猜测。

尝试使用较少数量的批量归一化层。在最后一个卷积层使用它是一种普遍的做法。从其中一个开始,如果可以提高验证准确性,则添加更多。