tf.zeros vs tf.placeholder作为RNN初始状态

时间:2017-09-24 20:52:33

标签: tensorflow recurrent-neural-network rnn

Tensorflow新手在这里!我知道随着时间的推移会对变量进行训练,占位符会使用输入数据,这些数据不会随着模型的变化而变化(如输入图像和这些图像的类标签)。

我尝试使用Tensorflow实现RNN的前向传播,并想知道我应该保存RNN小区输出的类型。在numpy RNN实现中,它使用

hiddenStates = np.zeros((T, self.hidden_dim)) #T is the length of the sequence

然后迭代地将输出保存在np.zeros数组中。

如果是TF,我应该使用哪一个,tf.zeros或tf.placeholder?

在这种情况下,最佳做法是什么?我认为使用tf.zeros应该没问题但想要仔细检查。

1 个答案:

答案 0 :(得分:2)

首先,了解Tensorflow内部的所有内容都是Tensor非常重要。因此,当您执行某种计算时(例如像outputs = rnn(...)这样的rnn实现),此计算的输出将作为Tensor返回。因此,您不需要将其存储在任何类型的结构中。您可以通过运行代理节点(即output)来检索它,例如session.run(output, feed_dict)

告诉我,我认为您需要采用RNN的最终状态并将其作为后续计算的初始状态。两种方式:

A)如果您正在使用RNNCell实现在构建模型期间,您可以像这样构建零状态:

cell = (some RNNCell implementation)
initial_state = cell.zero_state(batch_size, tf.float32)

B)如果您正在实施自己的员工将状态定义为零Tensor:

initial_state = tf.zeros([batch_size, hidden_size])

然后,在这两种情况下,您将拥有类似的内容:

output, final_state = rnn(input, initial_state)

在执行循环中,您可以先初始化州,然后在final_state内提供initial_state feed_dict

state = session.run(initial_state)
for step in range(epochs):

   feed_dict = {initial_state: state}
   _, state = session.run((train_op,final_state), feed_dict)

您实际构建feed_dict的方式取决于RNN的实施。

对于BasicLSTMCell,状态是LSTMState对象,您需要同时提供ch

feed_dict = {initial_state.c=state.c, initial_state.h: state.h}