【问题标题】:Error when checking model input: expected lstm_1_input to have 3 dimensions, but got array with shape (339732, 29)检查模型输入时出错:预期 lstm_1_input 具有 3 个维度,但得到的数组具有形状 (339732, 29)
【发布时间】:2017-11-26 00:43:46
【问题描述】:

我的输入只是一个包含 339732 行和两列的 csv 文件:

  • 第一个是 29 个特征值,即 X
  • 第二个是二进制标签值,即 Y

我正在尝试在堆叠 LSTM 模型上训练我的数据:

data_dim = 29
timesteps = 8
num_classes = 2

model = Sequential()
model.add(LSTM(30, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30, return_sequences=True))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30))  # return a single vector of dimension 30
model.add(Dense(1, activation='softmax'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

model.summary()
model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

这会引发错误:

Traceback(最近一次调用最后一次): 文件“first_approach.py​​”,第 80 行,在 model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

ValueError:检查模型输入时出错:预期 lstm_1_input 到 有 3 个维度,但得到了形状为 (339732, 29) 的数组

我尝试使用 X_train.reshape((1,339732, 29)) 重塑我的输入,但它没有显示错误:

ValueError:检查模型输入时出错:预期 lstm_1_input 到 有形状 (None, 8, 29) 但得到了形状 (1, 339732, 29) 的数组

如何将我的输入输入到 LSTM 中?

【问题讨论】:

  • 你为什么使用没有时间步长的 LSTM 模型?

标签: python keras lstm recurrent-neural-network valueerror


【解决方案1】:

设置timesteps = 1(因为,我希望每个实例都有一个时间步长)并将 X_train 和 X_test 重塑为:

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

成功了!

【讨论】:

    【解决方案2】:

    对于timesteps != 1,可以使用下面的函数(改编自here

    import numpy as np
    def create_dataset(dataset, look_back=1):
      dataX, dataY = [], []
      for i in range(len(dataset)-look_back+1):
        a = dataset[i:(i+look_back), :]
        dataX.append(a)
        dataY.append(dataset[i + look_back - 1, :])
      return np.array(dataX), np.array(dataY)
    

    示例

    X = np.reshape(range(30),(3,10)).transpose()
    array([[ 0, 10, 20],
           [ 1, 11, 21],
           [ 2, 12, 22],
           [ 3, 13, 23],
           [ 4, 14, 24],
           [ 5, 15, 25],
           [ 6, 16, 26],
           [ 7, 17, 27],
           [ 8, 18, 28],
           [ 9, 19, 29]])
    
    create_dataset(X, look_back=1 )
    (array([[[ 0, 10, 20]],
           [[ 1, 11, 21]],
           [[ 2, 12, 22]],
           [[ 3, 13, 23]],
           [[ 4, 14, 24]],
           [[ 5, 15, 25]],
           [[ 6, 16, 26]],
           [[ 7, 17, 27]],
           [[ 8, 18, 28]],
           [[ 9, 19, 29]]]),
    array([[ 0, 10, 20],
           [ 1, 11, 21],
           [ 2, 12, 22],
           [ 3, 13, 23],
           [ 4, 14, 24],
           [ 5, 15, 25],
           [ 6, 16, 26],
           [ 7, 17, 27],
           [ 8, 18, 28],
           [ 9, 19, 29]]))
    
    create_dataset(X, look_back=3)
    (array([[[ 0, 10, 20],
            [ 1, 11, 21],
            [ 2, 12, 22]],
           [[ 1, 11, 21],
            [ 2, 12, 22],
            [ 3, 13, 23]],
           [[ 2, 12, 22],
            [ 3, 13, 23],
            [ 4, 14, 24]],
           [[ 3, 13, 23],
            [ 4, 14, 24],
            [ 5, 15, 25]],
           [[ 4, 14, 24],
            [ 5, 15, 25],
            [ 6, 16, 26]],
           [[ 5, 15, 25],
            [ 6, 16, 26],
            [ 7, 17, 27]],
           [[ 6, 16, 26],
            [ 7, 17, 27],
            [ 8, 18, 28]],
           [[ 7, 17, 27],
            [ 8, 18, 28],
            [ 9, 19, 29]]]),
    array([[ 2, 12, 22],
           [ 3, 13, 23],
           [ 4, 14, 24],
           [ 5, 15, 25],
           [ 6, 16, 26],
           [ 7, 17, 27],
           [ 8, 18, 28],
           [ 9, 19, 29]]))
    

    【讨论】:

    • 当我将 create_dataset() 返回的对象传递给 model.fit() AttributeError: 'tuple' object has no attribute 'shape' 时出现此错误
    • create_dataset 返回一个 x, y 的元组。试试x_train, y_train = create_dataset(dataset) 然后model.fit(x_train, y_train)
    • 我有一个输入训练集,它是一个 100 行和 50 列的 np.array。其中一些列包含浮点值,一些包含使用keras.utils.to_categorical() 构建的“热编码”,它们基本上只是数组。我对如何使用x_trainy_train 感到困惑。我的训练标签在一个单独的数组中,输入模型只包含训练数据(首先输入到 model.fit())
    • 在这种情况下,只需忽略此函数中的y_train 并使用您在单独数组中已有的那个。此外,model.fit 会从这个函数和你自己的目标中获取x_train
    • 仍然无法正常工作,我在一个模仿我的问题的问题上打开了悬赏:stackoverflow.com/questions/51469446/… 基本上在顺序层中处理包含数组和数值的训练集
    【解决方案3】:

    重塑 LSTM 的输入:

    X = array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
    X_train = X.reshape(1, 3, 3) # X.reshape(samples, timesteps, features)
    

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 2020-06-09
      • 1970-01-01
      • 2019-12-22
      • 2019-04-07
      • 2020-04-05
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多