Я хочу предсказать давление машины. У меня есть 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_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)]]
тем, у кого появляется аналогичная ошибка, можно также проверить эту ссылку github.com/keras-team/keras/issues/11749 - изменение используемых метрик может помочь в решении проблемы.
Проблема в том, что у вашей модели вход 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 Добро пожаловать. Вам лучше написать текст в виде комментария, если ваш текст не может отвечать на вопросы напрямую. Обычно считается, что размер партии не важен для DL. Таким образом, вы можете установить значение по своему желанию. Использовать ли формирование или изменение формы, зависит от ввода и использования вашей модели. Короче говоря, нужно больше тренироваться. Наконец, не забудьте принять ответ как принятый, если он решил вашу проблему.
Извините, что снова беспокою вас, но я думаю, что у меня возникли проблемы с пониманием формы ввода и формы данных при использовании модели LSTM. Я понимаю, что форма моих входных данных должна быть = (количество строк, значение в каждой строке, количество столбцов). Я читал, что вы также можете указать количество look_backs, но я получаю сообщение об ошибке, если я хочу это уместить. Есть ли у вас какие-либо предложения? Большое тебе спасибо
@ D.Luipers Вам необходимо прочитать некоторые документы по keras (keras.io/layers/recurrent/#lstm) и примеры (deeplearning.net/tutorial/lstm.html или machinelearningmastery.com/… и т. д.).
Вы забываете переделывать
x_test
какx_train
.