自定义 Lambda 层 Keras 输出预测。我得到“一个操作对渐变没有`无`”错误

数据挖掘 Python 喀拉斯 回归 损失函数
2022-03-08 04:20:12

我有一个 Lambda 层,它从前一层获取输入,进行一些预处理。Lambda 层的输出是预测,使用的是 keras.losses.mean_squared_error。

#model
inputs = Input(shape=(len_train_data_columns,))
dense1 = Dense(777, activation='relu')(inputs)
dropout1 = Dropout(0.4)(dense1)
softmax = Dense(3, activation='softmax')(dropout1)
predictions = Lambda(custom_layer,
            output_shape= custom_layer_output_shape,
            arguments= {'experiment_config': experiment_config},
               )(softmax)

model = Model(inputs = inputs, outputs = predictions)
model.compile(optimizer=adam(lr=0.0001), loss=keras.losses.mean_squared_error, metrics=keras.losses.mean_squared_error)

Lambda 的输出是 (num_rows, 1)。

我得到 ValueError: An operation has Nonefor gradient。请确保您的所有操作都定义了渐变(即可微分)。没有梯度的常见操作:K.argmax、K.round、K.eval。

这是为什么?我使用Keras损失...

2个回答

我认为它来自您的“custom_layer”。并非所有在 keras 后端定义的函数都是可微的(如错误所说,例如 K.argmax),如果您在图层上使用这些函数并且它们没有定义的梯度,则会出现此错误。您必须确保仅使用与渐变相关的函数。尽管没有这些函数的正式列表,但基本运算 (+/-*) 是例如可微分的equal_togreater不可微分的。

您可以关闭某些节点、层或函数的反向传播,但我不建议这样做。如果您知道它应该是什么,您还可以为整个自定义图层定义自定义渐变。例如,如果它是一个众所周知的函数的实现,您可以手动导出渐变,然后将其实现为自定义渐变。

如果没有,您应该努力尝试使用 TensorFlow 可微操作重新实现自定义层。