【问题标题】:MultiRNN is not working with list of same BasicLSTM cellsMultiRNN 不适用于相同 BasicLSTM 单元的列表
【发布时间】:2018-11-11 16:30:11
【问题描述】:

(cell1, cell1) 用于MultiRNNCell 时,以下代码将失败:

import tensorflow as tf
cell1 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False, name = "cell1")
cell2 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False,name = "cell2")
multi = tf.contrib.rnn.MultiRNNCell([cell1, cell1] )
init = multi.zero_state(64, tf.float32)
output,state = multi(tf.ones([64,512]),init)

这段代码在哪里使用(cell1, cell2)。但是cell2cell1 是一样的:

import tensorflow as tf
cell1 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False, name = "cell1")
cell2 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False,name = "cell2")
multi = tf.contrib.rnn.MultiRNNCell([cell1, cell2] )
init = multi.zero_state(64, tf.float32)
output,state = multi(tf.ones([64,512]),init)

我可以知道这两个代码示例的区别吗?

一个错误是这样的:

ValueError:尺寸必须相等,但对于输入形状为 [64,256]、[640,512] 的“multi_rnn_cell/cell_0/cell1/MatMul_1”(操作:“MatMul”),尺寸必须是 256 和 640。

【问题讨论】:

    标签: python tensorflow machine-learning lstm recurrent-neural-network


    【解决方案1】:

    这是一个已知限制(例如讨论过的here)。问题是每个单元格实例都会为权重创建一个内部变量。此变量的维度由隐藏大小(在您的情况下为128)和此单元实例接收的输入大小(512)决定。当您多次使用同一个单元格时,您必须确保输入在所有情况下都相同。

    考虑您的示例代码:

    import tensorflow as tf
    cell1 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False, name = "cell1")
    cell2 = tf.contrib.rnn.BasicLSTMCell(128,reuse=False,name = "cell2")
    multi = tf.contrib.rnn.MultiRNNCell([cell1, cell1] )
    init = multi.zero_state(64, tf.float32)
    output,state = multi(tf.ones([64,512]),init)
    

    multi 中两个单元格的输入将是 [..., 640][..., 256],因为 640=512+128(该单元格接收来自前一个单元格以及来自输入序列的输入)。因此,它们内部的权重矩阵将是 [640, 512][256, 512]512 实际上是 128*4,而不是输入大小)。

    但是您使用的是同一个单元格实例! Tensorflow 尝试将其已有的矩阵与新输入匹配,但失败了。另一方面,当您使用不同的实例时,tensorflow 能够为不同的层实例化不同的矩阵并正确计算出形状。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      相关资源
      最近更新 更多