首页 > 解决方案 > 检查输入时出错:预期 lstm_input 有 3 个维度,但得到了形状为 (160, 1000) 的数组

问题描述

当我尝试将 RNN 模型与我的数据集一起使用时,我遇到了这个错误。这是我的模型和数据集的精简版本,但它产生完全相同的错误 - dropbox.com/sh/1a2guzsk4afp94r/AACkOQ1UibLZAhzGoyZJtVcqa?dl=0

训练数据由每 1000 个浮点数长的浮点数列表组成。例如,

 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.55 0.2  0.5  0.85 0.8  0.2
 0.2  1.   0.2  0.2  0.5  0.75 0.3  0.5  0.5  0.3  0.85 0.65 0.15 0.4
 0.3  0.6  0.05 0.15 0.85 0.5  0.45 0.45 0.05 0.25 0.5  0.45 0.05 0.1
 0.45 0.9  0.35 0.35 0.65 0.15 0.45 0.3  0.3  0.6  0.2  0.2  0.05 0.55
 0.45 0.75 0.5  0.5  1.   0.5  1.   0.6  0.45 0.05 0.45 0.4  0.05 0.05
 0.8  0.05 0.85 0.85 0.8  0.7  0.9  0.65 0.2  1.   0.3  0.85 0.8  0.7
 0.95 0.2  0.7  0.95 0.95 0.2  0.2  0.25 0.6  0.7  0.3  0.25 0.15 0.2
 0.7  0.15 0.5  0.35 0.1  0.15 0.2  0.2  0.5  0.2  0.65 0.8  0.15 0.6
 0.2  0.2  0.2  0.6  0.65 0.05 0.3  0.8  0.7  0.05 0.65 0.3  0.8  0.7
 0.05 0.85 0.65 0.65 0.45 0.45 0.65 0.75 0.85 0.8  0.65 0.15 0.25 0.65
 0.2  0.9  0.5  0.45 0.2  1.   0.9  0.8  0.6  0.05 0.5  0.25 0.85 0.6
 0.75 0.85 1.   0.6  0.1  0.25 0.4  0.4  0.25 0.85 0.85 0.05 0.2  0.45
 0.3  0.45 0.2  0.5  1.   0.65 0.1  0.4  0.7  0.05 0.05 1.   0.45 0.1
 0.85 0.25 0.4  0.05 0.5  1.   0.55 1.   0.6  0.3  0.15 0.8  0.9  0.5
 1.   0.4  0.4  0.85 0.9  0.3  0.45 0.35 0.75 0.9  0.6  0.05 0.55 0.2
 0.6  0.5  0.1  0.8  0.45 0.45 0.1  0.85 0.9  0.8  0.25 0.5  0.7  0.05
 0.45 0.3  0.9  0.5  0.45 0.65 0.7  0.2  0.05 1.   0.6  0.9  0.1  0.1
 0.85 0.25 0.2  0.5  0.4  0.8  0.7  0.6  0.4  0.7  0.3  0.3  0.5  0.65
 0.8  0.8  0.25 0.25 0.6  0.65 0.9  0.7  0.2  0.2  0.2  0.45 0.8  0.9
 0.6  0.95 0.45 0.5  0.4  0.8  0.2  0.25 0.05 0.1  0.8  0.4  0.45 0.1
 0.85 0.15 0.65 0.5  0.5  0.5  0.55 0.05 0.5  1.   0.5  0.2  0.25 0.85
 0.85 0.05 0.65 0.2  0.05 0.1  0.45 0.9  0.1  0.15 0.6  0.65 0.75 0.75
 0.5  0.2  0.35 0.75 0.75 0.35 0.35 0.85 0.45 0.15 0.35 0.85 0.5  0.6
 0.05 0.5  0.5  0.25 0.7  0.15 0.8  0.45 0.85 0.7  0.45 0.85 0.4  0.1
 0.6  0.7  0.05 0.1  0.15 0.85 0.9  0.5  0.05 0.45 0.75 0.75 0.5  0.15
 0.55 0.45 0.85 0.5  0.85 0.75 0.6  0.2  0.5  0.5  0.9  0.7  0.75 0.95
 0.7  0.3  0.5  0.25 0.7  0.2  0.55 0.2  0.15 0.5  0.25 0.3  0.05 0.75
 0.3  0.2  0.2  0.35 0.5  0.05 0.35 0.75 0.55 0.05 0.05 0.9  0.55 0.95
 0.5  0.6  0.05 0.5  0.35 0.65 0.6  0.55 0.65 0.15 0.9  0.4  0.25 0.6
 1.   0.4  0.45 0.55 0.9  0.9  0.2  0.6  0.45 0.65 0.45 0.7  0.75 1.
 0.5  0.5  0.5  0.45 0.3  0.65 0.9  0.6  0.1  0.3  0.45 0.85 0.85 0.9
 0.05 0.05 0.3  0.5  0.4  0.3  0.5  0.1  0.3  0.3  0.05 1.   0.5  0.6
 0.4  0.6  0.1  0.65 0.65 0.2  0.75 0.5  0.05 0.25 0.2  0.5  0.3  0.55
 0.05 0.4  0.15 0.7  0.25 0.85 0.9  0.9  0.25 0.2  0.15 0.9  0.45 0.3
 0.45 0.45 0.8  0.8  0.45 0.8  0.8  0.5  0.7  0.85 0.3  0.4  0.3  0.25
 0.2  0.6  0.5  0.15 0.6  0.5  0.75 0.15 0.35 0.5  0.15 0.3  0.05 0.9
 0.65 0.9  0.6  0.5  0.2  0.75 0.45 0.35 0.7  0.6  0.45 0.9  0.85 0.7
 0.4  0.25 0.65 0.65 0.3  0.4  0.9  0.85 0.1  0.6  0.2  1.   0.15 0.4
 0.65 0.5  0.85 0.9  0.45 0.4  0.75 0.55 1.   0.7  0.45 0.9  0.2  0.5
 0.5  0.35 0.6  1.   0.6  0.5  1.   0.45 0.8  0.5  0.45 0.6  0.85 0.2
 0.2  0.9  0.3  0.45 0.45 0.75 1.   0.5  0.7  0.8  0.3  0.4  0.85 0.95
 0.5  0.5  0.5  0.5  0.4  1.   0.25 0.75 0.8  0.9  0.15 0.15 0.25 0.85
 0.2  0.45 0.5  0.7  0.2  0.1  0.9  0.9  0.45 0.95 0.45 0.2  0.75 0.4
 0.2  0.85 0.2  0.9  0.3  0.15 0.55 0.95 0.5  0.5  0.85 0.55 0.45 0.2
 0.6  0.4  0.2  0.7  0.3  0.45 0.6  0.4  0.5  0.2  0.45 0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
 0.   0.   0.   0.   0.   0.  ]

