我正在尝试使用lstm训练能量需求的时间序列。我使用了时间戳并得到了结果,但是对于这个实验,我试图将日期时间分成几天,一个月,一年,几小时。因此,在分割数据后,我的csv文件看起来像这样
timestamp | day | month | year | hour | demand
01-07-15 1:00 | 1 | 7 | 2015 | 1 | 431607
我使用keras进行LSTM(我对它很新)。我到目前为止编写了以下代码。
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
dataframe = read_csv('patched_data_sorted.csv', engine='python')
dataset = dataframe.values
trainX = dataset[:, 1:5]
sampleSize = len(trainX)
trainX = trainX.reshape(1, len(trainX), 4)
trainY = dataset[:, 5]
trainY = trainY.reshape(1, len(trainY))
print(trainY)
# print(trainX)
model = Sequential()
model.add(LSTM(4, input_shape=(sampleSize, 4)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
trainPredict = model.predict(trainX)
print(trainPredict)
但我收到此错误
ValueError: Error when checking target: expected dense_1 to have shape (None, 1) but got array with shape (1, 20544)
我不确定为什么会这样,但我认为我没有正确地重塑。
答案 0 :(得分:0)
在您的数据中,您有序列的每个时间步的标签。您当前的网络设置为只有一个标签用于整个序列。
要获得每个时间步的输出,您需要将return_sequences=True
添加到LSTM并将Dense
图层包裹在TimeDistributed
图层中,以便在每个时间步都应用它。
model = Sequential()
model.add(LSTM(4, input_shape=(sampleSize, 4), return_sequences=True))
model.add(TimeDistributed(Dense(1)))