個人認為tf2.0會成為主流
Caffe是一個清晰而高效的深度學習框架,也是一個被廣泛使用的開源深度學習框架,在Tensorflow出現之前一直是深度學習領域Github star最多的專案。主要優勢為:上手容易,網路結構都是以配置檔案形式定義,不需要用程式碼設計網路。訓練速度快,元件模組化,可以方便的拓展到新的模型和學習任務上。但是Caffe最開始設計時的目標只針對於影象,沒有考慮文字、語音或者時間序列的資料,因此Caffe對卷積神經網路的支援非常好,但是對於時間序列RNN,LSTM等支援的不是特別充分。
Caffe由低到高依次把網路中的資料抽象成Blob, 各層網路抽象成Layer ,整個網路抽象成Net,網路模型的求解方法抽象成Solver。
Blob表示網路中的資料,包括訓練資料,網路各層自身的引數,網路之間傳遞的資料都是透過Blob來實現的,同時Blob資料也支援在CPU與GPU上儲存,能夠在兩者之間做同步。
Layer是對神經網路中各種層的抽象,包括卷積層和下采樣層,還有全連線層和各種啟用函式層等。同時每種Layer都實現了前向傳播和反向傳播,並透過Blob來傳遞資料。
Net是對整個網路的表示,由各種Layer前後連線組合而成,也是所構建的網路模型。
Solver 定義了針對Net網路模型的求解方法,記錄網路的訓練過程,儲存網路模型引數,中斷並恢復網路的訓練過程。自定義Solver能夠實現不同的網路求解方式。
TensorFlow 2.0中有多處更改,以使TensorFlow使用者使用更高效。TensorFlow 2.0刪除冗餘 APIs,使其更加一致,並透過Eager execution模式更好地與Python整合。
相比於TensorFlow
1.x
1. 預設狀態的Eager Execution
首先,eager execution是執行TF程式碼的預設方式。
為了在TF1.x中構建一個神經網路,需要定義一個名為圖形(Graph)的抽象資料結構。另外,如果試圖列印其中一個圖節點,將看不到期望值,卻可以看到對圖節點的引用。實際上,要執行圖形,需要使用一個名為會話(Session)的封裝。使用Session.run()法,可以將Python資料傳給圖形,並對模型進行實際訓練。
現在,TensorFlow程式碼可以像普通的Python程式碼一樣執行。這意味著可以迅速建立並評估操作。
2. API清理
許多API,如tf.gans、tf.app、tf.contrib、tf.flags,會被清理或移動到單獨的儲存庫。
然而,最重要的清理之一涉及到我們如何構建模型。TF1.x中有超過1或2種不同的構建/訓練ML模型的方法。儘管許多API效能良好,但似乎並沒有收斂出一種通用的開發方式。此外,如果在其中一個API中訓練模型,那麼使用其他API來再利用該程式碼並不簡單。
在TF2.0中,tf.keras是推薦的高階API。可以看到,目前正試圖利用KerasAPI解決所有可能的用例。
3. Keras-Tuner
Keras-tuner是一個對Keras模型進行超引數調整的專用庫。在撰寫本文時,該庫處於α之前的狀態,但是使用tf.keras和TensorFlow 2.0β可以在Colab上很好地執行。
這個概念非常簡單。首先,需要定義一個返回編譯後的Keras模型的建模函式。函式接受一個名為hp的引數作為輸入。透過使用hp,可以定義一個候選值的範圍,對超引數值進行取樣。
然後建立一個調諧器物件。在這種情況下,會實現隨機搜尋策略。最後可以使用search() 開始最佳化。它具有與 fit()相同的簽名。
最後,可以檢查調諧器的結論,並選擇最佳模型。請注意,訓練日誌和模型檢查點都儲存在目錄資料夾(my_logs)中。此外,最小化或最大化目標(驗證精度)的選擇是自動推斷的。
在TF2.0中訓練模型的最簡便方法是使用 fit() 。fit()支援序列化模型和子類化模型。如果使用模型子類化,唯一需要調整的就是重寫compute_output_shape()分類方法。除此之外,應該能夠將fit()與tf.data.Dataset 或標準NumPynd-arrays一起輸入。
但是,如果想清楚地瞭解梯度或丟失的情況,可以使用梯度帶。這在研究中格外有效。
使用梯度帶,就可以手動定義訓練過程的每個步驟。可分別應用於訓練神經網路的每個基本步驟,如:
正推法
損失函式求值
逆推法
梯度下降法
可以直觀地瞭解神經網路是如何訓練的。也可以直接輸出損失值
w.r.t
5. EagerCode的提取效能
如果選擇使用梯度帶進行模型訓練,效能會顯著下降。
執行TF程式碼有助於理解,但效能不佳。為了避免這個問題,TF2.0引入了tf.function。
基本上,如果用tf.function修飾Python函式,TensorFlow會接收函式並將其轉換為一個TF高效能抽象。
這意味著該函式將標記為JIT編輯,以便TensorFlow將其作為圖形執行。因此,可以獲得
TF1.x
簡而言之,TF2.0旨在將程式碼設計為更小的函式。然後,可以使用
tf.function
6.其他方面
首先,向序列化模型或子類化模型新增更多層是非常簡單的。儘管TF覆蓋了Conv2D、TransposeConv2D等層,但總會出現不可用的情況。對於論文再現或研究來說尤為如此。
好訊息是,可以開發自定義層。透過遵循相同的Keras API,可以建立一個類並將其擴充套件到tf.keras.Layer。實際上,可以按照非常相似的模式建立自定義啟用函式、正則化層或測度。
此外,還可以將現有的TensorFlow 1.x程式碼轉換為TF2.0。為此,TF團隊建立了tf_upgrade_v2。
個人認為tf2.0會成為主流
CaffeCaffe是一個清晰而高效的深度學習框架,也是一個被廣泛使用的開源深度學習框架,在Tensorflow出現之前一直是深度學習領域Github star最多的專案。主要優勢為:上手容易,網路結構都是以配置檔案形式定義,不需要用程式碼設計網路。訓練速度快,元件模組化,可以方便的拓展到新的模型和學習任務上。但是Caffe最開始設計時的目標只針對於影象,沒有考慮文字、語音或者時間序列的資料,因此Caffe對卷積神經網路的支援非常好,但是對於時間序列RNN,LSTM等支援的不是特別充分。
Caffe由低到高依次把網路中的資料抽象成Blob, 各層網路抽象成Layer ,整個網路抽象成Net,網路模型的求解方法抽象成Solver。
Blob表示網路中的資料,包括訓練資料,網路各層自身的引數,網路之間傳遞的資料都是透過Blob來實現的,同時Blob資料也支援在CPU與GPU上儲存,能夠在兩者之間做同步。
Layer是對神經網路中各種層的抽象,包括卷積層和下采樣層,還有全連線層和各種啟用函式層等。同時每種Layer都實現了前向傳播和反向傳播,並透過Blob來傳遞資料。
Net是對整個網路的表示,由各種Layer前後連線組合而成,也是所構建的網路模型。
Solver 定義了針對Net網路模型的求解方法,記錄網路的訓練過程,儲存網路模型引數,中斷並恢復網路的訓練過程。自定義Solver能夠實現不同的網路求解方式。
TensorFlow 2.0TensorFlow 2.0中有多處更改,以使TensorFlow使用者使用更高效。TensorFlow 2.0刪除冗餘 APIs,使其更加一致,並透過Eager execution模式更好地與Python整合。
相比於TensorFlow
1.x
,2.0的極大優勢如下1. 預設狀態的Eager Execution
首先,eager execution是執行TF程式碼的預設方式。
為了在TF1.x中構建一個神經網路,需要定義一個名為圖形(Graph)的抽象資料結構。另外,如果試圖列印其中一個圖節點,將看不到期望值,卻可以看到對圖節點的引用。實際上,要執行圖形,需要使用一個名為會話(Session)的封裝。使用Session.run()法,可以將Python資料傳給圖形,並對模型進行實際訓練。
現在,TensorFlow程式碼可以像普通的Python程式碼一樣執行。這意味著可以迅速建立並評估操作。
2. API清理
許多API,如tf.gans、tf.app、tf.contrib、tf.flags,會被清理或移動到單獨的儲存庫。
然而,最重要的清理之一涉及到我們如何構建模型。TF1.x中有超過1或2種不同的構建/訓練ML模型的方法。儘管許多API效能良好,但似乎並沒有收斂出一種通用的開發方式。此外,如果在其中一個API中訓練模型,那麼使用其他API來再利用該程式碼並不簡單。
在TF2.0中,tf.keras是推薦的高階API。可以看到,目前正試圖利用KerasAPI解決所有可能的用例。
3. Keras-Tuner
Keras-tuner是一個對Keras模型進行超引數調整的專用庫。在撰寫本文時,該庫處於α之前的狀態,但是使用tf.keras和TensorFlow 2.0β可以在Colab上很好地執行。
這個概念非常簡單。首先,需要定義一個返回編譯後的Keras模型的建模函式。函式接受一個名為hp的引數作為輸入。透過使用hp,可以定義一個候選值的範圍,對超引數值進行取樣。
然後建立一個調諧器物件。在這種情況下,會實現隨機搜尋策略。最後可以使用search() 開始最佳化。它具有與 fit()相同的簽名。
最後,可以檢查調諧器的結論,並選擇最佳模型。請注意,訓練日誌和模型檢查點都儲存在目錄資料夾(my_logs)中。此外,最小化或最大化目標(驗證精度)的選擇是自動推斷的。
4.定義培訓迴路在TF2.0中訓練模型的最簡便方法是使用 fit() 。fit()支援序列化模型和子類化模型。如果使用模型子類化,唯一需要調整的就是重寫compute_output_shape()分類方法。除此之外,應該能夠將fit()與tf.data.Dataset 或標準NumPynd-arrays一起輸入。
但是,如果想清楚地瞭解梯度或丟失的情況,可以使用梯度帶。這在研究中格外有效。
使用梯度帶,就可以手動定義訓練過程的每個步驟。可分別應用於訓練神經網路的每個基本步驟,如:
正推法
損失函式求值
逆推法
梯度下降法
可以直觀地瞭解神經網路是如何訓練的。也可以直接輸出損失值
w.r.t
、模型權重或梯度向量本身來進行檢查。梯度帶提供了更大的靈活性。但是,就像子類化與序列化一樣,靈活性越大,額外的成本越高。與fit()相比,需要手動定義一個訓練迴路。作為一個自然結果,它使程式碼的漏洞更加突出,並且更難除錯。這是一個很好的折衷,和那些對開發新產品感興趣的研究人員相比,更適合程式碼工程師(尋找標準化的程式碼)。5. EagerCode的提取效能
如果選擇使用梯度帶進行模型訓練,效能會顯著下降。
執行TF程式碼有助於理解,但效能不佳。為了避免這個問題,TF2.0引入了tf.function。
基本上,如果用tf.function修飾Python函式,TensorFlow會接收函式並將其轉換為一個TF高效能抽象。
這意味著該函式將標記為JIT編輯,以便TensorFlow將其作為圖形執行。因此,可以獲得
TF1.x
(圖形)的效能優勢,如節點修剪、核心融合等。簡而言之,TF2.0旨在將程式碼設計為更小的函式。然後,可以使用
tf.function
對所需的程式碼進行標記以獲得額外的效能。最適用於修飾表示最大計算瓶頸的函式。這些通常是訓練迴路或模型的正推。6.其他方面
首先,向序列化模型或子類化模型新增更多層是非常簡單的。儘管TF覆蓋了Conv2D、TransposeConv2D等層,但總會出現不可用的情況。對於論文再現或研究來說尤為如此。
好訊息是,可以開發自定義層。透過遵循相同的Keras API,可以建立一個類並將其擴充套件到tf.keras.Layer。實際上,可以按照非常相似的模式建立自定義啟用函式、正則化層或測度。
此外,還可以將現有的TensorFlow 1.x程式碼轉換為TF2.0。為此,TF團隊建立了tf_upgrade_v2。