我试图在抽出最终输出之前创建一个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
实际上是一个有效的张量流量张量。
答案 0 :(得分:0)
我担心我不太明白将inputs
转换为0和1的向量的目的,但这种操作显然不可区分。这就是为什么没有返回渐变的原因(即渐变是None
)。
也许你可以试试"更柔软的"此功能的版本。例如,sigmoid(a - b)
可以是1 if a > b else 0
的更软版本。
outputs = Lambda(lambda x: K.sigmoid(x[0] - x[1]))([pred1, pred2])