gpt4 book ai didi

python - 如何在 TensorFlow 中重用 RNN

转载 作者:太空狗 更新时间:2023-10-30 01:32:32 24 4
gpt4 key购买 nike

我想实现像 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 wrapper 时,隐藏向量是相同的,当我添加 drop out wrapper 时,这些向量变得不同。

所以,新的问题是:

如何修复被“丢弃”的向量部分?通过设置“种子”参数?

训练 DSSM 时,我应该修复 drop out Action 吗?

最佳答案

如果您构建代码以使用 tf.contrib.rnn.DropoutWrapper ,您可以在包装器中设置 variational_recurrent=True,这会导致在所有步骤中使用相同的 dropout mask,即 dropout mask 将保持不变。这是你想要的吗?

tf.nn.dropout 中设置 seed 参数只会确保每次使用该种子运行时都获得相同的 dropout 掩码序列。这并不意味着 dropout mask 将恒定,只是您将始终在特定迭代中看到相同的 dropout mask。每次迭代的掩码都会不同。

关于python - 如何在 TensorFlow 中重用 RNN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40646342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com