Python 用于元素相乘的Lambda层在第一次模型更新后给出了nan。(凯拉斯)
我的模型是用Keras编写的。它有多个输入,其中一个输入与倒数第二个密集层的输出相乘,然后再将logit输入softmax。通过Lambda层执行该元素乘法Python 用于元素相乘的Lambda层在第一次模型更新后给出了nan。(凯拉斯),python,keras,model,masking,Python,Keras,Model,Masking,我的模型是用Keras编写的。它有多个输入,其中一个输入与倒数第二个密集层的输出相乘,然后再将logit输入softmax。通过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作为输
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, 1, 1, 1, -100, 1, -100, 1, 1] # does not give nan
我也尝试过使用Keras提供的乘法层。但在第一次更新之后,这也会引发NaN。下面是一个相同的代码片段:
logits = Multiply()([dense_output, input_2]) # gives nan after first update
我基本上想通过这个与输入相乘的方法来屏蔽某些输出状态,但是如果层继续给出NaN作为输出,我就做不到有什么办法解决这个问题吗?任何和所有的帮助将不胜感激 我不确定这是怎么回事,但我已经找到了解决办法。似乎在多层之前增加一个致密层就解决了这个问题。致密层是否可训练并不重要。代码如下:
logits = Multiply()([dense_output, input_2])
initializer = tf.keras.initializers.Identity()
masked_actions = Dense(num_actions, use_bias=False,
trainable=False)(logits) #returns the same logits
模型更新现在按预期工作,没有抛出任何错误。我不确定这是如何工作的,但我已经找到了解决方案。似乎在多层之前增加一个致密层就解决了这个问题。致密层是否可训练并不重要。代码如下:
logits = Multiply()([dense_output, input_2])
initializer = tf.keras.initializers.Identity()
masked_actions = Dense(num_actions, use_bias=False,
trainable=False)(logits) #returns the same logits
模型更新现在可以按预期工作,而不会引发任何错误