tensorflow后端在keras中使用``learning_phase''?

Vir*_*nge 7 python neural-network deep-learning keras tensorflow

我正在尝试在张量流中使用keras后端训练一个Resnet网络。每个批次更新的供稿字典写为:

    feed_dict= {x:X_train[indices[start:end]], y:Y_train[indices[start:end]], keras.backend.learning_phase():1}
Run Code Online (Sandbox Code Playgroud)

我使用的是keras后端(keras.backend.set_session(sess)),因为原始的resnet网络是用keras定义的。由于模型包含辍学层和batch_norm层,因此需要一个学习阶段来区分训练和测试。

我观察到,无论何时设置keras.backend.learning_phase():1,模型训练/测试的准确性几乎都不会提高到10%以上。相反,如果未设置学习阶段,则将提要字典定义为:

feed_dict= {x:X_train[indices[start:end]], y:Y_train[indices[start:end]]}
Run Code Online (Sandbox Code Playgroud)

然后,正如预期的那样,模型精度以标准的方式不断提高。

如果有人澄清了学习阶段的使用是不必要的还是其他错误,我将不胜感激。Keras 2.0文档似乎建议将学习阶段与dropout和batch_norm层一起使用。

Ham*_*d K 0

将学习阶段设置为1(训练)

K.set_learning_phase(1)
Run Code Online (Sandbox Code Playgroud)

然后你需要为所有批量归一化层设置training=false

if layer.name.startswith('bn'):
    layer.call(layer.input, training=False)
Run Code Online (Sandbox Code Playgroud)