训练LSTM生成正弦曲线-梯度下降无法将输出稳定在我想要的位置

问题描述

我正在尝试生成this form的多对多RNN。这是training data的结构。

每个数据样本包含4000个时间步长。输入是阶跃信号,其幅度确定要生成的正​​弦波的频率。输出是该频率下的正弦波。我希望模型使用其“内存”中的最后n个输入在时间n处生成输出

该模型是使用Keras顺序API构建的。这是它的代码

time_samples = 4000

model = tf.keras.Sequential()

model.add(tf.keras.layers.LSTM(20,batch_input_shape = (1,time_samples,1),kernel_initializer = 'random_uniform',bias_initializer = 'random_uniform',return_sequences = True,activation = 'tanh'))

model.add(tf.keras.layers.Timedistributed(Dense(1,bias_initializer = 'random_uniform')))

model.compile(loss = 'mse',optimizer = 'adam')

epochs = 50

history = model.fit(x_train,y_train,epochs = epochs,batch_size = 1,verbose = 2,shuffle = False)

如果我正确理解它,则Timedistributed层将最终Dense层的相同权重应用于时间步中的每个输出。 LSTM将返回每个时间步的输出,而不是最终时间步的输出,因为我要它返回序列。

这个想法是,在每个纪元中,我每次从批次中一次抽取上述5个样本中的一个样本(每个纪元5个批次),然后对其进行训练。因此,在每个时期,权重都有5次更新。问题在于梯度下降平台after around the 10th epoch;它正在学习寻找正弦曲线的平均点并在那里绘制一条恒定线(see the green lines here)。

不幸的是,我对模型为什么要这么做感到困惑。我认为我不应该使用状态模型-批次之间的样本彼此独立。它与我的初始体重和偏差分布或MSE损失函数有关吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)