Keras Tensorflow无法学习简单的线性关系

时间:2019-05-30 23:06:47

标签: tensorflow machine-learning keras lstm

我对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学习这种关系吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

一些问题:

通常,LSTM层从头开始,然后是几个致密层。

此外,在密集层之前的LSTM层需要将return_sequence设置为False。

但是,我不确定它们是否是导致此问题的原因,我只是指出问题所在。我认为问题很可能是数据集,您应该检查数据集是否具有模式。

相关问题