PaddlePaddle 是百度自主研發(fā),集深度學習核心框架、工具組件和服務平臺為一體的開源深度學習平臺。該平臺技術領先、功能完備。Paddle Fluid 是 PaddlePaddle 的核心框架,滿足模型開發(fā)、訓練、部署的全流程需求。本文將展示如何用 Paddle Fluid API 編程并搭建一個簡單的神經(jīng)網(wǎng)絡。
那么,Paddle Fluid 有哪些核心概念?如何在Paddle Fluid 中定義運算過程?如何使用executor 運行 Paddle Fluid 操作?如何從邏輯層對實際問題建模?如何調(diào)用API(層,數(shù)據(jù)集,損失函數(shù),優(yōu)化方法等等)呢?
一、使用Tensor 表示數(shù)據(jù)
Paddle Fluid 和其它主流框架一樣,使用 Tensor 數(shù)據(jù)結構來承載數(shù)據(jù)。Tensor 可以簡單理解成一個多維數(shù)組,一般而言可以有任意多的維度。不同的 Tensor 可以具有自己的數(shù)據(jù)類型和形狀,同一 Tensor 中每個元素的數(shù)據(jù)類型是一樣的,Tensor 的形狀就是 Tensor 的維度。
下圖直觀地表示1~6 維的 Tensor:
在Paddle Fluid 中存在三種特殊的 Tensor:
1. 模型中的可學習參數(shù):模型中的可學習參數(shù)(包括網(wǎng)絡權重、偏置等)生存期和整個訓練任務一樣長,會接受優(yōu)化算法的更新,在Paddle Fluid 中以 Variable 的子類 Parameter 表示。
在Paddle Fluid 中可以通過 fluid.layers.create_parameter 來創(chuàng)建可學習參數(shù):
一般情況下,您不需要自己來創(chuàng)建網(wǎng)絡中的可學習參數(shù),Paddle Fluid 為大部分常見的神經(jīng)網(wǎng)絡基本計算模塊都提供了封裝。以最簡單的全連接模型為例,下面的代碼片段會直接為全連接層創(chuàng)建連接權值(W)和偏置(bias)兩個可學習參數(shù),無需顯式地調(diào)用 Parameter 相關接口來創(chuàng)建。
2.輸入輸出 Tensor:整個神經(jīng)網(wǎng)絡的輸入數(shù)據(jù)也是一個特殊的Tensor,在這個 Tensor 中,一些維度的大小在定義模型時無法確定(通常包括:batch size,如果 mini-batch 之間數(shù)據(jù)可變,也會包括圖片的寬度和高度等),在定義模型時需要占位。
Paddle Fluid 中使用 fluid.layers.data 來接收輸入數(shù)據(jù),fluid.layers.data 需要提供輸入 Tensor 的形狀信息,當遇到無法確定的維度時,相應維度指定為 None 或 -1,如下面的代碼片段所示:
其中,dtype="int64" 表示有符號 64 位整數(shù)數(shù)據(jù)類型,更多 Paddle Fluid 目前支持的數(shù)據(jù)類型請在官網(wǎng)查閱:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/howto/prepare_data/feeding_data.html#fluid。
3.常量 Tensor:Paddle Fluid 通過 fluid.layers.fill_constant 來實現(xiàn)常量 Tensor,用戶可以指定 Tensor 的形狀,數(shù)據(jù)類型和常量值。代碼實現(xiàn)如下所示:
需要注意的是,上述定義的tensor 并不具有值,它們僅表示將要執(zhí)行的操作,如您直接打印 data 將會得到描述該 data 的一段信息:
輸出結果:
具體輸出數(shù)值將在Executor 運行時得到,詳細過程會在后文展開描述。
數(shù)據(jù)傳入
Paddle Fluid 有特定的數(shù)據(jù)傳入方式:
您需要使用fluid.layers.data 配置數(shù)據(jù)輸入層,并在 fluid.Executor 或 fluid.ParallelExecutor 中,使用 executor.run(feed=...) 傳入訓練數(shù)據(jù)。
具體的數(shù)據(jù)準備過程,您可以閱讀官網(wǎng)使用指南「準備數(shù)據(jù)」章節(jié)。
使用Operator 表示對數(shù)據(jù)的操作
在Paddle Fluid 中,所有對數(shù)據(jù)的操作都由 Operator 表示,您可以使用內(nèi)置指令來描述它們的神經(jīng)網(wǎng)絡。為了便于用戶使用,在 Python 端,Paddle Fluid 中的 Operator 被一步封裝入 paddle.fluid.layers,paddle.fluid.nets 等模塊。這是因為一些常見的對 Tensor 的操作可能是由更多基礎操作構成,為了提高使用的便利性,框架內(nèi)部對基礎 Operator 進行了一些封裝,包括創(chuàng)建 Operator 依賴可學習參數(shù),可學習參數(shù)的初始化細節(jié)等,減少用戶重復開發(fā)的成本。例如用戶可以利用 paddle.fluid.layers.elementwise_add() 實現(xiàn)兩個輸入 Tensor 的加法運算:
輸出結果:
本次運行時,輸入a=7,b=3,得到 outs=10。
您可以復制這段代碼在本地執(zhí)行,根據(jù)指示輸入其它數(shù)值觀察計算結果。
如果想獲取網(wǎng)絡執(zhí)行過程中的a,b 的具體值,可以將希望查看的變量添加在 fetch_list 中。
輸出結果:
使用Program 描述神經(jīng)網(wǎng)絡模型
Paddle Fluid 不同于其它大部分深度學習框架,去掉了靜態(tài)計算圖的概念,代之以 Program 的形式動態(tài)描述計算過程。這種動態(tài)的計算描述方式兼具網(wǎng)絡結構修改的靈活性和模型搭建的便捷性,在保證性能的同時極大地提高了框架對模型的表達能力。
開發(fā)者的所有Operator 都將寫入 Program,在 Paddle Fluid 內(nèi)部將自動轉化為一種叫作 ProgramDesc 的描述語言,Program 的定義過程就像在寫一段通用程序,有開發(fā)經(jīng)驗的用戶在使用 Paddle Fluid 時,會很自然的將自己的知識遷移過來。
其中,Paddle Fluid 通過提供順序、分支和循環(huán)三種執(zhí)行結構的支持,讓用戶可以通過組合描述任意復雜的模型。
順序執(zhí)行:
用戶可以使用順序執(zhí)行的方式搭建網(wǎng)絡:
條件分支——switch、if else:
Paddle Fluid 中有 switch 和 if-else 類來實現(xiàn)條件選擇,用戶可以使用這一執(zhí)行結構在學習率調(diào)節(jié)器中調(diào)整學習率或其它希望的操作:
關于Paddle Fluid 中 Program 的詳細設計思想,可以參考閱讀官網(wǎng)進階使用「設計思想」中更多 Fluid 中的控制流,可以參考閱讀 API 文檔。
使用Executor 執(zhí)行 Program
Paddle Fluid 的設計思想類似于高級編程語言 C++和 JAVA 等。程序的執(zhí)行過程被分為編譯和執(zhí)行兩個階段。用戶完成對 Program 的定義后,Executor 接受這段 Program 并轉化為 C++后端真正可執(zhí)行的 FluidProgram,這一自動完成的過程叫做編譯。編譯過后需要 Executor 來執(zhí)行這段編譯好的 FluidProgram。例如上文實現(xiàn)的加法運算,當構建好 Program 后,需要創(chuàng)建 Executor,進行初始化 Program 和訓練 Program:
代碼實例
您已經(jīng)對Paddle Fluid 核心概念有了初步認識了,不妨嘗試配置一個簡單的網(wǎng)絡吧。如果感興趣的話可以跟隨本部分,完成一個非常簡單的數(shù)據(jù)預測。
從邏輯層面明確了輸入數(shù)據(jù)格式、模型結構、損失函數(shù)以及優(yōu)化算法后,需要使用Paddle Fluid 提供的 API 及算子來實現(xiàn)模型邏輯。一個典型的模型主要包含 4 個部分,分別是:輸入數(shù)據(jù)格式定義,模型前向計算邏輯,損失函數(shù)以及優(yōu)化算法。
1、問題描述:給定一組數(shù)據(jù)
2、定義數(shù)據(jù):假設輸入數(shù)據(jù)X=[1 2 3 4],Y=[2,4,6,8],在網(wǎng)絡中定義:
3、搭建網(wǎng)絡(定義前向計算邏輯):接下來需要定義預測值與輸入的關系,本次使用一個簡單的線性回歸函數(shù)進行預測:
這樣的網(wǎng)絡就可以進行預測了,雖然輸出結果只是一組隨機數(shù),離預期結果仍相差甚遠:
輸出結果:
4、添加損失函數(shù):完成模型搭建后,如何評估預測結果的好壞呢?我們通常在設計的網(wǎng)絡中添加損失函數(shù),以計算真實值與預測值的差。在本例中,損失函數(shù)采用均方差函數(shù):
輸出一輪計算后的預測值和損失函數(shù):
輸出結果:
可以看到第一輪計算后的損失函數(shù)為9.0,仍有很大的下降空間。
5、網(wǎng)絡優(yōu)化:確定損失函數(shù)后,可以通過前向計算得到損失值,然后通過鏈式求導法則得到參數(shù)的梯度值。獲取梯度值后需要更新參數(shù),最簡單的算法是隨機梯度下降法:w=w−η⋅g,由 fluid.optimizer.SGD 實現(xiàn):
讓我們的網(wǎng)絡訓練100 次,查看結果:
輸出結果:
可以看到100 次迭代后,預測值已經(jīng)非常接近真實值了,損失值也從初始值 9.05 下降到了 0.01。至此,恭喜您!已經(jīng)成功使用 PaddlePaddle 核心框架 Paddle Fluid 搭建了一個簡單網(wǎng)絡。如果您還想嘗試更多,可以從官網(wǎng)繼續(xù)閱讀相關的文檔及更多豐富的模型實例。
參考:
PaddlePaddle 項目地址:https://github.com/PaddlePaddle
PaddlePaddle 官網(wǎng)使用指南地址:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/index_cn.html
- 蜜度索驥:以跨模態(tài)檢索技術助力“企宣”向上生長
- 網(wǎng)信辦嚴打網(wǎng)絡侵害未成年人行為,守護成長新篇章
- 豆包大模型升級引爆股市,字節(jié)緊急警示:小心為上
- 小米YU7無偽裝實車首次曝光引熱議,小紅書封號事件沖上熱搜,科技圈又掀波瀾?
- 警惕討好型人格:賺錢路上,人格魅力并非一切
- 小米SUV墜崖一家四口奇跡生還,車主回應:別夸大其詞
- 金融AI大模型新突破:奇富科技AI產(chǎn)品小奇引領行業(yè),重塑金融未來
- 谷歌攜手Apptronik,AI+機器人引領未來:商業(yè)化人形機器人新紀元
- AI盛宴即將上演!李想回歸,理想汽車12月25日揭秘未來駕駛新篇章
- 特斯拉Model Y勁敵來襲!明年登陸英國市場的未來樂道L60引爆期待
- 火山引擎總裁回應豆包大模型定價:如何確保合理毛利,揭秘行業(yè)內(nèi)幕
免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權或存在不實內(nèi)容時,應及時向本網(wǎng)站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內(nèi)容或斷開相關鏈接。