【问题标题】:Tensorflow 2 LSTM: InvalidArgumentError: Shapes of all inputs must matchTensorflow 2 LSTM:InvalidArgumentError:所有输入的形状必须匹配
【发布时间】:2020-05-02 01:56:18
【问题描述】:

我得到一个错误。我想这可能是因为时间步长。

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

tensorflow.python.framework.errors_impl.InvalidArgumentError:所有输入的形状必须匹配:values[0].shape = [1,192,2,3] != values[1].shape = [1,192,3] [Op :Pack] 名称:壮举

【问题讨论】:

  • 究竟在哪一行?
  • 当我尝试传递模型中的张量时的最后一个
  • 所以我发现错误来自ReLU
  • 什么是ma_3_day?如果您提供虚拟数据(使用 numpy)会更好,这样很容易重现。
  • 它是可重现的,前几行从 yahoo Finance 获取数据。 ma_3_day 也不重要,它只是一个打印语句

标签: python tensorflow keras


【解决方案1】:

首先,我可以看到您的 x_train.shape 是 (195, 1, 3) 并且 `y_train.shape 是 (195, 3)。

所以,您的输出是 2-d,但您在 BiLSTM 层中设置 return_sequences=True,这将产生 3-d 输出。

参考: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_trainy_train(标签)。该模型并非旨在同时采用x_trainy_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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多