tensorflow - 为什么批量标准化会降低我的模型训练准确性?
问题描述
在我添加批量归一化层之前,我的模型的训练准确度为 97%,但是一旦我添加了批量归一化层,我的准确度就下降到了 70%。为什么会发生这种情况以及在进行批量标准化时提高准确性的任何方法?
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
#first hidden layer
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2)))
#output layer
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()
model_checkpoint = ModelCheckpoint( "model.hdf5", verbose=1, save_best_only=True)
model.compile(loss='binary_crossentropy',
optimizer= 'adam',
metrics=['accuracy'])
解决方案
批量标准化并不能保证您的性能会提高。但在某些情况下它确实运作良好。
您可以尝试做的一件事是:
增加训练的批量大小。这将为标准化提供更合适的均值和标准差。
使用 BN 参数,特别是动量参数。在此处查看有关参数的更多信息https://keras.io/api/layers/normalization_layers/batch_normalization/ 我建议减少动量并重试。
如果它仍然不起作用,请忽略它。
推荐阅读
- javascript - 使用 JavaScript 在 HTML 中找不到变量
- google-apps-script - 在 Google 表格上创建时间控制触发器
- java - 如何在我的 android 应用程序中使 K-mean 图像处理算法更快
- c++ - C++ 字符串数组在 20 字节后拆分
- rust - edition = "2018" 使用或不使用`extern crate
` - docker - 使用 Haskell-stack 构建 docker 容器时出现问题:如何确保 Haskell-stack 继续构建到最后?
- java - HTML 忽略 ajax 调用
- javascript - 如何替换特定页面?[HTML 多语言网站]
- android - Android 秘密存储 API 密钥
- python - 如何从给定列表中选择所有可能的子列表对,其联合将成为列表?