Keras LSTM带屏蔽层的可变长度输入

Keras LSTM带屏蔽层的可变长度输入,第1张

Keras LSTM带屏蔽层的可变长度输入

Lambda
默认情况下,该层不传播掩码。换句话说,由该
Masking
层计算的掩码张量被该层丢弃
Lambda
,因此该
Masking
层对输出损耗没有影响。

如果要使图层的

compute_mask
方法
Lambda
传播先前的蒙版,
mask
则在创建图层时必须提供参数。从
Lambda
层的源代码可以看出,

def __init__(self, function, output_shape=None,  mask=None, arguments=None, **kwargs):    # ...    if mask is not None:        self.supports_masking = True    self.mask = mask# ...def compute_mask(self, inputs, mask=None):    if callable(self.mask):        return self.mask(inputs, mask)    return self.mask

因为默认值

mask
None
compute_mask
收益
None
和损失是不是在所有的屏蔽。

要解决此问题,由于您的

Lambda
图层本身未引入任何其他遮罩,因此该
compute_mask
方法应仅返回上一层的遮罩(并进行适当的切片以匹配该图层的输出形状)。

masking_func = lambda inputs, previous_mask: previous_mask[:, N:]model = Sequential()model.add(Masking(mask_value=0., input_shape=(timesteps, features)))model.add(LSTM(128, return_sequences=True))model.add(LSTM(64, return_sequences=True))model.add(LSTM(1, return_sequences=True))model.add(Lambda(lambda x: x[:, N:, :], mask=masking_func))

现在您应该能够看到正确的损失值。

>> model.evaluate(x_test, y_test, verbose=0)0.2660679519176483>> out = model.predict(x_test)>> print('wo mask', mean_absolute_error(y_test.ravel(), out.ravel()))wo mask 0.26519736809498456>> print('w mask', mean_absolute_error(y_test[~(x_test[:,N:] == 0).all(axis=2)].ravel(), out[~(x_test[:,N:] == 0).all(axis=2)].ravel()))w mask 0.2660679670482195

使用NaN值进行填充不起作用,因为通过将损耗张量乘以二进制掩码(

0 * nan
is
nan
,所以平均值为
nan
)来完成掩码。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5642782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存