首页 文章

keras多层LSTM模型的股价预测收敛于恒定值

提问于
浏览
0

enter image description here
I 've made a multilayer LSTM model that uses regression to predict next frame'的数据值 . 该模型在20个时期后完成 . 然后我得到一些预测并将它们与我的基本事实值进行比较 . 正如您在上图中看到的那样,预测会收敛到一个恒定值 . 我不知道为什么会这样 . 这是我到目前为止的模型:

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers import LSTM, BatchNormalization
from tensorflow.python.keras.initializers import RandomUniform

init = RandomUniform(minval=-0.05, maxval= 0.05)

model = Sequential()

model.add(LSTM(kernel_initializer=init, activation='relu', return_sequences=True, units=800, dropout=0.5, recurrent_dropout=0.2, input_shape=(x_train.shape[1], x_train.shape[2]) ))
model.add(LSTM(kernel_initializer=init, activation='relu', return_sequences=False, units=500, dropout=0.5, recurrent_dropout=0.2 ))

model.add(Dense(1024, activation='linear', kernel_initializer=init))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear', kernel_initializer= 'normal'))

model.compile(loss='mean_squared_error', optimizer='rmsprop' )
model.summary()

EDIT1: 我将时期从20减少到3.结果如下:
prediction results after 3 epochs.

通过比较2张图片,我可以得出结论,当时期数增加时,预测更有可能收敛到约-0.1的某个特定值 .

1 回答

  • 1

    因此,在尝试了不同数量的 LSTM 单位和不同类型的架构之后,我意识到当前的 LSTM 单位数会导致模型学习如此缓慢,并且20个时期对于如此庞大的模型来说还不够 . 对于每一层,我改变了数量LSTM单位到64并且还移除了 Dense(1024) 层并且将时期数从20增加到400并且结果非常接近地面实况值 . I should mention that the dataset used in the new model was different from the former one because I encountered some problems with that dataset . 这是新模型:

    from keras.optimizers import RMSprop
    from keras.initializers import glorot_uniform, glorot_normal, RandomUniform
    
    init = glorot_normal(seed=None)
    init1 = RandomUniform(minval=-0.05, maxval=0.05)
    optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
    
    model = Sequential()
    
    model.add(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2, 
                   input_shape=(x_train.shape[1], x_train.shape[2]), 
                   return_sequences=True, kernel_initializer=init))
    
    model.add(LSTM(units=64, dropout=0.2, recurrent_dropout=0.2, 
                   return_sequences=False, kernel_initializer=init))
    
    
    model.add(Dense(1, activation='linear', kernel_initializer= init1))
    model.compile(loss='mean_squared_error', optimizer=optimizer )
    model.summary()
    

    你可以在这里看到预测:
    enter image description here

    它仍然不是最好的模型,但至少跑赢前者 . 如果您对如何改进它有任何进一步的建议,我们将不胜感激 .

相关问题