在keras中使用'learning_phase'作为tensorflow 后端?

puruo6ea  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在尝试使用keras后端在tensorflow中训练一个resnet网络。每次批量更新的提要字典写为:

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

我使用keras后端(keras.backend.set_session(sess)),因为原始的resnet网络是用keras定义的。由于模型包含dropout和batch_norm层,它需要一个学习阶段来区分训练和测试。
我观察到,无论何时设置keras.backend.learning_phase():1,模型训练/测试准确度几乎不会增加到10%以上。相反,如果不设置学习阶段,即提要字典被定义为:

feed_dict= {x:X_train[indices[start:end]], y:Y_train[indices[start:end]]}

然后,如预期的那样,模型精度以标准的方式随着历元而保持增加。
如果有人澄清是否没有必要使用学习阶段,或者其他什么地方不对,我将不胜感激。Keras 2.0文档似乎建议使用带有dropout和batch_norm层的学习阶段。

w1jd8yoj

w1jd8yoj1#

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

K.set_learning_phase(1)

然后,您需要为所有批处理归一化图层设置training=false

if layer.name.startswith('bn'):
    layer.call(layer.input, training=False)

相关问题