问题描述
我的模型是用Keras编写的。它具有多个输入,在将logit馈入softmax之前,其中之一要与倒数第二个Dense层的输出相乘。通过Lambda层执行此元素明智的乘法。
def mul(x,mask):
output = x*mask
return output
logits = Lambda(lambda x: mul(x,input_2))(dense_output) # gives nan after first update
首次更新模型后,Lambda层开始提供NaN作为输出。
如果我在计算图中定义的常数向量与密集层的输出相乘,则不会发生这种情况。
logits = dense_output * [1,1,-100,1] # does not give nan
我也尝试过使用Keras提供的乘法层。但这也会在第一次更新后抛出NaN。这是相同的代码段:
logits = Multiply()([dense_output,input_2]) # gives nan after first update
我基本上想通过与输入的乘法来掩盖某些输出状态,但是如果该层继续提供NaN作为输出,则无法做到这一点。
有什么办法解决这个问题?任何帮助都将不胜感激!
解决方法
我不确定这是如何工作的,但是我找到了解决方案。似乎在Multiply层的前面添加了Dense层可以解决此问题。密集层是否可训练都无关紧要。这是代码:
__COMPAT_LAYER
模型更新现在可以按预期运行,而不会引发任何NaN ValueErrors。