如何在TensorFlow

时间:2016-11-17 03:40:22

标签: python tensorflow recurrent-neural-network

我想实现像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模型。

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

我哪里出错了?

感谢您的回答。

更新: 我发现原因可能是' tf.nn.rnn_cell.DropoutWrapper'当我删除drop out包装器时,隐藏的向量是相同的,当我添加drop out包装器时,这些向量会变得不同。

所以,新问题是:

如何修复掉落的矢量部分' ?通过设置种子'参数?

培训DSSM时,我应该修复辍学行动吗?

1 个答案:

答案 0 :(得分:1)

如果构造代码以使用tf.contrib.rnn.DropoutWrapper,则可以在包装器中设置 private void txtBoxDiscount_TextChanged(object sender, TextChangedEventArgs e) { int discount = 0; if (!Int32.TryParse(txtBoxDiscount.Text, out discount)) { // Do something else } else if (inv.TotalAllItems > discount) { ,这会导致在所有步骤中使用相同的丢失掩码,即丢失掩码将保持不变。这就是你想要的吗?

variational_recurrent=True中设置seed参数只会确保每次运行该种子时都获得相同的丢失掩码序列。这并不意味着丢失掩码将常量,只是在特定的迭代中你总是会看到相同的丢失掩码。每次迭代时掩码都会不同。