Keras Custom Lambda Layer Tensor Manipulation Error

我正在尝试创建一个lambda层,它将在抽出最终输出之前执行一些确定性屏蔽(我不是在谈论Keras屏蔽层) . 这是我到目前为止:

def binary_mask(x):
    # Mask is half the size of x. 
    # 1 if pred1 > pred2 element-wise, 0 otherwise.

    pred1, pred2 = tf.split(x, 2, 1)
    mask = tf.greater(pred1, pred2)
    mask = tf.to_float(mask)
    return mask

def mask_output_shape(input_shape):
    return (input_shape[0], units)

这就是我使用功能API创建图层的方法:

outputs = Lambda(binary_mask, output_shape=mask_output_shape)(inputs)

我的优化器出现了一个非常奇怪的错误 . 看来我的渐变是 None .

但是,如果我将 binary_mask 中的当前代码替换为任何示例 Lambda 层实现,它可以正常工作,例如 return x . 我在这做错了什么?

我很确定我的 mask 实际上是一个有效的张量流量张量 .

回答(1)

2 years ago

我很清楚将 inputs 转换为0和1的向量的目的,但这个操作显然不可区分 . 这就是没有返回渐变的原因(即渐变是 None ) .

也许你可以试试这个功能的"softer"版本 . 例如, sigmoid(a - b) 可以是 1 if a > b else 0 的较软版本 .

outputs = Lambda(lambda x: K.sigmoid(x[0] - x[1]))([pred1, pred2])