您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

因为认值maskNonecompute_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 * nanis nan,所以平均值为nan)来完成掩码。

其他 2022/1/1 18:31:45 有425人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