Python Keras自定义Lambda层张量操作错误
我试图创建一个lambda层,在输出最终输出之前,它将执行一些确定性掩蔽(我不是说Keras掩蔽层)。这就是我到目前为止所做的:Python Keras自定义Lambda层张量操作错误,python,lambda,tensorflow,deep-learning,keras,Python,Lambda,Tensorflow,Deep Learning,Keras,我试图创建一个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)
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)
我的优化器出现了一个非常奇怪的错误。似乎我的渐变是无
但是,如果我用任何示例Lambda
层实现替换binary\u mask
中的当前代码,它工作正常,例如返回x
。我做错了什么
我很确定我的
掩码
实际上是一个有效的张量流张量。恐怕我不太明白将输入
转换为0和1的向量的目的,但这个操作显然是不可微的。这就是为什么不返回渐变(即渐变为None
)
也许你可以试试这个功能的“软”版本。例如,sigmoid(a-b)
可以是1的软版本,如果a>b否则为0
outputs = Lambda(lambda x: K.sigmoid(x[0] - x[1]))([pred1, pred2])
我有点明白你在说什么。但我的目标输出是0和1的向量。为什么这仍然是一个问题?为了使反向传播有效,每一层的输出应该是可微的w.r.t.它的输入。一般来说,如果你有一个“想法”,需要在某些层上进行不可微的运算,你可以尝试用一个“软版本”来代替它进行梯度计算。