你的項目還用Caffe嗎?
個人認為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。