Sequence to Sequence - for time series prediction

前端 未结 2 658
孤街浪徒
孤街浪徒 2020-12-17 02:12

I\'ve tried to build a sequence to sequence model to predict a sensor signal over time based on its first few inputs (see figure below)

The model works OK, but I wa

2条回答
  •  心在旅途
    2020-12-17 02:39

    THIS IS THE ANSWER TO THE EDITED QUESTION

    first of all, when you call fit, decoder_inputs is a tensor and you can't use it to fit your model. the author of the code you cited, use an array of zeros and so you have to do the same (I do it in the dummy example below)

    secondly, look at your output layer in the model summary... it is 3D so you have to manage your target as 3D array

    thirdly, the decoder input must be 1 feature dimension and not 20 as you reported

    set initial parameters

    layers = [35, 35]
    learning_rate = 0.01
    decay = 0 
    optimiser = keras.optimizers.Adam(lr=learning_rate, decay=decay)
    
    num_input_features = 20
    num_output_features = 1
    loss = "mse"
    
    lambda_regulariser = 0.000001
    regulariser = None
    
    batch_size = 128
    steps_per_epoch = 200
    epochs = 100
    

    define encoder

    encoder_inputs = keras.layers.Input(shape=(None, num_input_features), name='encoder_input')
    
    encoder_cells = []
    for hidden_neurons in layers:
        encoder_cells.append(keras.layers.GRUCell(hidden_neurons,
                                                  kernel_regularizer=regulariser,
                                                  recurrent_regularizer=regulariser,
                                                  bias_regularizer=regulariser))
    
    encoder = keras.layers.RNN(encoder_cells, return_state=True, name='encoder_layer')
    encoder_outputs_and_states = encoder(encoder_inputs)
    encoder_states = encoder_outputs_and_states[1:] # only keep the states
    

    define decoder (1 feature dimension input!)

    decoder_inputs = keras.layers.Input(shape=(None, 1), name='decoder_input') #### <=== must be 1
    
    decoder_cells = []
    for hidden_neurons in layers:
        decoder_cells.append(keras.layers.GRUCell(hidden_neurons,
                                                  kernel_regularizer=regulariser,
                                                  recurrent_regularizer=regulariser,
                                                  bias_regularizer=regulariser))
    
    decoder = keras.layers.RNN(decoder_cells, return_sequences=True, return_state=True, name='decoder_layer')
    decoder_outputs_and_states = decoder(decoder_inputs, initial_state=encoder_states)
    
    decoder_outputs = decoder_outputs_and_states[0] # only keep the output sequence
    decoder_dense = keras.layers.Dense(num_output_features,
                                       activation='linear',
                                       kernel_regularizer=regulariser,
                                       bias_regularizer=regulariser)
    
    decoder_outputs = decoder_dense(decoder_outputs)
    

    define model

    model = keras.models.Model(inputs=[encoder_inputs, decoder_inputs], outputs=decoder_outputs)
    model.compile(optimizer=optimiser, loss=loss)
    model.summary()
    
    Layer (type)                    Output Shape         Param #     Connected to                     
    ==================================================================================================
    encoder_input (InputLayer)      (None, None, 20)     0                                            
    __________________________________________________________________________________________________
    decoder_input (InputLayer)      (None, None, 1)      0                                            
    __________________________________________________________________________________________________
    encoder_layer (RNN)             [(None, 35), (None,  13335       encoder_input[0][0]              
    __________________________________________________________________________________________________
    decoder_layer (RNN)             [(None, None, 35), ( 11340       decoder_input[0][0]              
                                                                     encoder_layer[0][1]              
                                                                     encoder_layer[0][2]              
    __________________________________________________________________________________________________
    dense_4 (Dense)                 (None, None, 1)      36          decoder_layer[0][0]              
    ==================================================================================================
    

    this is my dummy data. the same as yours in shapes. pay attention to decoder_zero_inputs it has the same dimension of your y but is an array of zeros

    train_x = np.random.uniform(0,1, (439, 5, 20))
    train_y = np.random.uniform(0,1, (439, 56, 1))
    validation_x = np.random.uniform(0,1, (10, 5, 20))
    validation_y = np.random.uniform(0,1, (10, 56, 1))
    decoder_zero_inputs = np.zeros((439, 56, 1)) ### <=== attention
    

    fitting

    history = model.fit([train_x, decoder_zero_inputs],train_y, epochs=epochs,
                         validation_split=0.3, verbose=1)
    
    Epoch 1/100
    307/307 [==============================] - 2s 8ms/step - loss: 0.1038 - val_loss: 0.0845
    Epoch 2/100
    307/307 [==============================] - 1s 2ms/step - loss: 0.0851 - val_loss: 0.0832
    Epoch 3/100
    307/307 [==============================] - 1s 2ms/step - loss: 0.0842 - val_loss: 0.0828
    

    prediction on validation

    pred_validation = model.predict([validation_x, np.zeros((10,56,1))])
    

提交回复
热议问题