Tensorflow:我的rnn总是输出相同的值,rnn的权重未受训练

时间:2019-03-15 07:42:37

标签: tensorflow recurrent-neural-network

我使用张量流实现了一个简单的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的权重和偏见会不断变化。因此,在训练中,我得到了这样的预测:

开头:

enter image description here

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]

一段时间后:

enter image description here

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的数据进行测试。这次,我的模型学习了正确的结果。

开头:

enter image description here

最后:

enter image description here

我尝试过:

  1. 添加BasicRNNCell和Dense的更多层
  2. 将rnn个隐藏单元数(n_units)增加到128
  3. 将learning_rate降低至1e-10
  4. 将时间步长增加到60

它们都不起作用。

所以,我的问题是:

  1. 是因为我的模型太简单了吗?但是我认为我的数据趋势学习起来并不那么复杂。至少像 y = ax + b 这样的东西会产生比 y = b 更小的损耗。
  2. 什么可能导致这些结果?
  3. 还是应该继续进行调试?
  4. 现在,我可能没有完全实现BasicRNNCell的两倍,用户应该实现它的某些功能吗?我以前没有使用过Tensorflow。

1 个答案:

答案 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

enter image description here