我很担心在Tensorflow中使用RNN的初始状态张量的正确方法是什么。在使用LSTMStateTuple或cell.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>
不再有效吗?
答案 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?
当您使用自定义值(由培训师传递)初始化您的状态时,您将需要使用LSTMStateTuple
。 cell.zero_state()
将返回状态,其中所有值均等于0.0。
如果您希望在批次之间保持状态,则必须在每批次之后保持状态,并将其添加到下一批feed_dict
。
有关LSTM状态为元组的原因的解释,请参阅this。