課程來源:https://coding.imooc.com/class/chapter/344.html#Anchor
本門課程的入門章節,簡要介紹了tensorflow是什么,詳細介紹了Tensorflow歷史版本變遷以及tensorflow的架構和強大特性。並在Tensorflow1.0、pytorch、Tensorflow2.0之間做了對比。最后通過實戰講解了在Google cloud和AWS兩個平台上的環境配置。
1-1課程導學
為什么要學Tensorflow?
深度學習迅猛發展;模型框架強大靈活;google+開源社區背書;在公司中應用廣泛;2.0發布,機遇在手(相對於1.0,更加強大、靈活、易用、成熟)。
課程目標:
掌握靈活使用tensorflow框架的能力;
掌握相關的機器學習/深度學習的理論知識;
獨立開發項目,掌握大廠一線編程經驗;
達到初級深度學習算法工程師/研究者的水平。
課程特點:
重實戰,請理論,配備多個特點項目(圖像分類,房價預測,泰坦尼克生存預測,文本分類,文本生成,機器翻譯);
內容豐富全面,自帶“干貨”(模型訓練,tensorboard,模型保存與部署,分布式訓練,Tfds/tfhub,tensor2tensor);
多平台雲端環境GPU&kaggle數據集(google cloud環境配置,AWS環境配置,kaggle 10 Monkeys數據集,kaggle cifar10數據集,kaggle文本分類數據集,kaggle titanic生存預測數據集);
課程對使用TF1.0的學院也非常友好(原1.0學員可以輕松學習2.0,學習2.0的同學可以輕松讀懂1.0代碼);
課程長期維護(同步補充TF2.0正式版知識點,定期更新項目源碼)。
課程章節:
第一章:tensorflow簡介(tensorflow是什么、tensorflow歷史、tensorflow vs pytorch。環境配置。);
第二章:tensorflow keras實戰(tf框架:keras、回調函數。項目:圖像分類、房價預測。知識點:分類問題、回歸問題、損失函數;神經網絡、激活函數、批歸一化、dropout;wide&deep模型、超參數搜索。);
第三章:tensorflow基礎API使用(tf框架:基礎數據類型,自定義模型與損失函數、自定義求導、tf.function、圖結構。項目:圖像分類、房價預測。);
第四章:tensorflow dataset使用(tf框架:csv文件讀取、tfrecord文件生成與讀取、tf.data使用。項目:房價預測。);
第五章:tensorflow estimator使用與1.0(tf框架:estimator使用、特征列使用、tf1.0基本使用。項目:泰坦尼克生存預測。);
第六章:卷積神經網絡(tf框架:卷積實現。項目:圖像分類、kaggle 10monkeys,kaggle clifar10。理論:卷積、數據增強、遷移學習。);
第七章:循環神經網絡(tf框架:LSTM實現。項目:文本分類、分本生成、Kaggle文本分類。原理:序列式問題、循環網絡、LSTM、雙向LSTM。);
第八章:tensorflow分布式(tf框架:分布式實現。項目:圖像分類。);
第九章:tensorflow模型保存與部署(tf框架:模型保存、導出tflite、部署。項目:圖像分類。);
第十章:機器翻譯與tensor2tensor使用(tf框架:transformer實現、tensor2tensor使用。項目:機器翻譯。理論:序列到序列模型、注意力機制、可縮放點積注意力、多頭注意力)。
前五章是基礎知識,后五章是高階知識。
做完六個項目(機器翻譯,圖像分類,文本分類,文本生成,泰坦尼克生存預測,房價預測)應具有的能力:
問題建模的能力;特征工程的能力;搭建模型的能力。
本課程適合的人群:
想轉行到深度學習方向的工程師;學習了理論但欠缺實踐的深度學習starter;有志於、感興趣深度學習的愛好者們;想快速做實驗完成研究任務畢設任務的同學們。
本課程需要的基礎:
python基礎語法;
熟悉Linux環境;
了解機器學習與深度學習基礎知識(有則更好,沒有需要看完課程后系統學習)。
1-2tensorflow是什么
深度學習領域使用最為廣泛的一個Google的開源軟件庫(最初由Google brain team進行開發的內部庫,由於它的應用性Google決定把它開源出來):
采取數據流圖,用於數值計算;
支持多種平台,GPU、CPU、移動設備;
最初用於深度學習,變得越來越通用(只要是能夠表達成數據流圖的問題,都可以使用tensorflow來進行解決,現在對於tensorflow的使用大多數還是深度學習)。
數據流圖:
節點——處理數據;
線——節點間的輸入輸出關系;
線上運輸張量(張量tensor就是所有的n維數據,所有的n維數據就構成了tensorflow中的數據的一個集合,對於0維數據來說它就是一個數字,對於1維數據來說他就是一個向量,對於二維來說就是一個矩陣,對於大於等於三維的數據統稱為高維矩陣,正因為如此才命名為tensorflow,因為它是讓tensor在數據流圖中去進行流動);
節點被分配到各種計算設備上運行(它能夠支持多種設備,只要把節點在某種設備上的執行算子寫好就可以了)。
tensorflow的特性:
高度的靈活性(體現在數據流圖上,只要能把數據的計算表示成數據流圖就可以使用tensorflow,現在tensorflow主要用於神經網絡,tensorflow對於神經網絡的很多操作都進行了封裝,比如像卷積、歸一化、pooling等等,除了這些封裝之外,還可以寫自己的封裝,像寫一個python函數一樣簡單,寫完以后就可以去做自己的事情了);
真正的可移植性(比如CPU、GPU、移動設備等等,比如說你在筆記本上訓練了一個model,然后你想把它push到服務器上去進行運行,ok,tensorflow是可以支持的,但是你好像又改變注意了,你想把你訓練的model保存出來跑到手機上,ok,tensorflow也可以支持,或者你有改變主意像把tensorflow部署到docker上在docker上運行,ok,這也是可以的,這樣就體現了tensorflow它是移植性非常強大的一個庫);
產品和科研結合(tensorflow研究最初是用於科研的,其實科研和工程還有一定的距離,科研的代碼需要進一步各種各樣的優化才能真正的做到產品上去,但是對於tensorflow則沒有這個問題,Google團隊把tensorflow優化的已經比較好了,做研究的代碼可以無縫的用到產品上);
自動求微分;
多語言支持(tensorflow除了python以外,還支持各種各樣的語言,比如說c++、java、javascript、R語言等);
性能最優化(在tensorflow剛剛出來的時候由於它運行的比較慢,很多深度學習庫呢都會拿tensorflow來進行比較,然后來證明自己比tensorflow好多少倍,但是隨着tensorflow一步一步的進行開發,這種情況一去不復返了,tensorflow現在應該是運行最快的一個庫,對於分布式的tensorflow來說,它的加速比幾乎是線性的)。
1-3tensorflow版本變遷與tf1.0架構
tesorflow版本變遷:
2015.11tensorflow宣布開源並首次發布;
2015.12支持GPUs,python3.3(v0.6);
2016.04分布式tensorflow(v0.8);
2016.11支持windows(v0.11);
2017.02性能改進,提升API穩定性(v1.0,它是tensorflow的一個分水嶺,1.0和1.0以后版本使用是很不相同的,那個時期也是tensorflow怨聲哀道的時候,不過這種情況在后邊不會發生);
2017.04添加了對keras的支持(keras的后端可以設為tensorflow;在tensorflow中它也有了針對keras的集成版本也就是tf.keras下邊的那些代碼庫,keras是tensorflow后期版本中所主推的一個feature,后邊的課程中會主要以keras為基礎來講解如何使用tensorflow);
2017.08添加了更多高級的API,預算估算器,更多模型,初始TPU支持(v1.3);
2017.11添加了Eager execution(也是tensorflow2.0的一個主要特性)和tensorflow Lite(是一個對移動端的支持)(v1.5);
2018.03雖然沒有發布新的版本,但是推出了很多封裝庫,TF-Hub(一個預訓練的庫),TensorFlow.js(tensorflow對於js的支持),TensorFlow Extended(TFX)(tensorflow的一些擴展庫);
2018.05新入門內容;開始支持Cloud TPU模塊與管道(管道是一種比較高效的數據輸入方式,因為tensorflow發現其運行速度慢的瓶頸在於數據處理,因此1.6版本在數據處理方便做了一些優化)(v1.6);
2018.06添加了新的分布式策略API;同時支持了概率模型,因為它有了概率編程工具TensorFlow Probality(v1.8);
2018.08對Cloud Big Table集成(v1.10);
2018.10側重於可用的API改進,使得API的可用性進一步加強(v1.12);
2019年TensorFlow v2.0發布,現在的狀態是發布了預覽版和alpha版,應該在不久的將來就會發布2.0的正式版。
下邊講兩個重要版本的主要特性。
tensorflow1.0主要特性:
添加了對XLA(Accelerate Linear Algebra專門針對線性運算的編譯器,這個編譯器可以優化tensorflow,使它計算更快,它影響的只是tensorflow的底層,上層使用不到的)的支持(有了這個特性之后,tensorflow的訓練速度提升了58倍;而且XLA還具有強大的可移植性,使得tensorflow1.0可以在移動設備上運行);
引入了更高級別的API,tf.layers/tf.metrics/tf.losses/tf.keras;
添加了Tensorflow的調試器;
還支持docker鏡像,引入tensorflow serving服務,使得用tensorflow部署服務變得非常的簡潔。
tensorflow1.0的架構:
從下往上看,首先是底下的平台CPU、GPU、Android、ios、使用XLA編譯的CPU、GPU、TPU等,在底層tensorflow在不同的設備上實現各樣的算子(算子就是tensorflow的數據流圖中的節點所支持的運算,各種各樣的運算,每種運算都被稱為一個算子,這些算子在不同平台上的實現就構成了tensorflow的可移植性,對於用戶來說他使用的是這個算子的高層抽象,至於這個算子在哪個平台上運行是由tensorflow去進行決定的,因而tensorflow就具有了可移植性);
然后在底層之上有tensorflow Distributed Execution Engine,它是用來分配算子的,為什么要分配算子呢?對於用戶來說呢用戶所知道的就是用戶構建了一個數據流圖,至於這個數據流圖是怎么去運行的,是由這一層來決定,這一層決定了數據流圖中的每一個節點都分布在什么設備上或者哪個設備上,比如說你有1個GPU或者CPU,Engine就會把所有的計算分配到這個CPU或GPU上,這就是單機版的tensorflow,當你有多台設備的時候,比如你有8個GPU或者16個CPU,Engine這時候就要決定需要把哪一個算子給分配在哪一台機器上,這就是該層要做的事情;
在往上一層就是高層封裝,包括python封裝、c++封裝、java封裝等,在這些封裝中用戶利用這些封裝可以很輕松的構建一個計算圖,但是這個計算圖的算子是怎么分配的對用戶是不可見的因為它是由Engine做處理;
對於python來說,他還有各種各樣的高層封裝,包括Layers、Estimator、Keras Model、Datasets等等,本節課程中主要講的是tensorflow的python是如何去使用的,包括Keras、Estimator、Datasets、Layers、Distribution Engine(這里邊也有一些高層抽象,這些高層抽象會讓你去選擇如何定義分布式策略等等)。
1-4Tensorflow2.0架構
tensorflow2.0主要特性:
對tf.keras、eager mode進行了強化,也主推這兩個feature,有了這連個feature之后,用戶可以進行更加簡單的模型構建;
增加了一些跨平台的部分,使得跨平台模型部署非常的魯棒;
對API進行了改造,使得它更加的靈活,使得研究者或用戶使用tensorflow對深度學習研究實驗變得更加的方便快捷;
清楚了不推薦使用的API和減少重復的API,對API進行了簡化,使得tensorflow的可用性大大提高。
tensorflow2.0架構:
是1.0架構更加抽象的表達,和1.0架構相比,有些東西是互補的,有些東西是進階的,還是從最下邊看起。
左下角是一個tensorflow支持的平台列表,有CPU、GPU、TPU等,在1.0還有Android、iOS等,但在這里一般是不會在這些設備上進行訓練的,而是用這些平台來做推導,把這些設備做了一個抽取形成了一個單獨的部分deployment即部署,在訓練完model之后把model保存下來,然后可以保存成各種各樣的格式進行部署,包括在服務器上進行部署、在手機端進行部署、在javascript上進行部署、在其他語言上進行部署等等,這是一個比較底層的實現;
同理在底層實驗之上,還是有distribution strategy,可以類比成1.0的那個distribution Engine,用來做分配算子和支持分布式等這些事情;
然后在此之上,還有高層的封裝,包括tf.keras和estimators,這兩個就是tensorflow2.0主推的tensrflow的使用方式,然后在后邊的課程中我們會對其進行主要講解,還有tensorflow Hub它是一個預訓練模型的一個庫,在本課程最后一章會對其進行講解;
最上層呢,就是使用tensorflow的一些API進行數據的讀取和預處理。
相對於1.0,2.0的架構有一個什么樣的大的改動呢?
在tf.keras、estimators和distribution strategy之間還有一些中間層的API包括tf.layers等,這些API在tensorflow2.0中是不推薦使用的,因為tensorflow2.0是希望大家用稍微高層一點的封裝去更簡單的去做模型的構建這些工作;
2.0的架構他有了一個專門的deployment的部分,這個在1.0中是沒有體現出來的,這也是在2.0當中新加的一個內容,它的部署的跨平台性非常的魯棒。
2.0的架構圖說是架構圖,其實更像是一個開發流程,比如說從trainning開始,准備data,然后再構建模型,然后再用分布式進行訓練,然后訓練完之后再把它保存下來進行部署,所以說2.0的架構圖不僅僅是一個架構圖,而且還是一個流程圖。
tensorflow2.0簡化的模型開發流程:
使用tf.data加載數據;
使用tf.keras或premade estimator來進行模型的構建,同時可以使用tensorflow hub一些預訓練的模型進行遷移學習;
然后使用eager mode進行運行和調試,eager mode的加入使得調試變得非常的便捷;
然后使用分發策略來進行分布式訓練;
訓練完之后導出模型到SavedModel;
然后使用tensorflow server、tensorflow lite、tensorflow.js進行模型部署。
以上開發流程也是2.0的特性的第一個特性的展開的描述。
tensorflow2.0強大的跨平台能力:
支持在服務器上部署,部署之后就可以通過HTTP/REST或GRPC/協議緩沖區去進行調用;
然后是移動端部署,tensorflow lite,可以部署在Android、iOS和嵌入式設備上;
然后是JavaScript上的部署;
然后用其他語言C、Java、go、c#、rust、julia、r等進行部署。
以上就是tensorflow2.0的第二個主要特性。
tensorflow2.0強大的研究實驗能力:
主要體現在更靈活的模型搭建,更靈活的模型搭建主要體現在keras上,2.0中對keras進行了加強,它增加了keras功能API和子類API,允許創建更復雜的拓撲結構;
還體現在自定義的訓練邏輯,除了tensorflow自己定義的一些模型、反向傳播的訓練方法之外,tensorflow2.0還支持讓用戶自定義它的梯度下降的方法,自定義方法就是使用tf.GradientTape和tf.cutom_gradient來進行實現;
雖然2.0主推用keras去進行模型的構建,但是一些比較底層的一些算子的封裝,比如說卷積、pooling、全連接層等等,這樣的封裝層次也是始終和keras這樣的高層封裝結合使用的,這樣就使得keras模型的使用更加的靈活;
在2.0中添加了很多高級的擴展,包括ragged tensors、tensor2tensor庫等等,雖然tensor2tensor庫還沒有被集成到2.0中,但是我們可以在1.13版本中可以通過安裝一個tensor2tensor庫來對tensor2tensor進行使用,最后一章會對tensor2tensor來進行講解。
1-5tensorflow與pytorch比較
從四個方面對比:入門時間,圖創建和調試,全面性,序列化與部署。
入門時間:
tensorflow1.*, 使用的是靜態圖,雖然1.5中也加了eager mode/eager ecutation,但是不是默認打開的需要用一個命令讓它打開,這里就假設沒有eager mode,沒有eager mode的情況下它就是一個靜態圖;由於它是靜態圖,需要學習一些額外的概念,包括圖、回話、變量、占位符等,如果是動態圖的話就不需要這些概念了;同理如果是靜態圖的話,除了學習這些額外的概念還要寫很多樣板的代碼。
tensorflow2.0,默認eager mode是打開的,有了eager mode呢,tensorflow2.0中使用的計算圖就是一個動態圖,動態圖就是在運行過程中可以更改的圖結構,靜態圖就是構建完成之后就不能夠再更改了;有了動態圖之后,代碼就像是直接集成在python中,而不是像1.0那樣像是在調用一個庫。
pytorch,和tensorflow2.0是類似的,里邊直接采用了動態圖結構;然后它相當於是numpy的一個擴展,也是直接集成在python中的,因為它是動態圖結構。
圖結構:
這張圖做的是矩陣W和X做乘積再加上b,之后做一個ReLU激活函數,左側是一個正向計算的一個圖,右側是與之對應的去做反向傳播的圖,反向傳播的圖是由tensorflow自動構建的,用戶在使用的時候感覺不到它,然后有了這個反向傳播的圖之后,tensorflow就可以實現自動求導,自動求導是大部分深度學習框架所必須的一個功能,它可以大大減輕程序員的工作量。對於這樣的一個圖結構,tensorflow1.0里邊的做法是,我把這個圖結構構建出來之后,這個圖結構就不會再變了,這就叫靜態圖, 這樣的優勢是由於圖結構不再變化了我可以做一些優化,比如把一些算子給並起來或者做一些硬件上的優化。對於動態圖來說,我不做這樣一個限制,不做限制就說明這個圖結構可以在中間去給它一些變動,得不到一個確定的圖結構,有一些優化我就不能做了,效率就沒有那么的高,但是因為可以隨意的變動這個圖,所以說調試起來就比較容易。
圖創建和調試:
tensorflow1.*,靜態圖,難以調試,要學習tfdg的一個復雜的調試的工具;
對於tensorflow2.0與pytorch來說,由於使用的是動態圖,可以像正常的調試python代碼一樣對其代碼進行調試,自帶調式工具。
全面性方面:
pytorch缺少,沿維度反轉張量,檢查無窮與非數值張量,快速傅里葉變換等,而tensorflow是有的,其他地方都差不多,而且這幾個地方比較小,所以說幾乎是一樣的,而且隨着時間的變化,pytorch和tensorflow變得越來越接近。
對於序列化與部署:
tensorflow2.0的序列化支持非常廣泛,可以在js上、Android上、iOS上、服務器上都可以去執行,它的圖保存的格式是protocol buffer的一個格式,也比較通用,用各種語言都可以對它進行讀取,而且跨平台在各種平台上都可以運行;pytorch序列化和部署的支持就比較簡單,可能就是簡單的支持一個導出。
可以總結出,在應用性上,tensorflow1.0是比較難應用的,tensorflow2.0和pytorch是相互接近的;在調試上也比較類似,1.0比較難以調試,而pytorch和2.0是類似的;但是在全面性和序列化與部署上,2.0是可以超過pytorch的。
所以綜合來看,2.0是優於pytorch,pytorch要比1.0要好。
1-6tensorflow環境配置