首页 文章

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

提问于
浏览
1

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

我正在尝试使用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 回答

  • 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)
    

    在执行循环中,您可以先初始化状态,然后在 feed_dict 中将 final_state 提供为 initial_state

    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}
    

相关问题