【问题标题】:Slice error when using MultiRNNCell使用 MultiRNNCell 时出现切片错误
【发布时间】:2016-04-01 17:17:02
【问题描述】:

我正在使用来自tensorflow.models.rnn.rnn_cell 的 MultiRNNCell。这就是我的 MultiRNNCell 的声明方式

代码:

e_cell = rnn_cell.GRUCell(self.rnn_size)

e_cell = rnn_cell.MultiRNNCell([e_cell] * 2)

稍后我从 seq2seq.embedding_rnn_decoder 内部使用它,如下所示

ouputs, mem_states = seq2seq.embedding_rnn_decoder(decoder_inputs, enc_state, e_cell, vocab_size, output_projection=(W, b), feed_previous=False)#

执行此操作时出现以下错误

错误:

tensorflow.python.framework.errors.InvalidArgumentError: Expected size[1] in [0, 0], but got 1024 [[Node: en/embedding_rnn_decoder_1/rnn_decoder/MultiRNNCell/Cell1/Slice = Slice[Index=DT_INT32, T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](Sigmoid_2, en/embedding_rnn_decoder_1/rnn_decoder/MultiRNNCell/Cell1/Slice/begin, en/embedding_rnn_decoder_1/rnn_decoder/MultiRNNCell/Cell1/Slice/size)]] [[Node: en/embedding_rnn_decoder/rnn_decoder/loop_function_17/StopGradient/_1230 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_11541_en/embedding_rnn_decoder/rnn_decoder/loop_function_17/StopGradient", tensor_type=DT_INT64, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

有没有人看到类似的错误?有什么指点吗?

【问题讨论】:

标签: python tensorflow


【解决方案1】:

在 embedding_rnn_decoder 中似乎是一个无效参数。 也许尝试改变 enc_state:

ouputs, mem_states = seq2seq.embedding_rnn_decoder(decoder_inputs, enc_state[-1], e_cell, vocab_size, output_projection=(W, b), feed_previous=False)

【讨论】:

    【解决方案2】:

    我遇到了和你类似的问题。{tensorflow.python.framework.errors.InvalidArgumentError: Expected size[1] in [0, 0], but got 40}
    我也用rnn_cell.GRUCell(self.rnn_size) 我想分享我的经验,也许它会有所帮助。 这是我修复它的方法。 我想使用 gru 单元和基本的 rnn 单元,所以我改编了其他为 lstm 单元编码的程序。 lstm 和 GRU/BasicRnn 的区别在于 state_size。 这里是 lstm 单元def state_size(self):return 2 * self._num_units 这是 GRU/BasicRnn 单元格def state_size(self):return self._num_units 因此矩阵的形状不同,张量不适合op。我建议你检查你的代码是否包含tf.slice

    【讨论】:

    • 您能否改进答案的格式?很难阅读
    【解决方案3】:

    embedding_rnn_seq2seq (Tensorflow v0.9.0) 也有类似的问题。我切换了输入以使用 embedding_rnn_decoder 运行,并且能够使用这些输入运行会话。

    enc_inp = [tf.placeholder(tf.int32, shape=(batch_size,),
               name="inp%i" % t) for t in range(seq_length)]
    
    labels = [tf.placeholder(tf.int32, shape=(batch_size,),
               name="labels%i" % t) for t in range(seq_length)]
    
    weights = [tf.ones_like(labels_t, dtype=tf.float32) for labels_t in labels]
    
    dec_inp = ([tf.zeros_like(enc_inp[0], dtype=np.int32, name="GO")] + enc_inp[:-1])
    
    prev_mem = tf.zeros((batch_size, memory_dim))
    
    cell = rnn_cell.GRUCell(memory_dim)
    cell = rnn_cell.MultiRNNCell([cell]*2)
    
    dec_outputs, mem_states = seq2seq.embedding_rnn_decoder(dec_inp, prev_mem, 
    cell, n_x, n_y,feed_previous=True)
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      出现此问题是因为您已将 GRU 单元加倍,但您的初始向量并未加倍。 如果您的 initial_vector 大小为 [batch_size,50]。

      那么initial_vector = tf.concat(1,[initial_vector,initial_vector])

      现在将这个作为初始向量输入到解码器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 2023-03-15
        • 2018-02-05
        • 2015-02-23
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多