我将tensorflow-GPU更新为1.2.1后遇到错误。 我使用了编码 - 解码结构,编码代码的一部分是:
output, state = tf.nn.dynamic_rnn(cell=self.cell,
inputs=logits,
sequence_length=self.en_len,
dtype=tf.float32,
scope='enco')
,解码为:
output, _ = tf.nn.dynamic_rnn(cell=self.cell,
inputs=deco_inputs,
sequence_length=self.de_len,
initial_state=init_state,
dtype=tf.float32,
scope='deco')
然后,我收到了错误。 隐藏单位数为256,嵌入大小为100,检查错误,我删除了multiRNN并使用了单个GRU单元格:
RNN = tf.contrib.rnn.GRUCell(HIDDEN_UNITs)
以下是完整错误:
ValueError: Trying to share variable enco/gru_cell/gates/kernel, but specified shape (512, 512) and found shape (356, 512).
PS。版本1.0.1中从未发生此错误。
答案 0 :(得分:3)
此问题通常仅在您使用MultiRNNCell
时出现,但在您的情况下,即使使用单个单元格也会出现此问题,因为您有两个 RNN。简而言之,从TensorFlow 1.2开始,RNN小区不应重用于RNN的不同层或不同的RNN。如果要为每个RNN使用单个GRUCell
,则需要调用构造函数两次以使两个不同的实例通过。如果您使用的是MultiRNNCell
,那么您应该拥有其中的两个,但每个层上每个层都有GRUCell
个实例。所以:
# This is doubly wrong!
# self.cell = tf.contrib.rnn.MultiRNNCell(
# [tf.contrib.rnn.GRUCell(HIDDEN_UNITs)] * NUM_LAYERS)
# Also wrong
# self.cell_encoder = tf.contrib.rnn.MultiRNNCell(
# [tf.contrib.rnn.GRUCell(HIDDEN_UNITs)] * NUM_LAYERS)
# self.cell_decoder = tf.contrib.rnn.MultiRNNCell(
# [tf.contrib.rnn.GRUCell(HIDDEN_UNITs)] * NUM_LAYERS)
# Still wrong
# self.cell = tf.contrib.rnn.MultiRNNCell(
# [tf.contrib.rnn.GRUCell(HIDDEN_UNITs) for _ in range(NUM_LAYERS)])
# This is the way to go!
self.cell_encoder = tf.contrib.rnn.MultiRNNCell(
[tf.contrib.rnn.GRUCell(HIDDEN_UNITs) for _ in range(NUM_LAYERS)])
self.cell_decoder = tf.contrib.rnn.MultiRNNCell(
[tf.contrib.rnn.GRUCell(HIDDEN_UNITs) for _ in range(NUM_LAYERS)])
然后你建立你的RNN:
output_encoder, state_encoder = \
tf.nn.dynamic_rnn(cell=self.cell_encoder,
inputs=logits,
sequence_length=self.en_len,
dtype=tf.float32,
scope='enco')
output_decoder, _ = tf.nn.dynamic_rnn(cell=self.cell_decoder,
inputs=deco_inputs,
sequence_length=self.de_len,
initial_state=init_state,
dtype=tf.float32,
scope='deco')