具有keras和遮罩层的可变长度序列

时间:2019-01-10 17:04:20

标签: python keras

我在喀拉拉邦设计了一个序列模型来预测数值数据,但是我输入的序列长度不一。序列存储在numpy数组中,其中不存在的值为NaNs

[[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)

我想我没有正确将Masking层添加到模型中,但是我不确定如何添加它?

1 个答案:

答案 0 :(得分:0)

问题是我使用np.nan作为掩码值。如在引擎盖下,通过与二进制掩码相乘执行掩码,该掩码导致NaN始终存在。由于我的数据是实数,因此我无法确定需要的范围,因此我将mask_value设置为sys.float_info.max。