我试图了解我GRUCell
和dynamic_rnn
的错误,因为从TF版本1.0.0升级到1.2.0后性能急剧下降
旧环境是Ubuntu,Python版本2.7,TF版本1.0.0和新环境是Ubuntu,Python版本3.5.3,TF版本1.2.0
我在版本1.2的发行说明中看到,多层RNN的实现方式有一些变化,对1.1版本之前的版本有一些影响,所以我想我会给它一试。
旧代码的相关部分过去看起来像这样:
cell = tf.nn.rnn_cell.GRUCell(CELL_SIZE)
cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=keep_prob)
multicell = tf.nn.rnn_cell.MultiRNNCell([cell]*N_LAYERS, state_is_tuple=False)
output, state = tf.nn.dynamic_rnn(multicell, X, dtype=tf.float32, initial_state=in_state)
preds = tf.contrib.layers.linear(output, 1)
loss = tf.reduce_mean(tf.square(preds - Y_))
train_step = tf.train.AdamOptimizer(LR).minimize(loss)
preds = tf.reshape(preds, [batchsize, -1], name='preds')
中看到了
块引用 RNNCell对象现在是tf.layers.Layer的子类。 TensorFlow 1.1版本中描述的严格性已经消失:第一次使用RNNCell时,它会缓存其范围。将来RNNCell的所有使用都将重用同一范围内的变量。这是TensorFlow版本中的RNNCells行为的重大变化< = 1.0.1。 TensorFlow 1.1已经进行了检查,以确保旧代码能够正确地使用新语义;此版本允许更灵活地使用RNNCell,但如果使用TensorFlow< = 1.0.1的代码,则可能导致细微错误。例如,写入:MultiRNNCell([lstm] * 5)现在将构建一个5层LSTM堆栈,其中每个层共享相同的参数。要使用各自的参数获得5个图层,请写入:MultiRNNCell([LSTMCell(...)for _ in range(5)])。如果不确定,首先用TF 1.1测试你的代码;确保它不会引起任何错误,然后升级到TF 1.2。
所以,我尝试使用上面概述的旧代码和升级版本,按照这些说明的行,如下所示:
cells = [tf.nn.rnn_cell.GRUCell(INTERNALSIZE) for _ in range(NLAYERS)]
dropcells = [tf.contrib.rnn.DropoutWrapper(cell,input_keep_prob=keep_prob) for cell in cells]
multicell = tf.nn.rnn_cell.MultiRNNCell(dropcells, state_is_tuple=False)
multicell = tf.contrib.rnn.DropoutWrapper(multicell, output_keep_prob=keep_prob)
output, state = tf.nn.dynamic_rnn(multicell, X, dtype=tf.float32, initial_state=in_state)
preds = tf.contrib.layers.linear(Yr, 1)
loss = tf.reduce_mean(tf.square(preds - Y_))
train_step = tf.train.AdamOptimizer(LR).minimize(loss)
preds = tf.reshape(preds, [batchsize, -1], name='preds')
但是,旧版本和较新版本的代码在验证和预测期间产生的结果远远低于1.0.0版本下的旧代码。有趣的是,无论如何我只用1层就达到了最好的效果,所以即使重量分配/非共享没有做好,我认为这不应该是重要的只有一层?
我试图了解我是否偶然发现旧的(好的)结果并且无论如何都没有正常工作,或者我需要更改其他内容才能在1.2版本下获得相同的旧结果希望能够通过不跨多层共享权重来改善这些结果吗?