Invalidargumenterror: несовместимые формы с keras lstm net

Я хочу предсказать давление машины. У меня есть 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: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (1257, 18)

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

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

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

Вы забываете переделывать x_test как x_train.

giser_yugang 10.09.2018 13:32

Привет, я уже сделал это. При добавлении: x_test = x_test.reshape (1257,1,18) y_test = y_test.reshape (1257,1,1) В конце я получаю ошибку: InvalidArgumentError: несовместимые формы: [9,10] vs. [32, 10] [[Узел: lstm_1 / while / add_5 = ​​Добавить [T = DT_FLOAT, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] (lstm‌ _1 / while / BiasAdd_2, lstm_1 / while / MatMul_6)]]

D.Luipers 10.09.2018 17:31

тем, у кого появляется аналогичная ошибка, можно также проверить эту ссылку github.com/keras-team/keras/issues/11749 - изменение используемых метрик может помочь в решении проблемы.

Van Peer 27.12.2018 12:13
3
3
4 862
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что у вашей модели вход 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)

Привет, большое спасибо, теперь мой код работает. Не могли бы вы мне сказать, почему размер партии зафиксирован на 32? Я знаю, что я поместил Input в модель на 32, но я думаю, что мне нужно было сделать это, чтобы мой код давал мне какие-либо выходные данные, кроме Error. В общем, я не понимаю принципа группирования, формирования или изменения формы. У вас есть предложения, где я мог бы получить дополнительные знания по этим конкретным темам? И еще раз большое вам спасибо. Лучше, если я напишу этот текст в качестве ответа, а не комментария? (Я новичок на этой странице: D)

D.Luipers 11.09.2018 13:44

@ D.Luipers Добро пожаловать. Вам лучше написать текст в виде комментария, если ваш текст не может отвечать на вопросы напрямую. Обычно считается, что размер партии не важен для DL. Таким образом, вы можете установить значение по своему желанию. Использовать ли формирование или изменение формы, зависит от ввода и использования вашей модели. Короче говоря, нужно больше тренироваться. Наконец, не забудьте принять ответ как принятый, если он решил вашу проблему.

giser_yugang 11.09.2018 15:03

Извините, что снова беспокою вас, но я думаю, что у меня возникли проблемы с пониманием формы ввода и формы данных при использовании модели LSTM. Я понимаю, что форма моих входных данных должна быть = (количество строк, значение в каждой строке, количество столбцов). Я читал, что вы также можете указать количество look_backs, но я получаю сообщение об ошибке, если я хочу это уместить. Есть ли у вас какие-либо предложения? Большое тебе спасибо

D.Luipers 18.09.2018 15:56

@ D.Luipers Вам необходимо прочитать некоторые документы по keras (keras.io/layers/recurrent/#lstm) и примеры (deeplearning.net/tutorial/lstm.html или machinelearningmastery.com/… и т. д.).

giser_yugang 19.09.2018 04:01

Другие вопросы по теме