Ошибка при проверке ввода: ожидалось, что lstm_1_input будет иметь 3 измерения, но получил массив с формой (5, 3) - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть задача предсказать занятость помещения (1,2) из ​​3 датчиков, используя LSTM. См. Изображение ниже для примера этих данных:

data

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

x = np.array([
    [31, 3, 5],
    [32, 3, 5],
    [29, 0, 3],
    [31, 3, 4],
    [23, 2, 4],
    [22, 2, 4],
    [23, 1, 4], ])

y = np.array([
    [2],
    [2],
    [1],
    [2],
    [1],
    [1],
    [1], ])

x = x.reshape(7, 3, 1)

x_train,x_test,y_train,y_test = train_test_split(x, y,test_size =0.2, random_state = 4)

model=Sequential() 
model.add(LSTM((1), activation='softmax', input_shape=x_train.shape,return_sequences=False))

Я получил ошибку здесь:

-------------------------------------------------- ------------------------- ValueError Traceback (последний вызов был последним) в ----> 1 model.add (LSTM ((1), активация = 'softmax', input_shape = x_train.shape, return_sequence = False))

~ / opt / anaconda3 / lib / python3 .7 / site-packages / keras / engine / sequential.py в добавлении (self, layer) 163 # и создайте узел, соединяющий текущий слой 164 # с входным слоем, который мы только что создали. -> 165 layer (x) 166 set_inputs = True 167 else:

~ / opt / anaconda3 / lib / python3 .7 / site-packages / keras / Layers / recurrent.py в вызов (self, input, initial_state, константы, ** kwargs) 530 531, если initial_state равен None, а констант - None: -> 532 return super (RNN, self). call (входы, ** kwargs) 533 534 # Если указаны какие-либо из initial_state или constants и являются Keras

~ / opt / anaconda3 / lib / python3 .7 / site-packages / keras / engine / base_layer.py в call (self, input, ** kwargs) 412 # Вызывать исключения, если входные данные несовместимы 413 # с input_spe c, указанным в конструкторе слоя. -> 414 self.assert_input_compatibility (входные данные) 415 416 # Собирать входные фигуры для построения слоя.

~ / opt / anaconda3 / lib / python3 .7 / site-packages / keras / engine / base_layer. py в assert_input_compatibility (self, input) 309 self.name + ': ожидается ndim =' + 310 стр. (spe c .ndim) + ', найдено ndim =' + -> 311 стр. (K.ndim (x) )) 312, если spe c .max_ndim не равно None: 313 ndim = K.ndim (x)

ValueError: вход 0 несовместим со слоем lstm_1: ожидаемый ndim = 3, найденный ndim = 4

Тогда я не смог запустить несколько приведенных ниже строк из-за ошибки:

model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])
model.summary()
history = model.fit(x_train, y_train, epochs=20, validation_data=(x_test, y_test))

Может ли кто-нибудь помочь мне определить проблему? Все данные являются категориями, преобразованными в целые числа, разумно ли создавать модель таким образом?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Вам нужно изменить форму ввода следующим образом:

x = x.reshape(x.shape[0], 1, x.shape[1])  # the 1 is the steps

И указать форму ввода следующим образом:

input_shape=(x.shape[1:])

Поэтому используйте эти строки, и они будут работать:

x = x.reshape(7, 1, 3)

model.add(LSTM((1), activation='softmax', input_shape=x_train.shape[1:],
    return_sequences=False))

Наконец, ваша функция активации должна быть sigmoid, если у вас есть только два класса.

0 голосов
/ 25 февраля 2020

Входные данные имеют форму (batch_length, sequence_length (количество временных шагов), number_of_features)

Если я правильно понимаю, вы хотите передать свой x, чтобы быть серией последовательностей временных меток, которые вы сделали , Ваша входная форма, однако, устанавливается на x.shape. Когда я это сделал, мой LSTM x.shape [1:] работал для меня, потому что он принимает значение None в качестве измерения для количества пакетов, а затем помещает x [1], x [2] в качестве sequence_length и количества объектов.

Попробуйте:

input_shape = x.shape[1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...