Делайте прогнозы, подавая один шаг за раз, используя архитектуру LSTM в Керасе - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть многомерный набор данных с многофункциональной последовательностью и переменными временными шагами. Это данные многомерного временного ряда с несколькими примерами для обучения LSTM, и Y равен 0 или 1. В настоящее время я использую слой последовательности пэдов в сочетании с маскирующим слоем, чтобы каждый образец имел одинаковое количество временных шагов.

Для того, чтобы делать прогнозы, мне нужно заполнить тестовые данные, чтобы они соответствовали данным поезда, и мне нужно передать последовательность с 3 временными шагами. Есть ли способ делать прогнозы, кормя только один временной шаг после тренировки последовательностей? Например, могу ли я просто указать шаг 3 с дополнением 1 и 2 вместо полной последовательности, состоящей из 1, 2 и 3, для прогнозов.

# The input sequences are
trainX = np.array([
        [
            # Input features at timestep 1 with padding
            [0, 0, 0],                
            # Input features at timestep 2 with padding
            [6, 2, 1],
            # Input features at timestep 3
            [5, 2, 3]
        ],
        # Datapoint 2
        [
            # Features at timestep 1 with padding
            [0, 0, 0],
            # Features at timestep 2
            [9, 8, 9],
            # Features at timestep 3
            [7, 6, 1]
        ]
    ])

# The desired model outputs are as follows:
trainY = np.array([
        # Datapoint 1
        [
            # Target class at timestep 1
            [0],
            # Target class at timestep 2
            [1] 
        ],
        # Datapoint 2
        [
            # Target class at timestep 1
            [0],
            # Target class at timestep 2
            [0]
            # Target class at time step 3
            [0]
        ]
    ])

timesteps = 3
# Create neural network architecture
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, trainX.shape[2]), name='Mask'))
model.add(LSTM(98, kernel_initializer ='uniform', return_sequences=True, batch_input_shape=(None, timesteps, trainX.shape[2]), 
               kernel_constraint=maxnorm(3), name='LSTM'))
model.add(Dropout(0.2))
model.add(LSTM(98, return_sequences=False, kernel_constraint=maxnorm(3), name='LSTM-2'))
model.add(Dropout(0.2))
model.add(Dense(timesteps, activation='sigmoid', name='Dense'))
# set optimization parameters'
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#compile model
model.compile(loss="mse", optimizer="sgd", metrics=["mse"])
fitness = model.fit(trainX, trainY, epochs=200, batch_size=20, validation_data=(tstX, tstY), verbose=1)
predY = model.predict(tstX)

Я хочу иметь возможность прогнозировать, просто вводя один временной шаг следующим образом:

testX = np.array([
        [
            # Input features at timestep 1 with padding
            [0, 0, 0],                
            # Input features at timestep 2 with padding
            [0, 0, 0],
            # Input features at timestep 3
            [5, 2, 3]
        ]]

Каждый раз, когда я кормлю testX разными значениями на последнем шаге времени, вероятность оказывается одинаковой. Кажется, что вероятность зависит от количества временных шагов с немаскированными реальными данными, а не от самих данных. Если я продублирую последние шаги времени следующим образом, вероятность изменится, даже если данные одинаковы. Нужно ли маскировать данные испытаний? Почему мне нужно передать последовательность вместо одного временного шага, чтобы получить правильные прогнозы?

testX = np.array([
        [
            # Input features at timestep 1 with padding
            [5, 2, 3],                
            # Input features at timestep 2 with padding
            [5, 2, 3],
            # Input features at timestep 3
            [5, 2, 3]
        ]]

Я тренировался на этом, но хочу предсказания, кормя только последний шаг

trainX = np.array([
        [
            # Input features at timestep 1 with padding
            [0, 0, 0],                
            # Input features at timestep 2 with padding
            [6, 2, 1],
            # Input features at timestep 3
            [5, 2, 3]
        ]]
...