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应该没问题但想要仔细检查。
答案 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
对象,您需要同时提供c
和h
:
feed_dict = {initial_state.c=state.c, initial_state.h: state.h}