Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow Keras BatchNorm:训练精度提高,而测试精度降低_Tensorflow_Deep Learning_Keras_Keras Layer_Batch Normalization - Fatal编程技术网

Tensorflow Keras BatchNorm:训练精度提高,而测试精度降低

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():

我试图在Keras中使用BatchNorm。随着时间的推移,训练的准确性会提高。从12%到20%,缓慢但肯定。 但是,测试精度从12%降至0%。随机基线为12%

我假设这是由于batchnorm层(删除batchnorm层会导致约12%的测试精度),这可能无法很好地初始化参数gamma和beta。我在申请batchnorm时需要考虑什么特别的东西吗?我真的不明白还有什么会出错。我有以下型号:

模型=顺序()

默认值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
    )

问题是过度装配

您的前两个观察结果支持了这一点:

  • 随着时间的推移,训练的准确性会提高。从12%到20%,。。但是,测试精度从12%降至0%
  • 移除batchnorm层可获得约12%的测试精度
  • 第一句话告诉我你的人际网络正在记忆训练集。第二种说法告诉我,当你阻止网络记忆训练集(甚至是学习)时,它就不再犯与记忆有关的错误

    有一些解决过度装修的方法,但这是一个比这篇文章更大的问题。请将以下列表视为“顶部”列表,而不是详尽无遗:

    • 在最后一个完全连接的层之前添加一个正则化器,如Dropout
    • 在矩阵权重上添加L1或L2正则化器
    • 在CONV之间添加一个正则化器,如Dropout
    • 您的网络可能有太多的可用参数。尝试将层减少到仅1个CONV,每次再添加一个层,每次重新培训和测试
    精度缓慢提高

    作为旁注,您通过缓慢但肯定地说,暗示您的准确性没有像您喜欢的那样快速提高。当我完成了以下所有步骤后,我取得了巨大的成功

    • 将损失函数更改为小批量中所有项目的所有预测的平均损失。这使得你的损失函数独立于你的批量大小,你会发现,如果你改变了批量大小,你的损失函数也随之改变,那么你就必须改变你在SGD中的学习率
    • 您的损失是所有预测类和所有样本损失的平均值,因此使用1.0的学习率。不需要再扩展它了
    • 使用tf.train.MomentumOptimizer,学习率=1.0,动量=0.5。MomentumOptimizer已被证明比GradientDescent更加健壮

    似乎Keras本身有什么问题

    天真的

    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