2017-06-15 45 views
0

以下是Keras中时间序列域“household power consumption”中LSTM的一个着名示例。它根据之前的49时间步骤预测值the fifth。我的问题是如何改变这种代码,以便它能够预测接下来的三个步骤,而不仅仅是一步。换句话说,我想给出49个时间步骤,并获得三个时间步骤作为输出。在Keras的家庭功耗示例中输出为三步的序列

import matplotlib.pyplot as plt 
import numpy as np 
import time 
import csv 
from keras.layers.core import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
from keras.models import Sequential 
np.random.seed(1234) 


def data_power_consumption(path_to_dataset, 
          sequence_length=50, 
          ratio=1.0): 

    max_values = ratio * 2049280 

    with open(path_to_dataset) as f: 
     data = csv.reader(f, delimiter=";") 
     power = [] 
     nb_of_values = 0 
     for line in data: 
      try: 
       power.append(float(line[2])) 
       nb_of_values += 1 
      except ValueError: 
       pass 
      # 2049280.0 is the total number of valid values, i.e. ratio = 1.0 
      if nb_of_values >= max_values: 
       break 

    print "Data loaded from csv. Formatting..." 

    result = [] 
    for index in range(len(power) - sequence_length): 
     result.append(power[index: index + sequence_length]) 
    result = np.array(result) # shape (2049230, 50) 

    result_mean = result.mean() 
    result -= result_mean 
    print "Shift : ", result_mean 
    print "Data : ", result.shape 

    row = int(round(0.9 * result.shape[0])) 
    train = result[:row, :] 
    np.random.shuffle(train) 
    X_train = train[:, :-1] 
    y_train = train[:, -1] 
    X_test = result[row:, :-1] 
    y_test = result[row:, -1] 

    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) 
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1)) 

    return [X_train, y_train, X_test, y_test] 


def build_model(): 
    model = Sequential() 
    layers = [1, 50, 100, 1] 

    model.add(LSTM(
     layers[1], 
     input_shape=(None, layers[0]), 
     return_sequences=True)) 
    model.add(Dropout(0.2)) 

    model.add(LSTM(
     layers[2], 
     return_sequences=False)) 
    model.add(Dropout(0.2)) 

    model.add(Dense(
     layers[3])) 
    model.add(Activation("linear")) 

    start = time.time() 
    model.compile(loss="mse", optimizer="rmsprop") 
    print "Compilation Time : ", time.time() - start 
    return model 


def run_network(model=None, data=None): 
    global_start_time = time.time() 
    epochs = 1 
    ratio = 0.5 
    sequence_length = 50 
    path_to_dataset = 'household_power_consumption.txt' 

    if data is None: 
     print 'Loading data... ' 
     X_train, y_train, X_test, y_test = data_power_consumption(
      path_to_dataset, sequence_length, ratio) 
    else: 
     X_train, y_train, X_test, y_test = data 

    print '\nData Loaded. Compiling...\n' 

    if model is None: 
     model = build_model() 

    try: 
     model.fit(
      X_train, y_train, 
      batch_size=512, nb_epoch=epochs, validation_split=0.05) 
     predicted = model.predict(X_test) 
     predicted = np.reshape(predicted, (predicted.size,)) 
    except KeyboardInterrupt: 
     print 'Training duration (s) : ', time.time() - global_start_time 
     return model, y_test, 0 

    try: 
     fig = plt.figure() 
     ax = fig.add_subplot(111) 
     ax.plot(y_test[:100]) 
     plt.plot(predicted[:100]) 
     plt.show() 
    except Exception as e: 
     print str(e) 
    print 'Training duration (s) : ', time.time() - global_start_time 

    return model, y_test, predicted 


if __name__ == '__main__': 
    run_network() 

回答

0

我相信这将解决您的问题:

def predict_sequences_multiple(model, data, window_size, prediction_len): 
    #Predict sequence of 50 steps before shifting prediction run forward by 50 steps 
    prediction_seqs = [] 
    for i in range(int(len(data)/prediction_len)): 
     curr_frame = data[i*prediction_len] 
     predicted = [] 
     for j in range(prediction_len): 
      predicted.append(model.predict(curr_frame[newaxis,:,:])[0,0]) 
      curr_frame = curr_frame[1:] 
      curr_frame = np.insert(curr_frame, [window_size-1], predicted[-1], axis=0) 
     prediction_seqs.append(predicted) 
    return prediction_seqs 
+0

凡应放在功能的代码? –