数据用 0 填充,以便所有序列的长度为 1000 个元素。

这是我正在使用的模型的代码(如果要下载,请使用保管箱链接)

    import numpy as np
        from sklearn.utils import shuffle
        import tensorflow as tf
        from tensorflow import keras
        from tensorflow.keras.models import Sequential
        from tensorflow.keras.layers import Dense, Dropout, LSTM
        import numpy as np


        def main():
            posData = createListOfSequences('PositiveData.txt')
            negData = createListOfSequences('NegativeData.txt')

            # Shuffle both
            np.random.shuffle(posData)
            np.random.shuffle(negData)

            # Create target lists
            PosTargets = [1.0] * len(posData)
            NegTargets = [0.0] * len(negData)

            # Combine PosData and NegData into 1 list
            Sequences = posData + negData
            Targets = PosTargets + NegTargets

            # shuffle sequences but maintain link to targets
            (Sequences, Targets) = shuffle(Sequences, Targets)

            # make all sequences 1000 in length
            for sequence in Sequences:
                sequence = padWithZero(1000, sequence)

            Sequences = np.array(Sequences)
            Targets = np.array(Targets)

            FitModel(Sequences, Targets)


        def FitModel(data, target):
            trainPercentage = 0.8
            splitValue = round(len(data) * trainPercentage)

            (x_train, y_train) = data[0:splitValue], target[0:splitValue]
            (x_test, y_test) = data[splitValue:len(
                data)], target[splitValue:len(target)]

            model = Sequential()

            model.add(LSTM(128, activation='relu',
                           input_shape=(1000, 1), return_sequences=True))
            model.add(Dropout(0.2))
            model.add(LSTM(128, activation='relu'))
            model.add(Dropout(0.2))
            model.add(Dense(32, activation='relu'))
            model.add(Dropout(0.2))
            model.add(Dense(1, activation='sigmoid'))

            opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)

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

            model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))


        def padWithZero(targetLength, sequence):
            i = 0
            while not(len(sequence) >= targetLength):
                if (i % 2 == 0):
                    sequence.append(0.0)
                else:
                    sequence.insert(0, 0.0)
                i += 1
            return sequence


        def createListOfSequences(dataPath):
            DataAsString = []
            for line in open(dataPath):
                x = line.rstrip()
                DataAsString.append((x.split(',')))

            ListOfSequences = []

            for seq in DataAsString:
                listOfFloats = []
                for val in seq:
                    if '.' in val:
                        listOfFloats.append(float(val))
                ListOfSequences.append(listOfFloats)

            return(ListOfSequences)


        main()

任何帮助将不胜感激。谢谢。

标签: pythonnumpykeraslstmrecurrent-neural-network

解决方案


正如错误消息所说,LSTM 需要 3 个维度的输入。你可以像这样重塑:

x_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])

基本上,将形状(a, b)变成(a, 1, b).


推荐阅读