以下是可变长度序列和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
是为了共享变量而不是为批次的每个部分设置不同的变量
答案 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
,你将获得与批量大小一样多的初始状态,并且每个训练方法时都会有不同的变化(因为不同的渐变将应用于它们)。