首页 > 解决方案 > 如何创建仅在评估阶段生效的 keras 层(并且在训练期间是透明的)?

问题描述

我想在我的模型中添加一个层,该层在评估期间接受输入,应用一些转换(在这种情况下是量化,但可以是任何值)并将其作为输出返回。然而,这一层在训练期间必须是完全透明的,这意味着它必须返回相同的输入张量。

我写了以下函数

from keras.layers import Lambda
import keras.backend as K

def myquantize(x):
    return K.in_test_phase( K.clip(K.round(x*(2**5))/(2**5),-3.9,3.9) , x)

然后我通过 Lambda 层使用它

y = keras.layers.Conv1D(**args1)
y = keras.layers.AveragePooling1D(pool_size=2)(y)
y = keras.layers.Lambda(myquantize)(y)
y = keras.layers.Conv1D(**args2)
#...

现在,原则上 K.in_test_phase 应该在训练期间返回 x,在测试期间返回那个表达式。但是,用这样的层训练网络会阻止网络学习(即训练损失在 3 个 epoch 后停止减少),而如果我删除它,网络会继续正常训练。我假设这一层在训练期间实际上并不像预期的那样透明。

标签: tensorflowkeraskeras-layer

解决方案


in_test_phase有一个参数training,您可以显式设置该参数以指示您是否正在训练。如果您没有显式设置它,则使用 的值learning_phase。当您重置图形或调用模型的不同类型的拟合/预测/评估函数时,此值会不断变化。

由于您的完整代码不存在,您可以使用training参数。在训练期间将其设置为 True。save_weights然后使用模型的功能保存模型的权重。当您希望测试您的模型时,请将training参数设置为 False。然后使用函数加载权重load_weights,然后您可以进行相应的操作。


推荐阅读