如何在TensorFlow中重复使用RNN

5

我希望实现类似DSSM(深度语义相似性模型)的模型。

我想训练一个RNN模型,并使用该模型获取三个不同输入的隐藏向量,然后使用这些隐藏向量计算损失函数。

我尝试在变量范围内编写具有reuse = None的代码,例如:

gru_cell = tf.nn.rnn_cell.GRUCell(size)
gru_cell = tf.nn.rnn_cell.DropoutWrapper(gru_cell,output_keep_prob=0.5)
cell = tf.nn.rnn_cell.MultiRNNCell([gru_cell] * 2, state_is_tuple=True)

embedding = tf.get_variable("embedding", [vocab_size, wordvec_size])
inputs = tf.nn.embedding_lookup(embedding, self._input_data)
inputs = tf.nn.dropout(inputs, 0.5)
with tf.variable_scope("rnn"):
    _, self._states_2 = rnn_states_2[config.num_layers-1] = tf.nn.dynamic_rnn(cell, inputs, sequence_length=self.lengths, dtype=tf.float32)
    self._states_1 = rnn_states_1[config.num_layers-1]
with tf.variable_scope("rnn", reuse=True):
    _, rnn_states_2 = tf.nn.dynamic_rnn(cell,inputs,sequence_length=self.lengths,dtype=tf.float32)
    self._states_2 = rnn_states_2[config.num_layers-1]

我使用相同的输入并重复使用RNN模型,但当我打印出 ‘self_states_1’ 和 ‘self_states_2’ 时,这两个向量是不同的。

我使用with tf.variable_scope("rnn", reuse=True):计算 'rnn_states_2',因为我想使用和‘rnn_states_1’相同的RNN模型。

但是为什么我在相同的inputs和相同的模型下却得到了不同的隐藏向量?

我哪里做错了?

谢谢您的回答。

更新: 我发现原因可能是 'tf.nn.rnn_cell.DropoutWrapper',当我移除dropout wrapper时,隐藏向量是相同的,而当我添加dropout wrapper时,这些向量变得不同了。

那么新的问题是:

如何修复被“dropout”的向量部分?通过设置“seed”参数吗?

在训练DSSM时,我应该固定drop out行为吗?

1个回答

1
如果你使用tf.contrib.rnn.DropoutWrapper来构建你的代码,你可以在包装器中设置variational_recurrent=True,这会导致相同的dropout掩码在所有步骤中被使用,即dropout掩码将是常数。这是你想要的吗?
tf.nn.dropout中设置seed参数只能确保每次运行时都获得相同的dropout掩码序列。这并不意味着dropout掩码将是常数,只是你在特定迭代中总是看到相同的dropout掩码。每次迭代的掩码都会不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接