我正在构建一个具有多个输入的LSTM模型(数量由n_inputs
给出)。我缩放了(0, 1)
中的输入,并将所有输入的NaN
替换为-1
。现在我希望模型忽略这些NaN
值,因此我使用如下掩码:
model= Sequential()
model.add(Masking(mask_value=-1, input_shape=(window, n_inputs)))
model.add(LSTM(units=n_units), return_sequences=True)
model.add(Dropout(dropout_rate))
model.add(LSTM(units=n_units))
model.add(Dropout(dropout_rate))
model.add(Dense(units=1))
字符串
我担心如果任何输入具有NaN
值,Masking
会强制模型完全忽略一个时间步的数据(我不知道如何检查是否是这种情况)。我想要的是:对于每个timestemp,只忽略NaN
输入,但传递其他有效的输入。我的问题是:Masking
是否排除了至少有一个输入是NaN
的所有时间步?如果是,我如何让模型只忽略NaN
输入?
2条答案
按热度按时间aoyhnmkz1#
好吧,因为我不知道答案,也很好奇,我做了一些实验。我首先创建了一个由3个时间步和3个特征组成的序列:
字符串
我创建了一个简单的网络,在这里我打印了两个中间层:
型
我使用了Dense层,因为它支持掩码,可以更好地理解发生了什么,但过程与RNN相同。我还选择将掩码值设置为-inf,以查看掩码值是否被很好地掩蔽。Dense层的权重设置为1,我禁用了偏置,因此Dense层计算每个时间步的输入之和。
如果屏蔽时间步的所有输入:
型
这是我的:
型
所以面具被正确地考虑了。
如果我想屏蔽一个值:
型
我的输出是:
型
所以我认为没有进行伪装。
您应该创建自己的掩码。
我尝试了一个小例子,所以我希望这个例子可以为你的项目所利用。首先,我忘记了keras的Vanilla Masking层,使用我自己的掩码。这个想法是创建一个掩码,将掩码值设置为1,将真实的值设置为0。例如,如果你的值上级于0,你将Nan值替换为-1,然后创建
custom_mask
:型
分别为
inputs
和custom_mask
:型
然后,将掩码乘以
-1E9
,以便将无限个值放在你想要屏蔽输入的地方。然后将其添加到Tensor中。一个简单的ReLu
将掩码值设置为0:型
等于:
型
qmb5sa222#
我通过创建一个可分离的掩蔽层来解决这个问题,该掩蔽层独立地作用于每个通道。
字符串