我用以下架构构建了CNN:

X = self.conv_layer_1(inputs)
X = self.conv_layer_2(X)
X = self.max_pool_1(X)
X = self.dropout_1(X,training = training)
X = self.batch_norm_1(X,training = training)

X = self.conv_layer_3(X)
X = self.conv_layer_4(X)
X = self.max_pool_2(X)
X = self.dropout_2(X,training = training)
X = self.batch_norm_2(X,training = training)

X = self.flatten(X)
X = self.dense_1(X)
X = self.batch_norm_3(X,training = training)
X = self.dropout_3(X)
X = self.softmax(X)

return X


如果我不使用batch_normalization层,那么我将获得很好的准确性(训练95%,测试79%)。如果仅使用self.batch_norm_3,则结果会变得更糟,并且在测试集上,损失有时会急剧增加(就像每3-4个时期一样,损失从1.23123变为500000)。

如果我使用self.batch_norm_1和/或self.batch_norm_2,则我始终可以得到10%的测试和训练精度。

为什么会这样呢?

我已经使用了CIFAR-10数据集。

最佳答案

link可以帮助您理解。

请注意-密集层是FC层,可进一步用于预测,无需标准化其输出。
当输入数据中存在较大变化(也称为协变量平移)时,标准化以及因此使用batchnorm很有用,这进一步为其他CNN层创建了不平衡的输入数据。

关于python - tensorflow 2.0中的批次标准化使预测结果更糟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58845793/

10-12 22:22