2017-08-02 23 views
1

我遇到错误我更新我的tensorflow-GPU 1.2.1之后。 我用编码 - 解码结构,编码的代码部分是:ValueError异常:试图共享可变ENCO/gru_cell /门/内核,但指定形状(512,512),并发现形状(356,512)

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

然后,我接收到错误。隐藏单元 Num是256,embeding大小为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

1)你仍然可以看到这个问题,当你不使用MultiRNN? 2)请在你创建'self.cell'的地方显示代码。 – jdehesa

+0

1)是的,为了检查这个错误,我使用了单个RNNcell,但是错误也存在。 2)我粘贴在上面的代码。 – minorfox

回答

3

当您使用MultiRNNCell这个问题通常只会出现,但在你的情况下,它甚至有一个单细胞,因为你有 RNNs发生。简而言之,从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)]) 

然后你建立你RNNs:

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

谢谢你的回答。我发现当我分别使用两个单元时,错误消失,但我不确定它是否正确。这意味着单元参数不再共享,但在版本1.0.1中,单元的参数是共享的。我很困惑。 – minorfox

+0

@minorfox所以你的意思是你想要两个RNN实际分享权重?我不确定我是否明白这是多么有道理......无论如何,你将不得不扭转图层并将权重转置为合适的大小,并且我仍然认为编码权重应该没有任何理由是一样的解码的... – jdehesa

+0

我有这个问题,只是因为在我的最后一个版本是没​​有问题的,当我使用相同的小区中都RNNs,但在1.2.1版本,没有工作,所以我请考虑在V1.0.1中使用的共享参数。也许这是一种误解,哈哈哈... – minorfox

相关问题