Tensorflow 批量规范化会破坏验证性能

Tensorflow 批量规范化会破坏验证性能,tensorflow,keras,conv-neural-network,batch-normalization,Tensorflow,Keras,Conv Neural Network,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

根据一些教程,我将向模型中添加一些批处理规范化,以缩短培训时间。 这是我的模型:

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%


为什么会这样

我不确定这是否是您要问的问题,但批处理规范化在验证期间仍然处于活动状态,只是参数在培训期间定义和设置,而不是在验证期间更改


至于为什么批处理规范化通常不适合您的模型/问题,它就像任何超参数一样,有些适用于某些场景,有些则不适用于其他场景。您知道这是否是BN在您的网络中的最佳位置吗?除此之外,您还需要了解更多有关数据和问题的信息,以便进行进一步猜测。

尝试使用较少数量的批处理规范化层。通常在最后一个卷积层使用它。从其中一个开始,如果可以提高验证的准确性,可以添加更多。

我遵循了一个关于介质的教程,其中用户在每个conv层之后放置了一个批处理规范化层,声称这将提高性能/培训时间。我一点也没想到我的验证性能会下降。无论如何,我正在尝试对20个类进行分类,因为数据集大约有1500个图像(每个类大约有75个图像,分布不均匀,有些类可能有一些额外的图像)。BN通常用于帮助进行过度拟合。根据我的经验,它对网络架构非常敏感(我在激活之前使用它,不确定它是否适合池层)。你想在你的网络中使用BN有什么特别的原因吗?我没有特别的原因。我正在努力提高我的准确率(我被困在50%-54%左右),为了得到更好的结果,我尝试了很多方法。课堂上的75张图片实际上不足以进行适当的培训,但我正试图通过我自己的网络实现最好的效果(在转向转移学习之前)