[英]How to reuse RNN in TensorFlow
我想实现像DSSM(Deep Semantic Similarity Model)这样的模型。
我想训练一个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模型。
但为什么我得到具有相同输入和相同模型的不同隐藏向量?
我哪里做错了?
谢谢你的回答。
更新:我发现原因可能是'tf.nn.rnn_cell.DropoutWrapper',当我删除drop out包装器时,隐藏的向量是相同的,当我添加drop out包装器时,这些向量变得不同。
所以,新的问题是:
如何修复被“退出”的矢量部分? 通过设置'seed'参数?
在培训DSSM时,我应该修复辍学行为吗?
如果构造代码以使用tf.contrib.rnn.DropoutWrapper
,则可以在包装器中设置variational_recurrent=True
,这会导致在所有步骤中使用相同的丢失掩码,即丢失掩码将保持不变。 那是你要的吗?
在tf.nn.dropout
设置seed
参数只会确保每次使用该种子时都获得相同的丢失掩码序列。 这并不意味着丢失掩码将是恒定的 ,只是在特定的迭代中你总是会看到相同的丢失掩码。 每次迭代时掩码都是不同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.