ValueError:尝试共享变量enco / gru_cell / gates / kernel,但是指定了shape(512,512)和找到的形状(356,512)

时间:2017-08-02 08:57:24

标签: tensorflow

我将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中从未发生此错误。

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')