【问题标题】:Is it possible to mask NaN values in keras LSTM's Label-set?是否可以在 keras LSTM 的标签集中屏蔽 NaN 值?
【发布时间】:2020-10-08 03:54:42
【问题描述】:

我有一个 LSTM 数据集。一些标签最后包含 NaN,不能向后填充(因为它们后面没有值)并且向前填充它们没有意义(因为标签时间戳将在“较近的将来”时间戳中被弃用(=缺失值locatoin) 与其实际时间索引相比)

那么:有没有办法屏蔽 LABEL-set(/Output-set) 中的 NaN 值? (因为 sample_weights 看起来只适用于输入数据)。

【问题讨论】:

  • 在数据准备期间为什么不跳过那些具有NaN 值的样本。您将需要类似于this 的内容。另一种解决方案是编写自定义训练循环,并通过使用掩码,您可以跳过标签为 NaN 的样本的损失计算。类似的例子是 shwn here
  • A) 我阅读了 github 文档,但不明白 interval 做了什么,你能解释一下 @AtherCheema
  • B) 不能跳过整个样本。我更多地想到了一些东西,比如只为标签提供一个掩码 2d 数组。有可能吗
  • 不能跳过是什么意思?如果某些样本/示例的标签不可用,则无法计算这些样本的损失。您必须在数据准备期间跳过这些样本,或者在损失计算期间必须跳过这些样本。对于第二种情况,您将编写自定义训练循环,在损失计算期间跳过这些样本。如果您喜欢使用dl_ts_prediction,我可以为您提供这两种情况的工作示例,前提是这是您想要的?
  • 所以如果我有一个像 [0.123, 0.437, 0.891, NaN, 1,497, 1.1] 这样的标签样本是不可能的。只训练有效数字?

标签: python tensorflow machine-learning keras lstm


【解决方案1】:

您可以通过 Keras Masking 层完成数据屏蔽:https://keras.io/api/layers/core_layers/masking/

跟随掩蔽层并支持掩蔽(LSTM 层支持)的层将跳过 所有 特征等于该步骤的掩蔽值的样本/步骤。 p>

但是,由于掩码层检查掩码值和数据之间的相等性,因此您不能使用 NaN 作为掩码值,因为 NaN 不等于自身,(np.nan == np.nan 为假)。

相反,您可以通过首先将您的 NaN 值转换为 0(默认掩码值)或另一个值(如果在生成掩码层时明确指定为掩码值)来使用掩码层:

from tensorflow.keras import layers
import numpy as np

# your example timesteps
ex_data = np.array([0.123, 0.437, 0.891, np.nan, 1.497, 1.1])

# reshape your example timesteps into a 3D matrix (1 sample x 6 timesteps x 1 feature per timestep)
data =  np.reshape(ex_data, (1, 6, 1))

# set NaN values to 0, which is the default masking value
data[np.isnan(data)] = 0
masked_data = layers.Masking()(data)

print(masked_data._keras_mask)

返回:

tf.Tensor([[ True  True  True False  True  True]], shape=(1, 6), dtype=bool)

【讨论】:

  • “NaN 不等于自身”——这让我省了很多痛苦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多