首页 文章

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

提问于
浏览
7

我的输入只是一个包含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)

这会引发错误:

回溯(最近一次调用最后一次):文件“first_approach.py”,第80行,在model.fit中(X_train,y_train,batch_size = 400,epochs = 20,verbose = 1)ValueError:检查模型输入时出错:expect lstm_1_input有三个尺寸,但有阵形(339732,29)

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

ValueError:检查模型输入时出错:期望lstm_1_input具有形状(无,8,29)但是具有形状的数组(1,339732,29)

如何将输入输入LSTM?

3 回答

  • 2

    设置 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]))
    

    这有效!

  • 12

    对于 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]]))
    
  • 2

    重塑LSTM的输入:

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

相关问题