是否应该共享批次输入中动态rnn的(初始)状态的变量?

时间:2017-06-11 17:11:15

标签: tensorflow

以下是可变长度序列和Tensorflow的RNN教程:
https://r2rt.com/recurrent-neural-networks-in-tensorflow-iii-variable-length-sequences.html

在里面你看到了这个:

init_state = tf.get_variable('init_state', [1, state_size],
                             initializer=tf.constant_initializer(0.0))
init_state = tf.tile(init_state, [batch_size, 1])

这样做有什么好处(除非是完全错误的)?:

init_state = tf.get_variable('init_state', [batch_size, state_size],
                             initializer=tf.constant_initializer(0.0))

如果我错了,请纠正我,但我认为选择上面使用tile是为了共享变量而不是为批次的每个部分设置不同的变量

1 个答案:

答案 0 :(得分:1)

你是对的,tf.tile将复制变量,如API

中所述
  

此操作通过复制输入倍数来创建新的张量。输出张量的第i个维度具有input.dims(i)*倍数[i]个元素,并且输入值沿着第i个维度被复制倍数[i]次。例如,通过[2]平铺[a b c d]会产生[a b c d a b c d]。

_tile_grad方法也说明了这一点,它允许聚合平铺张量的渐变(参见gen_array_ops.py文件):

def _tile_grad(input, multiples, name=None):
  """Returns the gradient of `Tile`.

  Since `Tile` takes an input and repeats the input `multiples` times
  along each dimension, `TileGrad` takes in `multiples` and aggregates
  each repeated tile of `input` into `output`.
  ...
  """

如果你没有平铺init_state,你将获得与批量大小一样多的初始状态,并且每个训练方法时都会有不同的变化(因为不同的渐变将应用于它们)。

相关问题