使用Keras和掩码层的可变长度序列

3

我有一个使用Keras设计的序列到序列模型,用于预测数值数据,但我的输入序列长度不固定。这些序列存储在一个numpy数组中,其中不存在的值为NaN。

[[0, 1, 2, 3],
 [NaN, 1, 2, NaN]]

例如,如果存在NaN,则它们始终在两端,数字始终是数据中不间断的序列,因此例如以下序列不会出现:
[NaN, 0, NaN, 3].

我想在我的模型中使用一个屏蔽层,以便忽略这些NaN值,但是目前我的方法并没有起作用,因为得到的损失总是一个NaN输出。

encoder_inputs = Input(shape=(None, 1), name='encoder')
masker = Masking(mask_value=np.nan)
masker(encoder_inputs)
encoder = LSTM(units, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)

# Keep encoder states for decoder, discard outputs
encoder_states = [state_h, state_c]

# Set up the decoder taking the encoder_states to be the initial state vector of the decoder.
decoder_inputs = Input(shape=(None, 1), name='decoder')

# Full output sequences and internal states are returned.  Returned states are used in prediction / inference

decoder = LSTM(units, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder(decoder_inputs, initial_state=encoder_states)

# Gives continuous output at each time step
decoder_dense = Dense(1)
decoder_outputs = decoder_dense(decoder_outputs)

# create model that takes encoder_input_data and decoder_input_data and creates decoder_target_data
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

我猜我没有正确地将遮罩层添加到模型中,但我不确定如何添加它?

1个回答

1
问题在于我使用了np.nan作为掩码值。由于掩码是通过与二进制掩码相乘来执行的,这导致NaN始终存在。由于我的数据是实数,我无法确定其范围,因此将掩码值设置为sys.float_info.max。

那么,澄清一下 - np.nan 不应该作为 keras 中的掩码值使用? - Itamar Mushkin
这类似于GitHub上的这个问题(https://github.com/keras-team/keras/issues/2819),但那里的问题是np.inf而不是np.nan--这不应该触发您提出的推理,因为np.inf等于np.inf,而这不能用于np.nan。 - Itamar Mushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接