InvalidArgumentError: Несовместимые фигуры с Keras LSTM Net - PullRequest
0 голосов
/ 10 сентября 2018

Я хочу предсказать давление машины. У меня 18 входных значений и давление на выходе. Итак, у меня есть 19 столбцов и 7657 строк, поскольку база данных состоит из 7657 временных шагов, и каждый считает по 1 секунде.

У меня проблема со следующим кодом:

import tensorflow as tf
import pandas as pd
from matplotlib import pyplot
from sklearn.preprocessing import MinMaxScaler
from sklearn import linear_model  
from keras.models import Sequential
from keras.layers import Dense #Standard neural network layer
from keras.layers import LSTM
from keras.layers import Activation 
from keras.layers import Dropout

df = pd.read_csv('Testdaten_2_Test.csv',delimiter=';')

feature_col_names=['LSDI','LZT1I', ..... ,'LZT5I']
predicted_class_names = ['LMDI']

x = df[feature_col_names].values
y = df[predicted_class_names].values

x_train_size = 6400
x_train, x_test = x[0:x_train_size], x[x_train_size:len(x)]

y_train_size = 6400
y_train, y_test = y[0:y_train_size], y[y_train_size:len(y)]

nb_model = linear_model.LinearRegression()
nb_model.fit(X=x_train, y=y_train)

nb_predict_train = nb_model.predict(x_test)

from sklearn import metrics

def scale(x, y):
    # fit scaler
    x_scaler = MinMaxScaler(feature_range=(-1, 1))
    x_scaler = x_scaler.fit(x)
    x_scaled = x_scaler.transform(x)

    # fit scaler
    y_scaler = MinMaxScaler(feature_range=(-1, 1))
    y_scaler = y_scaler.fit(y)
    y_scaled = y_scaler.transform(y)
    return x_scaler, y_scaler, x_scaled, y_scaled

x_scaler, y_scaler, x_scaled, y_scaled = scale(x, y)
x_train, x_test = x_scaled[0:x_train_size], x_scaled[x_train_size:len(x)]
y_train, y_test = y_scaled[0:y_train_size], y_scaled[y_train_size:len(y)]

x_train=x_train.reshape(x_train_size,1,18)
y_train=y_train.reshape(y_train_size,1,1)

model = Sequential()

model.add(LSTM(10, return_sequences=True,batch_input_shape=(32,1,18)))  
model.add(LSTM(10,return_sequences=True))  
model.add(LSTM(1,return_sequences=True, activation='linear'))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=        
['accuracy'])

model.fit(x_train, y_train, epochs=10,batch_size=32)

score = model.evaluate(x_test, y_test,batch_size=32)

predicted = model.predict(x_test)
predicted = y_scaler.inverse_transform(predicted)
predicted = [x if x > 0 else 0 for x in predicted]

correct_values = y_scaler.inverse_transform(y_test)
correct_values = [x if x > 0 else 0 for x in correct_values]
print(nb_predict_train)

Я получаю сообщение об ошибке:

ValueError: Ошибка при проверке ввода: ожидается, что lstm_1_input будет иметь 3 размеры, но получили массив с формой (1257, 18)

После последней строки кода.

Я также попытался изменить форму тестовых данных, но затем я получил очень похожую ошибку.

Я думаю, мне не хватает чего-то очень простого или базового, но я не могу понять это в данный момент, так как я только начинающий в кодировании нейронных сетей. Мне нужно это для моей магистерской диссертации, поэтому я был бы очень благодарен, если бы кто-нибудь мог мне помочь.

1 Ответ

0 голосов
/ 11 сентября 2018

Проблема в том, что ваша модель ввода batch_input_shape исправлена. Длина вашего теста составляет 1257 и не может делиться на 32. Ее следует изменить следующим образом:

model.add(LSTM(10, return_sequences=True,batch_input_shape=(None,1,18)))

Вы должны изменить форму теста до того, как модель оценит тест.

x_test= x_test.reshape(len(x)-x_train_size,1,18)
y_test= y_test.reshape(len(y)-x_train_size,1,1)
score = model.evaluate(x_test, y_test,batch_size=32)

Конечно, вы должны изменить predicted и y_test до inverse_transform.

predicted = model.predict(x_test)
predicted= predicted.reshape(len(y)-x_train_size,1)
y_test= y_test.reshape(len(y)-x_train_size,1)
...