關(guān)于tf.reverse_sequence()簡述
tf.reverse_sequence()簡述
在看bidirectional_dynamic_rnn()的源碼的時(shí)候,看到了代碼中有調(diào)用 reverse_sequence()這一方法,于是又回去看了下這個(gè)函數(shù)的用法,發(fā)現(xiàn)還是有點(diǎn)意思的。根據(jù)名字就可以能看得出,這個(gè)方法主要是用來翻轉(zhuǎn)序列的,就像雙線LSTM中在反向傳播那里需要從下文往上文處理一樣,需要對序列做一個(gè)鏡像的翻轉(zhuǎn)處理。
先來看一下這個(gè)方法的定義:
reverse_sequence( input, seq_lengths, seq_axis=None, batch_axis=None, name=None, seq_dim=None, batch_dim=None)
其中input是輸入的需要翻轉(zhuǎn)的目標(biāo)張量,seq_lengths是一個(gè)張量;
其元素是input中每一處需要翻轉(zhuǎn)時(shí)翻轉(zhuǎn)的長度,在雙向LSTM中這個(gè)值統(tǒng)一被設(shè)為輸入語句的長度,代表著整句話都需要被翻轉(zhuǎn),而實(shí)際上張量中的元素值可以是不同的,下面的例子中就可以看出;
seq_axis和seq_dim的關(guān)系,在源碼中做了如下操作:
seq_axis = deprecation.deprecated_argument_lookup("seq_axis", seq_axis,
"seq_dim", seq_dim)
返回中return gen_array_ops.reverse_sequence(..., seq_dim=seq_axis,...),同理,對于batch_axis和batch_dim也是相同的處理。意義上來說,按照官方給出的解釋,“此操作首先沿著維度batch_axis對input進(jìn)行分割,并且對于每個(gè)切片 i,將前 seq_lengths 元素沿維度 seq_axis 反轉(zhuǎn)”。實(shí)際上通俗來理解,就是對于張量input中的第batch_axis維中的每一個(gè)子張量,在這個(gè)子張量的第seq_axis維上進(jìn)行翻轉(zhuǎn),翻轉(zhuǎn)的長度為 seq_lengths 張量中對應(yīng)的數(shù)值。
舉個(gè)例子,如果 batch_axis=0,seq_axis=1,則代表我希望每一行為單位分開處理,對于每一行中的每一列進(jìn)行翻轉(zhuǎn)。相反的,如果 batch_axis=1,seq_axis=0,則是以列為單位,對于每一列的張量,進(jìn)行相應(yīng)行的翻轉(zhuǎn)?;仡^去看雙向RNN的源碼,就可以理解當(dāng)time_major這一屬性不同時(shí),time_dim 和 batch_dim 這一對組合的取值為什么恰好是相反的了。
寫一個(gè)簡單的測試代碼:
a = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) l = tf.constant([1,2,3],tf.int64) # 每一次翻轉(zhuǎn)長度分別為1,2,3.由于a是(3,3)維的,所以l中數(shù)值最大只能是3 x = tf.reverse_sequence(a,seq_lengths=l,seq_axis = 0,batch_axis= 1) # 以列為單位進(jìn)行翻轉(zhuǎn),翻轉(zhuǎn)的是每一行的元素 y = tf.reverse_sequence(a,seq_lengths=l,seq_axis = 1,batch_axis= 0) # 以行為單位進(jìn)行翻轉(zhuǎn),翻轉(zhuǎn)的是每一列的元素 with tf.Session() as sess: print(sess.run(x)) print(sess.run(y))
結(jié)果如下:
# 每一列上的元素種類沒有發(fā)生變化,但是從每一行來看,行的順序分別翻轉(zhuǎn)了前1,前2,前3個(gè)元素 [[1 5 9] [4 2 6] [7 8 3]] # 每一行上的元素種類沒有發(fā)生變化,但是從每一列來看,列的順序分別翻轉(zhuǎn)了前1,前2,前3個(gè)元素 [[1 2 3] [5 4 6] [9 8 7]]
以上這篇關(guān)于tf.reverse_sequence()簡述就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用sigthief簽發(fā)證書的實(shí)現(xiàn)步驟
Windows 系統(tǒng)中的一些非常重要文件通常會被添加數(shù)字簽名,其目的是用來防止被篡改,能確保用戶通過互聯(lián)網(wǎng)下載時(shí)能確信此代碼沒有被非法篡改和來源可信,從而保護(hù)了代碼的完整性、保護(hù)了用戶不會被病毒、惡意代碼和間諜軟件所侵害,本章將演示證書的簽發(fā)與偽造2021-06-06
python實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
如何實(shí)現(xiàn)python爬蟲爬取視頻時(shí)實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示
這篇文章主要介紹了如何實(shí)現(xiàn)python爬蟲爬取視頻時(shí)實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示,在爬取并下載網(wǎng)頁上的視頻的時(shí)候,我們需要實(shí)時(shí)進(jìn)度條,這可以幫助我們更直觀的看到視頻的下載進(jìn)度。文章圍繞主題展開更多內(nèi)容,需要的小伙伴可以參考一下2022-06-06

