Tensorflow 2 LSTM: InvalidArgumentError: Формы всех входов должны совпадать - PullRequest
2 голосов
/ 02 мая 2020

Я получаю ошибку. Я думаю, что это может быть из-за временных шагов.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import pandas_datareader.data as web
import datetime as dt
import numpy as np
from tensorflow.keras import Model
import tensorflow as tf
from tensorflow.keras.layers import LSTM, Bidirectional, Dense
from tensorflow.keras.activations import relu

start = dt.datetime(2018,1,1)
end = dt.datetime(2019,1,1)

df = web.DataReader(name=['IBM', 'MSFT', 'NKE'],
                    data_source='yahoo',
                    start=start,
                    end=end).reset_index()['Close']

values = df.values

average_3_day = df.NKE.rolling(3).mean().values
previous_1_day = df.NKE.shift(-1).values

naive_3_day = tf.keras.metrics.mean_absolute_error(df['NKE'].values[2:], ma_3_day[2:]).numpy()
naive_1_day = tf.keras.metrics.mean_absolute_error(df['NKE'].values[:-1], previous_1_day[:-1]).numpy()
print('The benchmark score of 3 day moving average is {:.4f}.'.format(naive_3_day))
print('The benchmark score of the previous day is {:.4f}.'.format(naive_1_day))

for val, fut in zip(df['NKE'].values[:10], previous_1_day[:10]):
    print(f'Value: {val:>6.3f} Future: {fut:>6.3f}')

MEAN = np.mean(values[:200, :], axis=0)
STD = np.std(values[:200, :], axis=0)

data = (values - MEAN)/STD


def multivariate_data(dataset, target, start_index, end_index, history_size,
                      target_size, step, single_step=False):
  data, labels = [], []
  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size
  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])
    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])
  return np.array(data), np.array(labels)



PAST_HISTORY = 5
FUTURE_TARGET = 3
STEP = 5

x_train, y_train = multivariate_data(dataset=data,
                                     target=data[:, -1],
                                     start_index=0,
                                     end_index=200,
                                     history_size=PAST_HISTORY,
                                     target_size=FUTURE_TARGET,
                                     step=STEP)

x_test, y_test = multivariate_data(dataset=data,
                                   target=data[:, -1],
                                   start_index=200,
                                   end_index=None,
                                   history_size=PAST_HISTORY,
                                   target_size=FUTURE_TARGET,
                                   step=STEP)

train_data = tf.data.Dataset.from_tensors((x_train, y_train)).shuffle(len(x_train)).take(-1)
test_data = tf.data.Dataset.from_tensors((x_test, y_test)).shuffle(len(x_test)).take(-1)
print(next(iter(train_data))[0].shape)
print(next(iter(train_data))[1].shape)

class BiDirectionalLSTM(Model):
    def __init__(self):
        super(BiDirectionalLSTM, self).__init__()
        self.bidr = Bidirectional(LSTM(32, activation=None, return_sequences=True))
        self.dense = Dense(3)

    def call(self, inputs, training=None, mask=None):
        x = self.bidr(relu(inputs, alpha=2e-1))
        x = self.dense(x)
        return x


bidirec = BiDirectionalLSTM()

bidirec(next(iter(train_data)))

тензор потока. python .framework.errors_impl.InvalidArgumentError: Формы всех входных данных должны совпадать: values ​​[0] .shape = [ 1,192,2,3]! = Значения [1] .shape = [1,192,3] [Op: Pack] имя: feat

1 Ответ

3 голосов
/ 02 мая 2020

Прежде всего, как я вижу, ваши x_train.shape - это (195, 1, 3), а `y_train.shape - (195, 3).

Итак, ваш вывод - 2-й, но вы устанавливаете return_sequences=True в вашем слое BiLSTM, это даст 3-й вывод.

ref: https://keras.io/layers/recurrent/

Итак, просто исправьте это сначала .

class BiDirectionalLSTM(Model):
    def __init__(self):
        super(BiDirectionalLSTM, self).__init__()
        self.bidr = Bidirectional(LSTM(32, activation=None, return_sequences=False))
        self.dense = Dense(3)

    def call(self, inputs, training=None, mask=None):
        x = self.bidr(relu(inputs, alpha=2e-1))
        x = self.dense(x)
        return x

Во-вторых, я вижу, что вы передаете next(iter(train_data)), но объект Model этого не ожидает.

Вы можете написать bidirec(x_train), который будет работать нормально , но train_data имеет два элемента x_train и y_train (метки). Модель не рассчитана на значения x_train и y_train.

print(next(iter(train_data))[0].shape)
print(next(iter(train_data))[1].shape)

. Как вы можете видеть здесь, каждый из них имеет разные размеры. Но вы можете сделать это, и код будет работать нормально.

bidirec(next(iter(train_data))[0]) # only the training input data, not labels

Исходя из этого модель фактически дает вам прогноз.

Чтобы обучить вашу модель, вы можете просто сделать следующее,

bidirec.compile('adam', 'mse')
bidirec.fit(x_train, y_train)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...