我试图进行多步回归,并使用输出层:
LSTM(1,激活=‘线性’,return_sequences=True)
这是否实现这个目标的错误方式?我应该使用TimeDistributed(稠密(1))作为输出吗?如果是,为什么?
发布于 2019-12-13 13:43:01
我不认为使用线性(即:无)激活有什么特别的优势。神经网络的力量在于它们在数据中“学习”非线性模式的能力。此外,Tanh和sigmoid门被认为控制着信息流在时间上的流动,它们是为此而设计的,我个人会谨慎地改变这一点。
如果您想进行多步回归,您有许多选项,但最高级的体系结构是序列到序列,即seq2seq:
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Bidirectional, LSTM
from tensorflow.keras.layers import RepeatVector, TimeDistributed
from tensorflow.keras.layers import Dense
from tensorflow.keras.activations import elu, relu
seq2seq = Sequential([
Bidirectional(LSTM(len_input), input_shape = (len_input, no_vars)),
RepeatVector(len_input),
Bidirectional(LSTM(len_input, return_sequences = True)),
TimeDistributed(Dense(hidden_size, activation = elu)),
TimeDistributed(Dense(1, activation = relu))
])其中len_input是输入序列的长度。输出是相同的序列,向前移动了许多步骤,相当于预测的长度。hidden_size是Dense()层的大小,这是完全可选的。
我使用了Bidirectional()包装器,但这也是可选的。并不是所有的任务都需要双LSTM,如果需要的话可以随时删除它.
RepeatVector()和TimeDistributed()层的(组合)作用是复制潜在的表示和如下的神经网络体系结构,用于重构输出序列所需的步骤数。RepeatVector()生成这种“乘法”,而TimeDistributed()则重复在每个重复信号上的应用,在实践中生成最终的序列。
输入和输出都必须是三维numpy形状数组:
(观察次数、输入序列长度、变量数)
Seq2seq模型训练困难(参数数目多,训练时间长),但其性能优于其它的神经网络结构。目前,任何最先进的RNN都是某种seq2seq.
https://datascience.stackexchange.com/questions/64769
复制相似问题