Tensorflow Keras BatchNorm:训练精度提高,而测试精度降低
我试图在Keras中使用BatchNorm。随着时间的推移,训练的准确性会提高。从12%到20%,缓慢但肯定。 但是,测试精度从12%降至0%。随机基线为12% 我假设这是由于batchnorm层(删除batchnorm层会导致约12%的测试精度),这可能无法很好地初始化参数gamma和beta。我在申请batchnorm时需要考虑什么特别的东西吗?我真的不明白还有什么会出错。我有以下型号: 模型=顺序() 默认值Conv2D和默认值密度定义如下:Tensorflow Keras BatchNorm:训练精度提高,而测试精度降低,tensorflow,deep-learning,keras,keras-layer,batch-normalization,Tensorflow,Deep Learning,Keras,Keras Layer,Batch Normalization,我试图在Keras中使用BatchNorm。随着时间的推移,训练的准确性会提高。从12%到20%,缓慢但肯定。 但是,测试精度从12%降至0%。随机基线为12% 我假设这是由于batchnorm层(删除batchnorm层会导致约12%的测试精度),这可能无法很好地初始化参数gamma和beta。我在申请batchnorm时需要考虑什么特别的东西吗?我真的不明白还有什么会出错。我有以下型号: 模型=顺序() 默认值Conv2D和默认值密度定义如下: def default_Conv2D():
def default_Conv2D():
return Conv2D(
filters=64,
kernel_size=3,
strides=1,
padding='same',
# activation=None,
# use_bias=True,
# kernel_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None), #RandomUniform(),
kernel_regularizer=regularizers.l2(0.0001),
# bias_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None), # RandomUniform(),
# bias_regularizer=None
)
def default_Dense(units):
return Dense(
units=units,
# activation=None,
# use_bias=True,
# kernel_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None),#RandomUniform(),
# bias_initializer=RandomNormal(mean=0.0, stddev=0.01, seed=None),#RandomUniform(),
kernel_regularizer=regularizers.l2(0.0001),
# bias_regularizer=None
)
问题是过度装配 您的前两个观察结果支持了这一点:
- 在最后一个完全连接的层之前添加一个正则化器,如Dropout
- 在矩阵权重上添加L1或L2正则化器
- 在CONV之间添加一个正则化器,如Dropout
- 您的网络可能有太多的可用参数。尝试将层减少到仅1个CONV,每次再添加一个层,每次重新培训和测试
- 将损失函数更改为小批量中所有项目的所有预测的平均损失。这使得你的损失函数独立于你的批量大小,你会发现,如果你改变了批量大小,你的损失函数也随之改变,那么你就必须改变你在SGD中的学习率
- 您的损失是所有预测类和所有样本损失的平均值,因此使用1.0的学习率。不需要再扩展它了
- 使用tf.train.MomentumOptimizer,学习率=1.0,动量=0.5。MomentumOptimizer已被证明比GradientDescent更加健壮
pip install git+git://github.com/fchollet/keras.git --upgrade --no-deps
成功了
@wontonimo,非常感谢你的回答 谢谢你的回答!然而,问题是,如果我将它部署在tensorflow上,完全相同的代码也可以工作。我是否正确使用了BatchNorm?或者它有任何已知的bug吗?当你说如果我把它部署在tensorflow上,它会工作的时候,你以前在哪里部署过它?对不起,我应该更清楚。。我以前的实现是纯tensorflow。现在我使用tensorflow后端将其部署到Keras上。tensorflow模型具有完全相同的体系结构。我以前也遇到过同样的问题,结果证明tensorflow中的变量需要以一种特殊的方式初始化(如图所示)。所以我怀疑我也必须在Keras中初始化一些东西,但事实似乎并非如此……顺便说一句,答案非常好!!:)中间层包括辍学和正则化:在现有的架构下,我使用纯tensorflow(无Keras前端)获得了85%的测试精度,很高兴您找到了它!
pip install git+git://github.com/fchollet/keras.git --upgrade --no-deps