【问题标题】:Input 0 of layer lstm_11 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 5000, 1, 6]层 lstm_11 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 5000, 1, 6]
【发布时间】:2021-01-14 23:14:10
【问题描述】:

我正在使用 Keras 开发比特币价格预测器。我从binance.com 获得数据。 5000小时的数据结构是这样的:

[ ['1597773600000''11983.22000000''12010.95000000''11948.40000000''11978.18000000''2344.24787500'] ['1597777200000''11978.19000000''12029.00000000''11964.63000000''11982.00000000''1993.81400900'] ['1597780800000''11981.99000000''12037.86000000''11978.07000000''12022.99000000''2092.06777400'] ... ['1586962800000''6717.66000000''6745.51000000''6690.00000000''6701.90000000''3279.59274200'] ['1586966400000''6701.90000000''6749.69000000''6690.00000000''6729.58000000''2511.60203300'] ['1586970000000''6729.59000000''6763.13000000''6724.51000000''6746.86000000''1660.33553000'] ]

形状= (5000, 6) 大小= 30000 ndim=2

在每个条目中,第一个元素是时间戳。我需要将其重塑为(样本、时间戳、功能)。我是这样做的:

btcData = np.reshape(btcData,(5000, 1, 6))

然后我对数据进行标准化并建立模型。模型在这里:

myModel = keras.Sequential(name='cryptoPredictor')
myModel.add(keras.Input(np.shape(train_data),))
myModel.summary()
myModel.add(LSTM(128, activation='tanh'))
myModel.summary()
myModel.add(LSTM(128, activation='tanh'))
myModel.summary()
myModel.add(Dense(1))
myModel.summary()
myModel.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
myModel.fit(train_data, test_data, batch_size=100, epochs=50, validation_split=15.0)

当我运行模型时,我收到此错误:

lstm_11 层的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=4。完整的形状 收到:[None, 5000, 1, 6]

我可以做些什么来解决这个错误?

【问题讨论】:

  • 标签在哪里?为什么每个元素有 6 个值?这些是以前的值吗?这是一个窗口数据集吗?

标签: python tensorflow keras neural-network lstm


【解决方案1】:

假设您有 5,000 行,其中包含 1 个时间步长和 6 个特征,您必须进行更改:

  1. 将输入形状设置为(1, 6)
  2. 为第二层设置return_sequences=True

然后就可以了:

from tensorflow import keras
from tensorflow.keras.layers import *
import numpy as np

X = np.random.rand(5000, 1, 6)
y = np.random.rand(5000)

myModel = keras.Sequential(name='cryptoPredictor')
myModel.add(keras.Input(shape=np.shape(X)[1:]))
myModel.summary()
myModel.add(LSTM(8, activation='tanh', return_sequences=True))
myModel.summary()
myModel.add(LSTM(8, activation='tanh'))
myModel.summary()
myModel.add(Dense(1))
myModel.summary()
myModel.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
history = myModel.fit(X, y, batch_size=8, epochs=1)

【讨论】:

    【解决方案2】:

    您可能希望将数据重塑为(5000,6) 的形状,因为 lstm 所需的第一个维度是 batch_size,然后是 timestep,然后是 sample。 特征和批量大小在这里可以看作是同义词:

    btcData = np.reshape(btcData,(5000,6))
    

    【讨论】:

    • 这是实施解决方案后的新错误:'lstm_13 层的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,128]'
    • 是的,因为您将 LSTM 放在 LSTM 后面。为此,您需要在第一个 LSTM 层设置return_sequences=True。我绝对建议你先从一个 LSTM 开始,看起来你一次尝试太多
    猜你喜欢
    • 2020-11-15
    • 2020-09-01
    • 2020-08-13
    • 2021-04-09
    • 2020-08-11
    • 2021-03-22
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多