2016-11-17 112 views
5

我想实现一个类似DSSM(深度语义相似模型)的模型。如何在TensorFlow中重用RNN

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

我尝试代码重用的可变范围=无像:

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模型。

但是为什么我用相同的输入和相同的模型得到不同的隐藏向量?

我哪里出错了?

感谢您的回答。

更新: 我觉得原因可能是“tf.nn.rnn_cell.DropoutWrapper”,当我删除辍学包装,隐藏的载体是一样的,当我添加辍学的包装,这些载体变得不同。

那么,新的问题是:

如何解决这是“辍学”向量的一部分吗?通过设置'seed'参数?

在培训DSSM时,我应该修复退出操作吗?

回答

1

如果你组织你的代码中使用tf.contrib.rnn.DropoutWrapper,您可以设置variational_recurrent=True在您的包装,这将导致在所有步骤中使用相同的辍学面膜,即辍学面具将是恒定的。那是你要的吗?

tf.nn.dropout中设置seed参数将确保您每次运行该种子时都会得到相同的漏失掩码序列。这并不意味着辍学掩码将不变,只是你会在特定的迭代中看到相同的退出掩码。每次迭代的面具都会有所不同。