LSTMStateTuple与Tensorflow中RNN的cell.zero_state()

时间:2017-04-03 19:30:12

标签: machine-learning tensorflow deep-learning

我很担心在Tensorflow中使用RNN的初始状态张量的正确方法是什么。在使用LSTMStateTuplecell.zero_state的turtorial之间几乎有50/50的分割。

两者是否相同?如果是这样,为什么有两种方式?

在一个示例中,他们使用cell.zero_state()来设置初始状态,而在另一个示例中,他们使用LSTMStateTuple

为什么有两种方法?何时更喜欢这一个?设置state_is_tuple时,您只能使用cell.zero_state()吗?如果是,<productInfoRequest> <CheckIn>false</CheckIn> <timeStamp>2016-11-02T15:49:57.337-05:00</timeStamp> <foodoInfo> <Country>USA</Country> <Currency>USD</Currency> </foodoInfo> <productInfo> <itemNo>1</itemNo> <itemName>Sample</itemName> </productInfo> <productInfo> <itemNo>2</itemNo> <itemName>Sample</itemName> </productInfo> <productInfo> <itemNo>3</itemNo> <itemName>Sample</itemName> </productInfo> <productInfo> <itemNo>4</itemNo> <itemName>Sample</itemName> </productInfo> </productInfoRequest> 不再有效吗?

1 个答案:

答案 0 :(得分:9)

两者是不同的东西。 state_is_tuple用于LSTM单元,因为LSTM单元的状态是元组。 cell.zero_state是所有RNN小区的初始化状态。

您通常会更喜欢cell.zero_state函数,因为它会根据state_is_tuple是否为真来初始化所需的状态类。

请参阅this 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?

当您使用自定义值(由培训师传递)初始化您的状态时,您将需要使用LSTMStateTuplecell.zero_state()将返回状态,其中所有值均等于0.0。

如果您希望在批次之间保持状态,则必须在每批次之后保持状态,并将其添加到下一批feed_dict

有关LSTM状态为元组的原因的解释,请参阅this