其實在很久之前小編就想開設這樣一個專欄了,畢竟TensorFlow2.x已經問世很久了,跟1.x相比,它真是有了太大的變化,現在TensorFlow已經到了2.4.0的版本了,所以小編就想總結一下,開始適應全新的2.x系列,本文算是整個專欄的開篇吧,主要來談一下我為什么想要學習并使用TensorFlow2.x版本,下面就要開始我們的TensorFlow2.x的學習之旅了,關注專欄《一起來學TensorFlow2.x》,解鎖更多相關內容~
目錄
基于TensorFlow1.x的編程
1.1 TensorFlow1.x版本遇到的問題概述
1.2 TensorFlow1.x下的seq2seq模型
1.2.1 seq2seq模型簡述
1.2.2 TensorFlow1.x下參考seq2seq
1.3 修改原始碼,自定義RNN模型,實作seq2seq演算法
基于TensorFlow1.x的編程
1.1 TensorFlow1.x版本遇到的問題概述
我本機Windows環境下的TensorFlow是1.12.0的版本:

通常情況下,我可以在本地愉快的進行編碼,直到一個問題出現了:因為GPU的問題,本地寫的神經網路代碼運行比較緩慢(本人筆記本的顯卡是GTX1050Ti)需要提交到服務器上,服務器設定的顯卡是RTX3070,在配置服務器環境的時候配置的是TensorFlow2.x的版本,這也就導致了我之前寫的代碼都沒法在服務器上運行了(眾所周知,TensorFlow別說大版本的更新了,甚至很多小版本的更新都會影響代碼的運行),于是便有了1.x到2.x的轉變,
1.2 TensorFlow1.x下的seq2seq模型
1.2.1 seq2seq模型簡述
上面說到的本地代碼就是使用的seq2seq模型,我想訓練一個智能的問答系統,于是選擇了非常受歡迎的seq2seq模型來構建該系統,seq2seq屬于encoder-decoder結構的一種,基本思想就是利用兩個RNN,一個RNN作為encoder,另一個RNN作為decoder,encoder負責將輸入序列壓縮成指定長度的向量,這個向量就可以看成是這個序列的語意,這個程序稱為編碼,獲取語意向量最簡單的方式就是直接將最后一個輸入的隱狀態作為語意向量,也可以對最后一個隱含狀態做一個變換得到語意向量,還可以將輸入序列的所有隱含狀態做一個變換得到語意變數,而decoder則負責根據語意向量生成指定的序列,這個程序也稱為解碼,最簡單的方式是將encoder得到的語意變數作為初始狀態輸入到decoder的RNN中,得到輸出序列,可以看到上一時刻的輸出會作為當前時刻的輸入,而且其中語意向量只作為初始狀態參與運算,后面的運算都與語意向量無關,decoder處理方式還有另外一種,就是語意向量參與了序列所有時刻的運算,上一時刻的輸出仍然作為當前時刻的輸入,但語意向量會參與所有時刻的運算,
1.2.2 TensorFlow1.x下參考seq2seq
基于小編本機的TensorFlow版本(1.12.0),可以直接通過下面的方式參考seq2seq模型:
from tensorflow.contrib.legacy_seq2seq.python.ops import seq2seq

通過上面的參考可以發現,seq2seq模型在contrib庫中,但是contrib庫在TensorFlow2.x之后被棄用了,原來屬于contrib的函式,按照其功能,分散到了對應的模塊中,這樣的話,我們要想在新的服務器上使用原先1.x的代碼,這里就不能直接參考了,TensorFlow2.x中原contrib里的seq2seq模塊現在進入了addons里面,具體參考檔案可以點擊這里,GitHub的地址請點擊這里,下面說一下我當時的處理方式,畢竟我當時還不知道seq2seq模塊現在進入了addons里面,
1.3 修改原始碼,自定義RNN模型,實作seq2seq演算法
沒錯,上面的標題就是我接下來進行的操作,通過分析seq2seq的原始碼我發現,里面大部分的庫在TensorFlow2.x中依然可以使用,例如下面的這些:
from tensorflow.python.framework import dtypes
from tensorflow.python.framework import ops
from tensorflow.python.ops import array_ops
from tensorflow.python.ops import control_flow_ops
from tensorflow.python.ops import embedding_ops
from tensorflow.python.ops import math_ops
from tensorflow.python.ops import nn_ops
from tensorflow.python.ops import rnn
from tensorflow.python.ops import rnn_cell_impl
from tensorflow.python.ops import variable_scope
from tensorflow.python.util import nest
當然也有不可使用的,例如:
from tensorflow.contrib.rnn.python.ops import core_rnn_cell
這樣的話,只需要修改core_rnn_cell這一個源代碼,基本上就可以實作在目前的環境中運行我之前的代碼了,于是我將core_rnn_cell的原始碼復制了出來,新建了一個core_rnn_cell.py檔案:

并且在seq2seq模型中,呼叫我新建的這個core_rnn_cell.py檔案:
from seq2seq import core_rnn_cell
這樣一切準備就緒后,再次在服務器上進行測驗發現,原先的代碼可以跑通了,當然,不建議大家使用我的這個方法,畢竟感覺不是正規的TensorFlow2.x,整個修改程序看似簡單,其實花費了我大量的時間,TensorFlow也終于再次“惡心”到了老夫,不過相比于TensorFlow1.x混亂的layer和nn,TensorFlow2.x把所有層級別函式的簡單實作放在了tf.nn,復雜實作放在了tf.keras.layer中,所以才有了這么一個專欄,才有了這么一篇文章,這篇文章算是開篇的前言部分,主要就是為了學習TensorFlow2.x做一個引子,起到拋磚引玉的作用,如果你也對TensorFlow2.x感興趣,那么快跟我一起開啟TensorFlow2.x的學習之旅吧~
好了,本文到此基本上結束了,為了防止讀友們好奇,小編文章所提到的1.x版本的代碼已經修改后的代碼均已經上傳到了GitHub中,感興趣的朋友可以點擊此處進行查看,你們在這個程序中遇到了什么問題,歡迎留言,讓我看看你們都遇到了什么問題~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/242333.html
標籤:AI
上一篇:5分鐘實作漂亮的CSS加載影片,純CSS實作加載影片
下一篇:隱藏在瀏覽器背后的“黑手”
