Python 为LSTM整形数据,并将密集层的输出馈送至LSTM

Python 为LSTM整形数据,并将密集层的输出馈送至LSTM,python,tensorflow,keras,neural-network,lstm,Python,Tensorflow,Keras,Neural Network,Lstm,我试图找出适合我所尝试的模型的正确语法。这是一个时间序列预测问题,我想在将时间序列输入LSTM之前,使用几个密集层来改进时间序列的表示 下面是我正在处理的一个虚拟系列: import pandas as pd import matplotlib.pyplot as plt plt.style.use('seaborn-whitegrid') import numpy as np import keras as K import tensorflow as tf d = pd.DataFrame

我试图找出适合我所尝试的模型的正确语法。这是一个时间序列预测问题,我想在将时间序列输入LSTM之前,使用几个密集层来改进时间序列的表示

下面是我正在处理的一个虚拟系列:

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
import keras as K
import tensorflow as tf

d = pd.DataFrame(data = {"x": np.linspace(0, 100, 1000)})
d['l1_x'] = d.x.shift(1)
d['l2_x'] = d.x.shift(2)
d.fillna(0, inplace = True)
d["y"] = np.sin(.1*d.x*np.sin(d.l1_x))*np.sin(d.l2_x)
plt.plot(d.x, d.y)

首先,我将装配一个在其前面没有密集层的LSTM。这需要我重新塑造数据:

X = d[["x", "l1_x", "l2_x"]].values.reshape(len(d), 3,1)
y = d.y.values
这是正确的吗?

这些教程使一个时间序列的第一维度看起来应该是1,然后是时间步数(1000),然后是协变量数(3)。但当我这样做时,模型就无法编译

在这里,我编译并训练模型:

model = K.Sequential()
model.add(K.layers.LSTM(10, input_shape=(X.shape[1], X.shape[2]), batch_size = 1, stateful=True))
model.add(K.layers.Dense(1))
callbacks = [K.callbacks.EarlyStopping(monitor='loss', min_delta=0, patience=5, verbose=1, mode='auto', baseline=None, restore_best_weights=True)]
model.compile(loss='mean_squared_error', optimizer='rmsprop')

model.fit(X, y, epochs=50, batch_size=1, verbose=1, shuffle=False, callbacks = callbacks)
model.reset_states()

yhat = model.predict(X, 1)
plt.clf()
plt.plot(d.x, d.y)
plt.plot(d.x, yhat)
为什么我不能使模型过度拟合???是因为我错误地重塑了数据吗?当我在LSTM中使用更多节点时,它实际上并没有变得更适合

(我也不清楚“有状态”是什么意思。神经网络只是非线性模型。“状态”指的是哪些参数,为什么要重置它们?)

如何在输入和LSTM之间插入密集层? 最后,我想添加一组密集层,在到达LSTM之前,基本上在
x
上进行基展开。但是LSTM需要一个3D阵列,而密集层则会生成一个矩阵。我在这里干什么?这不起作用:

model = K.Sequential()
model.add(K.layers.Dense(10, activation = "relu", input_dim = 3))
model.add(K.layers.LSTM(3, input_shape=(10, X.shape[2]), batch_size = 1, stateful=True))
model.add(K.layers.Dense(1))

ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=2

对于第一个问题,我正在做同样的事情,我没有得到任何错误,请分享您的错误

注意:我将为您提供使用函数式API的示例,它提供了更多的自由(个人观点)

