Neural network 基于小波神经网络的时间序列预测

Neural network 基于小波神经网络的时间序列预测,neural-network,time-series,tensorflow2.0,wavelet-transform,Neural Network,Time Series,Tensorflow2.0,Wavelet Transform,我正在尝试实现一个小波神经网络来预测时间序列的未来值。 具体而言,我正在尝试实施以下两篇论文: 我的信号周期性很好 由于之前的结果不好,我通过卷积一个大小为3的中值滤波器对其进行预处理 然后,我使用python的pywt.swt将其分解为平稳的小波分量 然后我将所有这些小波传递给tensorflow中的ANN:如果我的信号长度为10000,我有5个小波分量,我的神经网络输入是一个形状为[batch,10000/批次,5]的张量,输出是[batch,10000/批次,1];1为接下来10

我正在尝试实现一个小波神经网络来预测时间序列的未来值。 具体而言,我正在尝试实施以下两篇论文:

我的信号周期性很好

  • 由于之前的结果不好,我通过卷积一个大小为3的中值滤波器对其进行预处理
  • 然后,我使用python的pywt.swt将其分解为平稳的小波分量
  • 然后我将所有这些小波传递给tensorflow中的ANN:如果我的信号长度为10000,我有5个小波分量,我的神经网络输入是一个形状为[batch,10000/批次,5]的张量,输出是[batch,10000/批次,1];1为接下来10000个步骤中每个步骤的1d预测值
我的问题是:无论我使用什么样的神经网络,预测结果都与真值相差甚远。在下图中,蓝线是我的真值(需要预测的值),橙色是模型的实际输出

我首先尝试使用完全连接的密集网络进行简单操作:4层深,层大小不同:

   def DenseNN():
   activation='relu'
   return tf.keras.Sequential([
          tf.keras.layers.BatchNormalization(),
          tf.keras.layers.Dense(32, activation=activation,kernel_initializer='GlorotUniform', use_bias=True),
          tf.keras.layers.Dropout(0.1),
          tf.keras.layers.Dense(16, activation=activation,kernel_initializer='GlorotUniform', use_bias=True),
          tf.keras.layers.Dropout(0.1),
          tf.keras.layers.BatchNormalization(),
          tf.keras.layers.Dense(32, activation=activation,kernel_initializer='GlorotUniform', use_bias=True),
          tf.keras.layers.Dropout(0.1),
          tf.keras.layers.Dense(8, activation=activation,kernel_initializer='GlorotUniform', use_bias=True),
          tf.keras.layers.Dropout(0.1),
          tf.keras.layers.Dense(1, activation=activation,kernel_initializer='GlorotUniform', use_bias=True)
          ])

   model.compile(loss=tf.losses.MeanSquaredError(),
                 optimizer=tf.optimizers.Nadam(learning_rate=0.001),
                 metrics=[tf.metrics.RootMeanSquaredError()])
结果不是很好。5个时代后,它停止了学习,开始过度适应

我想,没什么大不了的,也许密度不够复杂,不足以了解我的信号的微妙之处,经过中值滤波后,它看起来一点也不可怕:所以我尝试了其他方法:LSTM,甚至写了一个ResNet来尝试获得更好的拟合:

def LSTM():
   return tf.keras.Sequential([
          tf.keras.layers.LSTM(units=8,activation='tanh',recurrent_activation='sigmoid',use_bias=True,kernel_initializer='glorot_uniform',return_sequences=True,dropout=0.2),
          tf.keras.layers.Dense(units=32,activation='linear',use_bias=True,kernel_initializer='glorot_uniform'),
          tf.keras.layers.Dropout(0.2),
          tf.keras.layers.Dense(units=1,activation='linear',use_bias=True,kernel_initializer='glorot_uniform')
          ])
同样的事情:尽管在内核初始化器、激活(selu、relu、elu、tanh、sigmoid等)上进行了多次尝试,但拟合是可怕的

和我的resnet(每个块是3 Conv1D,主路径与快捷方式合并):

反正

我的问题是,为什么所有这些模型,从最简单的到更复杂的,都在一个看起来绝对可以预测的信号上苦苦挣扎。 我从这两篇论文中得到灵感的时间序列,如果不是完全随机混乱的话,看起来周期性要小得多。然而,他们的模型却非常适合

有没有人能给我一个外观,并给我一些关于我可能缺少的安的机械师的建议,这可以解释为什么我的预测如此糟糕? 不幸的是,由于法律原因,我无法共享我的数据。 提前感谢您的宝贵意见

X_input = Input(input_shape)

#stage 1
X = block_unit(X_input,filter=input_shape[-1],kernel=5,padding='same')
X = MaxPool1D()(X)

#stage 2
filts = [8,4,2]
ksize = 3
X = conv_block(X, filts,ksize)
X = id_block(X, filts,ksize)
X = id_block(X, filts,ksize)

X = conv_block(X, filts,ksize)
X = id_block(X, filts,ksize)
X = id_block(X, filts,ksize)
X = id_block(X, filts,ksize)
X = id_block(X, filts,ksize)

X = conv_block(X, filts,ksize)
X = id_block(X, filts,ksize)
X = id_block(X, filts,ksize)

X = AveragePooling1D(2)(X)
X = Flatten()(X)
X = Dense(nb_future_predictions, activation='linear',use_bias = True, kernel_initializer = glorot_uniform(seed=0))(X)
X = Reshape([nb_future_predictions, 1]) (X)