我对在Tensorflow中使用RNN的初始状态张量的正确方法感到困惑.在使用LSTMStateTuple或cell.zero_state的turtorial之间几乎有50/50的分割.
这两个是一样的吗?如果是这样,为什么有两种方法呢?
在一个示例中,它们用于tf.nn.rnn_cell.LSTMStateTuple
设置初始状态,而在另一个示例中,它们使用cell.zero_state()
.
为什么有两种方法?何时更喜欢这一个?你可以只LSTMStateTuple
在你设置时使用state_is_tuple
吗?如果是这样,cell.zero_state()
不再有用吗?
这两者是不同的东西.state_is_tuple
用于LSTM细胞,因为LSTM细胞的状态是元组.cell.zero_state
是所有RNN小区的状态的初始化器.
您通常会更喜欢cell.zero_state
函数,因为它将根据是否state_is_tuple
为真来初始化所需的状态类.
请参阅此 GitHub问题,您可以在其中看到cell.zero_state
建议的 - "在单元对象上使用zero_state函数".
您可能想要的另一个原因cell.zero_state
是因为它不知道单元格的类型(LSTM,GRU,RNN),您可以这样做:
if type == 'GRU': cell = BasicGRUCell else: cell = BasicLSTMCell(state_is_tuple=True) init_state = cell.zero_state(batch_size)
初始状态设置好了.
LSTMStateTuple
将仅适用于具有状态作为元组的单元格.
何时使用LSTMStateTuple?
LSTMStateTuple
当您使用自定义值(由培训师传递)初始化您的状态时,您将需要使用.cell.zero_state()
将返回所有值等于0.0的状态.
如果您希望在批次之间保持状态,则必须在每批次之后获取它并将其添加到feed_dict
下一批次.
见这对于为什么LSTM状态是一个元组的解释.