2017-06-11 34 views
0

這裏是可變長度序列和RNN的Tensorflow教程:
https://r2rt.com/recurrent-neural-networks-in-tensorflow-iii-variable-length-sequences.html批處理輸入中動態rnn的(初始)狀態變量是否應該共享?

裏面你看到這一點:

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選擇,以分享在v良莠不齊的而不是批處理

回答

1

你說得對各部分不同的變量,如API

此操作描述tf.tile將複製變量通過複製輸入倍數倍創建一個新的張量。輸出張量的第i維具有input.dims(i)* multiples [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,你會得到與批量大小一樣多的初始狀態,並且每個人在訓練方法時會發生不同的變化(因爲將對其應用不同的梯度)。