我无法正确地将我的Dense层连接到我的LSTM层。我的Y值范围在0到1之间,所以使用sigmoid函数对我来说似乎是合理的选择。
我收到了以下错误信息:
检查目标时出错:期望dense_4具有2个维度,但得到的数组形状为(993, 300, 1)
对我来说,输入形状似乎是正确的,总数据框是(350700, 2413),我将其重塑为(1169, 300, 2413),不包括Y值。我就是无法弄明白如何使Dense层工作并将sigmoid函数应用到我的Y值上。
在训练测试分割中,我的y_train形状为(993, 300, 1),这是我错误的主要问题,但我无法理解我做错了什么。x_train的形状为(933, 300, 2413),x_test的形状为(176, 300, 2413),y_test的形状为(176, 300, 1)。
这是我设置的网络,使用的后端是tensorflow(也使用过theano,问题相同)
_________________________________________________________________Layer (type) Output Shape Param # =================================================================lstm_21 (LSTM) (None, 300, 1000) 13656000 _________________________________________________________________lstm_22 (LSTM) (None, 300, 500) 3002000 _________________________________________________________________lstm_23 (LSTM) (None, 300, 250) 751000 _________________________________________________________________lstm_24 (LSTM) (None, 300, 100) 140400 _________________________________________________________________lstm_25 (LSTM) (None, 50) 30200 _________________________________________________________________dense_4 (Dense) (None, 1) 51 =================================================================Total params: 17,579,651Trainable params: 17,579,651Non-trainable params: 0_________________________________________________________________
这是我的代码。
import numpy as npimport pandas as pdfrom keras.models import Sequentialfrom keras.layers.advanced_activations import LeakyReLUfrom keras.layers import Dense, Activation, LSTM, Flattenfrom keras import backend as Kfrom sklearn.model_selection import train_test_splitaa = aa[np.isfinite(aa['Y1'])]aa=aa[-350700:]Y=aa['Y1'].values.reshape(1169,300,1) #break into 1169 samples @ 300 timestampsaa.drop(drop1, axis=1, inplace=True) #drop the Y1 feature and others not needed.features=aa.shape[1]X=aa.values.reshape(1169,300,features)seed = 7X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.15, random_state=seed)model = Sequential()model.add(LSTM(1000, input_shape=(300,features),activation='relu',return_sequences=True))model.add(LSTM(500,activation='relu',return_sequences=True))model.add(LSTM(250,activation='relu',return_sequences=True))model.add(LSTM(100, activation='relu',return_sequences=True))model.add(LSTM(50,activation='relu',return_sequences=False))model.add(Dense(1,activation='sigmoid'))model.compile(loss='mae', optimizer='adam', metrics=['mse', 'mae', 'mape'])print(model.summary())# evaluate model with standardized datasetmodel.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=15000)
回答:
你的“数据”与你的“最后一层形状”不兼容。
- 要么你需要
Y_train
的形状为(993,1)
– 对整个序列进行分类 - 要么你需要在“所有”LSTM层中保持
return_sequences=True
– 对每个时间步进行分类
正确的方法取决于你想要做什么。