神经网络为所有输入产生类似的模式

时间:2017-04-22 18:45:33

标签: machine-learning neural-network deep-learning keras

我正在尝试在Keras训练关于时间序列数据的ANN。我有三个数据向量分为滚动窗口序列(即向量l)。

np.array([l[i:i+window_size] for i in range( len(l) - window_size)])

目标矢量类似地加窗,因此神经网络输出是下一个window_size个时间步数的目标矢量的预测。所有数据均使用最小 - 最大缩放器进行标准化。它以shape =(nb_samples,window_size,3)的形式输入神经网络。这是3个输入向量的图。

input vector plots

我设法从ANN中获得的唯一输出是以下情节。蓝色的目标矢量,红色的预测(绘图被放大以使预测模式清晰可见)。以window_size间隔绘制预测向量,因此每个重复模式是来自网络的一个预测。 enter image description here

我尝试了许多不同的模型架构,时代数,激活功能,短网和胖网,瘦,高。这是我现在的那个(它有一点点)。

Conv1D(64,4, input_shape=(None,3)) ->
Conv1d(32,4) -> 
Dropout(24) -> 
LSTM(32) ->
Dense(window_size)

但是我尝试的任何东西都不会影响神经网络输出这个重复的模式。我一定是对Keras的时间序列或LSTM有些误解。但是我在这一点上非常失败,所以非常感谢任何帮助。我在这个存储库中附上了完整的代码。

https://github.com/jaybutera/dat-toy

1 个答案:

答案 0 :(得分:1)

我玩了一些你的代码,我想我有一些建议让你走上正轨。代码似乎与您的图表不完全匹配,但我认为您从那时起已经调整了一下。无论如何,有两个主要问题:

  1. 最大的问题在于您的数据准备步骤。你基本上有数据形状向后,因为你有一个X的输入时间步和Y的时间序列。你的输入形状是(18830,1,8),当你真正想要的是(18830,30,8)这样就可以将完整的30个步骤输入LSTM。否则,LSTM仅在一个时间步上运行,并没有真正有用。要解决此问题,我更改了common.py中的行

    X = X.reshape(X.shape[0], 1, X.shape[1])

    X = windowfy(X, winsize)

    同样地,输出数据应该只有1个值,这是我从绘图函数中收集到的目标。肯定会有一些情况需要预测整个时间序列,但我不知道在这种情况下这是否是您想要的。我更改了Y_train以使用fuels而不是fuels_w,因此它只需要预测时间序列的一个步骤。

  2. 对于这个简单的网络架构,100个时期的培训可能太过分了。在某些情况下,当我运行它时,看起来有一些过度拟合。观察网络损失的减少,似乎只需要3-4个时代。

  3. 以下是我提到的调整后3个训练时期后的预测图。这不是一个很好的预测,但它现在看起来至少在正确的轨道上。祝你好运! Predictions after three epochs

    编辑:预测多个输出时间步长的示例:

    from sklearn import datasets, preprocessing
    import numpy as np
    from scipy import stats
    from keras import models, layers
    
    INPUT_WINDOW = 10
    OUTPUT_WINDOW = 5  # Predict 5 steps of the output variable.
    # Randomly generate some regression data (not true sequential data; samples are independent).
    np.random.seed(11798)
    X, y = datasets.make_regression(n_samples=1000, n_features=4, noise=.1)
    # Rescale 0-1 and convert into windowed sequences.
    X = preprocessing.MinMaxScaler().fit_transform(X)
    y = preprocessing.MinMaxScaler().fit_transform(y.reshape(-1, 1))
    X = np.array([X[i:i + INPUT_WINDOW] for i in range(len(X) - INPUT_WINDOW)])
    y = np.array([y[i:i + OUTPUT_WINDOW] for i in range(INPUT_WINDOW - OUTPUT_WINDOW,
                                                        len(y) - OUTPUT_WINDOW)])
    print(np.shape(X))  # (990, 10, 4) - Ten timesteps of four features
    print(np.shape(y))  # (990, 5, 1)  - Five timesteps of one features
    
    # Construct a simple model predicting output sequences.
    m = models.Sequential()
    m.add(layers.LSTM(20, activation='relu', return_sequences=True, input_shape=(INPUT_WINDOW, 4)))
    m.add(layers.LSTM(20, activation='relu'))
    m.add(layers.RepeatVector(OUTPUT_WINDOW))
    m.add(layers.LSTM(20, activation='relu', return_sequences=True))
    m.add(layers.wrappers.TimeDistributed(layers.Dense(1, activation='sigmoid')))
    print(m.summary())
    
    m.compile(optimizer='adam', loss='mse')
    m.fit(X[:800], y[:800], batch_size=10, epochs=60)  # Train on first 800 sequences.
    preds = m.predict(X[800:], batch_size=10)  # Predict the remaining sequences.
    print('Prediction:\n' + str(preds[0]))
    print('Actual:\n' + str(y[800]))
    # Correlation should be around r = .98, essentially perfect.
    print('Correlation: ' + str(stats.pearsonr(y[800:].flatten(), preds.flatten())[0]))