2017-04-03 234 views
3

我很困惑在Tensorflow中为RNN使用初始状态张量的正确方式是什么。在使用LSTMStateTuplecell.zero_state的turtorials之间几乎有50/50的分割。Tensorflow中针对RNN的LSTMStateTuple与cell.zero_state()

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

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

为什么有两种方法?什么时候喜欢这个或那个?当您设置state_is_tuple时,您只能使用LSTMStateTuple吗?如果是这样,cell.zero_state()不再起作用了吗?

+0

两者是不同的东西。在LSTM单元上使用'state_is_tuple',因为LSTM单元的状态是一个元组。 'cell.zero_state'是所有RNN小区状态的初始值。 –

+0

看到这个解释为什么LSTM状态是一个元组:http://colah.github.io/posts/2015-08-Understanding-LSTMs/ –

+0

是的,但如果你看看我提供的两个例子,他们使用两个不同的设置初始状态的方法。 – user3139545

回答

2

两者是不同的东西。 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

+1

保持批次之间的状态不是使用LSTMStateTuple的理由?我可以用cell.zero_state()来做到这一点...? – user3139545

+0

例如https:// github。com/udacity/deep-learning/blob/master/sentiment-rnn/Sentiment%20RNN%20Solution.ipynb – user3139545

+0

你是对的。你也可以用'cell.zero_state()'做到这一点,这就是为什么在大多数情况下建议使用cell.zero_state的原因。仍然有选择通过批次之间的LSTMStateTuple。 –