我使用张量流实现了一个简单的RNN模型,以了解时间序列数据的可能趋势并预测未来值。但是,该模型在训练后总是产生相同的值。实际上,它得到的最佳模型是:
y = b。
RNN结构为:
InputLayer-> BasicRNNCell-> Dense-> OutputLayer
RNN代码:
def RNN(n_timesteps, n_input, n_output, n_units):
tf.reset_default_graph()
X = tf.placeholder(dtype=tf.float32, shape=[None, n_timesteps, n_input])
cells = [tf.contrib.rnn.BasicRNNCell(num_units=n_units)]
stacked_rnn = tf.contrib.rnn.MultiRNNCell(cells)
stacked_output, states = tf.nn.dynamic_rnn(stacked_rnn, X, dtype=tf.float32)
stacked_output = tf.layers.dense(stacked_output, n_output)
return X, stacked_output
在训练期间,n_timesteps = 1,n_input = 1,n_output = 1,n_units = 2,learning_rate = 0.0000001。损失由均方误差计算。
输入是连续几天的数据序列。输出是输入日期后的数据。
(也许这些设置不是很好。但是无论我如何更改它们,结果都几乎相同。因此,我只是将其设置为稍后显示)。
我发现这是因为没有训练BasicRNNCell的权重和偏见。他们从一开始就保持相同。而且只有Dense的权重和偏见会不断变化。因此,在训练中,我得到了这样的预测:
开头:
loss: 1433683500.0
rnn/multi_rnn_cell/cell_0/cell0/kernel:0 [KEEP UNCHANGED]
rnn/multi_rnn_cell/cell_0/cell0/bias:0 [KEEP UNCHANGED]
dense/kernel:0 [CHANGING]
dense/bias:0 [CHANGING]
一段时间后:
loss: 175372340.0
rnn/multi_rnn_cell/cell_0/cell0/kernel:0 [KEEP UNCHANGED]
rnn/multi_rnn_cell/cell_0/cell0/bias:0 [KEEP UNCHANGED]
dense/kernel:0 [CHANGING]
dense/bias:0 [CHANGING]
橙色线表示真实数据,蓝色线表示我的代码结果。通过训练,蓝线将不断上升,直到模型稳定消失为止。
所以我怀疑我是否执行错误,所以我生成了一组y = 10x + 5的数据进行测试。这次,我的模型学习了正确的结果。
开头:
最后:
我尝试过:
它们都不起作用。
所以,我的问题是:
答案 0 :(得分:1)
您的网络似乎不适合此类数据,或者从另一个角度来看,您的数据扩展性很差。在split_data
之后添加下面的4行,我得到某种学习行为,类似于带有a*x+b
情况的学习行为
data = read_data(work_dir, input_file)
plot_data(data)
input_data, output_data, n_batches = split_data(data, n_timesteps, n_input, n_output)
# scale input and output data
input_data = input_data-input_data[0]
input_data = input_data/np.max(input_data)*1000
output_data = output_data-output_data[0]
output_data = output_data/np.max(output_data)*1000