Ошибка при проверке ввода: ожидалось, что lstm_input будет иметь 3 измерения, но получил массив с формой (160, 1000) - PullRequest
0 голосов
/ 01 ноября 2019

Я получаю эту ошибку, когда пытаюсь использовать модель 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.  ]

Данные дополняются нулями, поэтому все последовательности имеют длину 1000 элементов.

Вот код для модели, которую я использую (используйте ссылку dropbox, если хотитескачать)

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

Любая помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2019

Как говорится в сообщении об ошибке, LSTM требует ввода в трех измерениях. Вы можете изменить форму так:

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

В основном, превращая форму (a, b) в (a, 1, b).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...