首页 文章

Keras BatchNormalization填充参数在tensorflow训练时更新

提问于
浏览
1

我在Ubuntu 16.04中使用Keras 2.0.8和Tensorflow 1.3.0,使用Cuda 8.0和cuDNN 6 .

我在我的模型中使用两个BatchNormalization图层( keras layers )并使用 tensorflow pipeline 进行训练 .

我在这里遇到两个问题 -

  • BatchNorm图层 population parameters (均值和方差)即使在将 K.learning_phase 设置为 True 之后也进行了训练 not being updated . 结果,推断完全失败 . 我需要一些关于如何在手动训练步骤之间更新这些参数的建议 .

  • 其次,在 saving the trained model 之后使用tensorflow saver 操作,当我尝试 load 时, results cannot be reproduced . 看来 weights are changing . 有没有办法在保存 - 加载操作中保持相同的权重?

1 回答

  • 0

    几个星期前我遇到了同样的问题 . 在内部,keras层可以向模型添加额外的更新操作(例如batchnorm) . 因此,您需要显式运行这些额外的操作 . 对于batchnorm,这些更新似乎只是一些assign_ops,它将当前均值/方差与新值交换 . 如果你不创建keras模型,这可能会起作用;假设x是张量,你想要标准化

    bn = keras.layers.BatchNormalization()
    x = bn(x)
    
    ....
    sess.run([minimizer_op,bn.updates],K.learning_phase(): 1)
    

    在我的工作流程中,我正在创建一个keras模型(没有编译它),然后运行以下

    model = keras.Model(inputs=inputs, outputs=prediction)
    sess.run([minimizer_op,model.updates],K.learning_phase(): 1)
    

    输入可以是类似的东西

    inputs = [keras.layers.Input(tensor=input_variables)]
    

    和输出是张量流量张量的列表 . 该模型似乎自动聚合输入和输出之间的所有其他更新操作 .

相关问题