对于第二个问题,有两种方法:

  • 如果您发送数据时不按顺序进行,其dims为
    (批处理,输入dims)
    ,则可以使用此方法,通过
    n\u步重复相同的权重,这在LSTM中只不过是
    滚动步骤
  • {

  • 如果要发送DIM序列
    (seq_len,input_dims)
    ,则可以在整个序列上重复相同的密集层权重
  • {


    注意:我在第一层堆叠了两层,在第一层我使用了
    返回序列
    ,它在每一个时间步返回输出,第二层使用,最后它是返回输出
    时间步

    ,如果这解决了你的问题,请接受它。@Ankish会在我有机会挖掘int时这样做哦!现在和我儿子在雪地里玩。明天是星期一。
    from keras.layers import Dense, Flatten, LSTM, Activation
    from keras.layers import Dropout, RepeatVector, TimeDistributed
    from keras import Input, Model
    
    seq_length = 15
    input_dims = 10
    output_dims = 8
    n_hidden = 10
    model1_inputs = Input(shape=(seq_length,input_dims,))
    model1_outputs = Input(shape=(output_dims,))
    
    net1 = LSTM(n_hidden, return_sequences=True)(model1_inputs)
    net1 = LSTM(n_hidden, return_sequences=False)(net1)
    net1 = Dense(output_dims, activation='relu')(net1)
    model1_outputs = net1
    
    model1 = Model(inputs=model1_inputs, outputs = model1_outputs, name='model1')
    
    ## Fit the model
    model1.summary()
    
    
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_11 (InputLayer)        (None, 15, 10)            0         
    _________________________________________________________________
    lstm_8 (LSTM)                (None, 15, 10)            840       
    _________________________________________________________________
    lstm_9 (LSTM)                (None, 10)                840       
    _________________________________________________________________
    dense_9 (Dense)              (None, 8)                 88        
    _________________________________________________________________
    
    seq_length = 15
    input_dims = 16
    output_dims = 8
    n_hidden = 20
    lstm_dims = 10
    model1_inputs = Input(shape=(input_dims,))
    model1_outputs = Input(shape=(output_dims,))
    
    net1 = Dense(n_hidden)(model1_inputs)
    net1 = Dense(n_hidden)(net1)
    
    net1 = RepeatVector(3)(net1)
    net1 = LSTM(lstm_dims, return_sequences=True)(net1)
    net1 = LSTM(lstm_dims, return_sequences=False)(net1)
    net1 = Dense(output_dims, activation='relu')(net1)
    model1_outputs = net1
    
    model1 = Model(inputs=model1_inputs, outputs = model1_outputs, name='model1')
    
    ## Fit the model
    model1.summary()
    
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_13 (InputLayer)        (None, 16)                0         
    _________________________________________________________________
    dense_13 (Dense)             (None, 20)                340       
    _________________________________________________________________
    dense_14 (Dense)             (None, 20)                420       
    _________________________________________________________________
    repeat_vector_2 (RepeatVecto (None, 3, 20)             0         
    _________________________________________________________________
    lstm_14 (LSTM)               (None, 3, 10)             1240      
    _________________________________________________________________
    lstm_15 (LSTM)               (None, 10)                840       
    _________________________________________________________________
    dense_15 (Dense)             (None, 8)                 88        
    =================================================================
    
    seq_length = 15
    input_dims = 10
    output_dims = 8
    n_hidden = 10
    lstm_dims = 6
    model1_inputs = Input(shape=(seq_length,input_dims,))
    model1_outputs = Input(shape=(output_dims,))
    
    net1 = TimeDistributed(Dense(n_hidden))(model1_inputs)
    net1 = LSTM(output_dims, return_sequences=True)(net1)
    net1 = LSTM(output_dims, return_sequences=False)(net1)
    net1 = Dense(output_dims, activation='relu')(net1)
    model1_outputs = net1
    
    model1 = Model(inputs=model1_inputs, outputs = model1_outputs, name='model1')
    
    ## Fit the model
    model1.summary()
    
    
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_17 (InputLayer)        (None, 15, 10)            0         
    _________________________________________________________________
    time_distributed_3 (TimeDist (None, 15, 10)            110       
    _________________________________________________________________
    lstm_18 (LSTM)               (None, 15, 8)             608       
    _________________________________________________________________
    lstm_19 (LSTM)               (None, 8)                 544       
    _________________________________________________________________
    dense_19 (Dense)             (None, 8)                 72        
    =================================================================