我对Tensorflow / Keras相当陌生,并正在尝试建立LSTM模型。我已经成功运行了我的代码,但是我的结果未能给我有意义的结果。因此,作为一项测试,我让我的LSTM网络学习我正在输入的功能之一。我知道LSTM和relu使用非线性关系,但是,我仍然期望输出与我试图学习的输入功能有些相似,而根本不了解。
我正在使用从https://keras.io/getting-started/sequential-model-guide/
中学到的修改版本feature_set = features.iloc[:-3,:].transpose() #23 features
target_set = features.iloc[-4:,:].transpose().iloc[:,0] #picking the 23rd feature
X_train,X_test,y_train,y_test = train_test_split(feature_set, target_set, test_size=0.2, shuffle=False, random_state=42)
rnn_units = 256
batch_size = 1
features_dim = 23
output = 1
def build_model(rnn_units):
model = tf.keras.Sequential([
tf.keras.layers.Dense(rnn_units, batch_input_shape=[batch_size, None, features_dim], activation='relu'),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.CuDNNLSTM(rnn_units,
return_sequences=True,
stateful=True),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.CuDNNLSTM(rnn_units,
return_sequences=True,
stateful=True),
tf.keras.layers.Dense(output)
])
return model
model = build_model(rnn_units=rnn_units)
model.compile(optimizer = tf.train.AdamOptimizer(), loss = tf.keras.losses.mean_squared_error, metrics=['mse', 'mae', 'mape', 'cosine'])
reshape_train = int(X_train.values.shape[0]/batch_size)
reshape_test = int(X_test.values.shape[0]/batch_size)
history = model.fit(X_train.values[:reshape_train*batch_size].reshape(reshape_train*batch_size, -1, features_dim), y_train.values[:reshape_train*batch_size].reshape(reshape_train*batch_size, -1, output), epochs=EPOCHS, batch_size=batch_size, validation_data=(X_test.values[:reshape_test*batch_size].reshape(reshape_test*batch_size, 1, features_dim), y_test.values[:reshape_test*batch_size].reshape(reshape_test*batch_size, 1, output)), callbacks=[checkpoint_callback,tensorboard])
如您所见,我正在输入一个由23个值组成的特征集,并试图学习第23个特征。我在每层中使用256个节点,在开始和结束时使用一个Dense布局,并在两个LSTM层之后是Dropout层。
我正在使用均方,因为它应该是对时间序列数据的回归。
例如,这是我的一次训练:
Epoch 5/5
10329/10329 [==============================] - 93s 9ms/sample - loss: 0.0182 - mean_squared_error: 0.0182 - mean_absolute_error: 0.0424 - mean_absolute_percentage_error: 94.4916 - cosine_proximity: -0.9032 - val_loss: 0.0193 - val_mean_squared_error: 0.0193 - val_mean_absolute_error: 0.0438 - val_mean_absolute_percentage_error: 58.2152 - val_cosine_proximity: -0.9443
当我跑步
result = model.predict(feature_set.values.reshape(-1, 1, features_dim))
feature_set.transpose().append(pd.DataFrame(result.reshape(-1), columns = ['Prediction 5min']).set_index(features.columns).transpose()).transpose()
我得到了
2019-03-04 01:00:00 82.0105414589 0.0704929618 -0.1165011768 -0.3369084807 -1.8137642288 -0.2780955060 -4.3090711538 6.2721520391 9.5553857757 -1.2900340169 ... -29.8867675862 1.9178869544 -1.4765772054 1.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0080950060 -0.3594492457 0.0056902645
最后2个值应相等,但应相等
-0.3594492457 0.0056902645
知道我的模型做错了什么吗?我可以使用LSTM学习这种关系吗?
谢谢!
答案 0 :(得分:0)
一些问题:
通常,LSTM层从头开始,然后是几个致密层。
此外,在密集层之前的LSTM层需要将return_sequence设置为False。
但是,我不确定它们是否是导致此问题的原因,我只是指出问题所在。我认为问题很可能是数据集,您应该检查数据集是否具有模式。