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

Mat*_*hio 6 conv-neural-network keras tensorflow batch-normalization

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

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'))
Run Code Online (Sandbox Code Playgroud)

如果没有批量归一化,我的数据准确率约为 50%。添加批量归一化会破坏我的性能,验证准确度降低至 10%。

在此输入图像描述

为什么会发生这种情况?

lea*_*ine 2

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

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