PaddlePaddle 是百度自主研發(fā),集深度學(xué)習(xí)核心框架、工具組件和服務(wù)平臺(tái)為一體的開源深度學(xué)習(xí)平臺(tái)。該平臺(tái)技術(shù)領(lǐng)先、功能完備。Paddle Fluid 是 PaddlePaddle 的核心框架,滿足模型開發(fā)、訓(xùn)練、部署的全流程需求。本文將展示如何用 Paddle Fluid API 編程并搭建一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)。
那么,Paddle Fluid 有哪些核心概念?如何在Paddle Fluid 中定義運(yùn)算過程?如何使用executor 運(yùn)行 Paddle Fluid 操作?如何從邏輯層對(duì)實(shí)際問題建模?如何調(diào)用API(層,數(shù)據(jù)集,損失函數(shù),優(yōu)化方法等等)呢?
一、使用Tensor 表示數(shù)據(jù)
Paddle Fluid 和其它主流框架一樣,使用 Tensor 數(shù)據(jù)結(jié)構(gòu)來承載數(shù)據(jù)。Tensor 可以簡單理解成一個(gè)多維數(shù)組,一般而言可以有任意多的維度。不同的 Tensor 可以具有自己的數(shù)據(jù)類型和形狀,同一 Tensor 中每個(gè)元素的數(shù)據(jù)類型是一樣的,Tensor 的形狀就是 Tensor 的維度。
下圖直觀地表示1~6 維的 Tensor:
在Paddle Fluid 中存在三種特殊的 Tensor:
1. 模型中的可學(xué)習(xí)參數(shù):模型中的可學(xué)習(xí)參數(shù)(包括網(wǎng)絡(luò)權(quán)重、偏置等)生存期和整個(gè)訓(xùn)練任務(wù)一樣長,會(huì)接受優(yōu)化算法的更新,在Paddle Fluid 中以 Variable 的子類 Parameter 表示。
在Paddle Fluid 中可以通過 fluid.layers.create_parameter 來創(chuàng)建可學(xué)習(xí)參數(shù):
一般情況下,您不需要自己來創(chuàng)建網(wǎng)絡(luò)中的可學(xué)習(xí)參數(shù),Paddle Fluid 為大部分常見的神經(jīng)網(wǎng)絡(luò)基本計(jì)算模塊都提供了封裝。以最簡單的全連接模型為例,下面的代碼片段會(huì)直接為全連接層創(chuàng)建連接權(quán)值(W)和偏置(bias)兩個(gè)可學(xué)習(xí)參數(shù),無需顯式地調(diào)用 Parameter 相關(guān)接口來創(chuàng)建。
2.輸入輸出 Tensor:整個(gè)神經(jīng)網(wǎng)絡(luò)的輸入數(shù)據(jù)也是一個(gè)特殊的Tensor,在這個(gè) Tensor 中,一些維度的大小在定義模型時(shí)無法確定(通常包括:batch size,如果 mini-batch 之間數(shù)據(jù)可變,也會(huì)包括圖片的寬度和高度等),在定義模型時(shí)需要占位。
Paddle Fluid 中使用 fluid.layers.data 來接收輸入數(shù)據(jù),fluid.layers.data 需要提供輸入 Tensor 的形狀信息,當(dāng)遇到無法確定的維度時(shí),相應(yīng)維度指定為 None 或 -1,如下面的代碼片段所示:
其中,dtype="int64" 表示有符號(hào) 64 位整數(shù)數(shù)據(jù)類型,更多 Paddle Fluid 目前支持的數(shù)據(jù)類型請(qǐng)?jiān)诠倬W(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 來實(shí)現(xiàn)常量 Tensor,用戶可以指定 Tensor 的形狀,數(shù)據(jù)類型和常量值。代碼實(shí)現(xiàn)如下所示:
需要注意的是,上述定義的tensor 并不具有值,它們僅表示將要執(zhí)行的操作,如您直接打印 data 將會(huì)得到描述該 data 的一段信息:
輸出結(jié)果:
具體輸出數(shù)值將在Executor 運(yùn)行時(shí)得到,詳細(xì)過程會(huì)在后文展開描述。
數(shù)據(jù)傳入
Paddle Fluid 有特定的數(shù)據(jù)傳入方式:
您需要使用fluid.layers.data 配置數(shù)據(jù)輸入層,并在 fluid.Executor 或 fluid.ParallelExecutor 中,使用 executor.run(feed=...) 傳入訓(xùn)練數(shù)據(jù)。
具體的數(shù)據(jù)準(zhǔn)備過程,您可以閱讀官網(wǎng)使用指南「準(zhǔn)備數(shù)據(jù)」章節(jié)。
使用Operator 表示對(duì)數(shù)據(jù)的操作
在Paddle Fluid 中,所有對(duì)數(shù)據(jù)的操作都由 Operator 表示,您可以使用內(nèi)置指令來描述它們的神經(jīng)網(wǎng)絡(luò)。為了便于用戶使用,在 Python 端,Paddle Fluid 中的 Operator 被一步封裝入 paddle.fluid.layers,paddle.fluid.nets 等模塊。這是因?yàn)橐恍┏R姷膶?duì) Tensor 的操作可能是由更多基礎(chǔ)操作構(gòu)成,為了提高使用的便利性,框架內(nèi)部對(duì)基礎(chǔ) Operator 進(jìn)行了一些封裝,包括創(chuàng)建 Operator 依賴可學(xué)習(xí)參數(shù),可學(xué)習(xí)參數(shù)的初始化細(xì)節(jié)等,減少用戶重復(fù)開發(fā)的成本。例如用戶可以利用 paddle.fluid.layers.elementwise_add() 實(shí)現(xiàn)兩個(gè)輸入 Tensor 的加法運(yùn)算:
輸出結(jié)果:
本次運(yùn)行時(shí),輸入a=7,b=3,得到 outs=10。
您可以復(fù)制這段代碼在本地執(zhí)行,根據(jù)指示輸入其它數(shù)值觀察計(jì)算結(jié)果。
如果想獲取網(wǎng)絡(luò)執(zhí)行過程中的a,b 的具體值,可以將希望查看的變量添加在 fetch_list 中。
輸出結(jié)果:
使用Program 描述神經(jīng)網(wǎng)絡(luò)模型
Paddle Fluid 不同于其它大部分深度學(xué)習(xí)框架,去掉了靜態(tài)計(jì)算圖的概念,代之以 Program 的形式動(dòng)態(tài)描述計(jì)算過程。這種動(dòng)態(tài)的計(jì)算描述方式兼具網(wǎng)絡(luò)結(jié)構(gòu)修改的靈活性和模型搭建的便捷性,在保證性能的同時(shí)極大地提高了框架對(duì)模型的表達(dá)能力。
開發(fā)者的所有Operator 都將寫入 Program,在 Paddle Fluid 內(nèi)部將自動(dòng)轉(zhuǎn)化為一種叫作 ProgramDesc 的描述語言,Program 的定義過程就像在寫一段通用程序,有開發(fā)經(jīng)驗(yàn)的用戶在使用 Paddle Fluid 時(shí),會(huì)很自然的將自己的知識(shí)遷移過來。
其中,Paddle Fluid 通過提供順序、分支和循環(huán)三種執(zhí)行結(jié)構(gòu)的支持,讓用戶可以通過組合描述任意復(fù)雜的模型。
順序執(zhí)行:
用戶可以使用順序執(zhí)行的方式搭建網(wǎng)絡(luò):
條件分支——switch、if else:
Paddle Fluid 中有 switch 和 if-else 類來實(shí)現(xiàn)條件選擇,用戶可以使用這一執(zhí)行結(jié)構(gòu)在學(xué)習(xí)率調(diào)節(jié)器中調(diào)整學(xué)習(xí)率或其它希望的操作:
關(guān)于Paddle Fluid 中 Program 的詳細(xì)設(shè)計(jì)思想,可以參考閱讀官網(wǎng)進(jìn)階使用「設(shè)計(jì)思想」中更多 Fluid 中的控制流,可以參考閱讀 API 文檔。
使用Executor 執(zhí)行 Program
Paddle Fluid 的設(shè)計(jì)思想類似于高級(jí)編程語言 C++和 JAVA 等。程序的執(zhí)行過程被分為編譯和執(zhí)行兩個(gè)階段。用戶完成對(duì) Program 的定義后,Executor 接受這段 Program 并轉(zhuǎn)化為 C++后端真正可執(zhí)行的 FluidProgram,這一自動(dòng)完成的過程叫做編譯。編譯過后需要 Executor 來執(zhí)行這段編譯好的 FluidProgram。例如上文實(shí)現(xiàn)的加法運(yùn)算,當(dāng)構(gòu)建好 Program 后,需要?jiǎng)?chuàng)建 Executor,進(jìn)行初始化 Program 和訓(xùn)練 Program:
代碼實(shí)例
您已經(jīng)對(duì)Paddle Fluid 核心概念有了初步認(rèn)識(shí)了,不妨嘗試配置一個(gè)簡單的網(wǎng)絡(luò)吧。如果感興趣的話可以跟隨本部分,完成一個(gè)非常簡單的數(shù)據(jù)預(yù)測(cè)。
從邏輯層面明確了輸入數(shù)據(jù)格式、模型結(jié)構(gòu)、損失函數(shù)以及優(yōu)化算法后,需要使用Paddle Fluid 提供的 API 及算子來實(shí)現(xiàn)模型邏輯。一個(gè)典型的模型主要包含 4 個(gè)部分,分別是:輸入數(shù)據(jù)格式定義,模型前向計(jì)算邏輯,損失函數(shù)以及優(yōu)化算法。
1、問題描述:給定一組數(shù)據(jù)
2、定義數(shù)據(jù):假設(shè)輸入數(shù)據(jù)X=[1 2 3 4],Y=[2,4,6,8],在網(wǎng)絡(luò)中定義:
3、搭建網(wǎng)絡(luò)(定義前向計(jì)算邏輯):接下來需要定義預(yù)測(cè)值與輸入的關(guān)系,本次使用一個(gè)簡單的線性回歸函數(shù)進(jìn)行預(yù)測(cè):
這樣的網(wǎng)絡(luò)就可以進(jìn)行預(yù)測(cè)了,雖然輸出結(jié)果只是一組隨機(jī)數(shù),離預(yù)期結(jié)果仍相差甚遠(yuǎn):
輸出結(jié)果:
4、添加損失函數(shù):完成模型搭建后,如何評(píng)估預(yù)測(cè)結(jié)果的好壞呢?我們通常在設(shè)計(jì)的網(wǎng)絡(luò)中添加損失函數(shù),以計(jì)算真實(shí)值與預(yù)測(cè)值的差。在本例中,損失函數(shù)采用均方差函數(shù):
輸出一輪計(jì)算后的預(yù)測(cè)值和損失函數(shù):
輸出結(jié)果:
可以看到第一輪計(jì)算后的損失函數(shù)為9.0,仍有很大的下降空間。
5、網(wǎng)絡(luò)優(yōu)化:確定損失函數(shù)后,可以通過前向計(jì)算得到損失值,然后通過鏈?zhǔn)角髮?dǎo)法則得到參數(shù)的梯度值。獲取梯度值后需要更新參數(shù),最簡單的算法是隨機(jī)梯度下降法:w=w−η⋅g,由 fluid.optimizer.SGD 實(shí)現(xiàn):
讓我們的網(wǎng)絡(luò)訓(xùn)練100 次,查看結(jié)果:
輸出結(jié)果:
可以看到100 次迭代后,預(yù)測(cè)值已經(jīng)非常接近真實(shí)值了,損失值也從初始值 9.05 下降到了 0.01。至此,恭喜您!已經(jīng)成功使用 PaddlePaddle 核心框架 Paddle Fluid 搭建了一個(gè)簡單網(wǎng)絡(luò)。如果您還想嘗試更多,可以從官網(wǎng)繼續(xù)閱讀相關(guān)的文檔及更多豐富的模型實(shí)例。
參考:
PaddlePaddle 項(xiàng)目地址:https://github.com/PaddlePaddle
PaddlePaddle 官網(wǎng)使用指南地址:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/index_cn.html
- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長
- 本田與日產(chǎn)醞釀合并:明年6月敲定協(xié)議,新公司社長待本田推薦
- 金融大模型新突破:百川智能Baichuan4-Finance引領(lǐng)行業(yè),準(zhǔn)確率領(lǐng)先GPT-4近20%,變革金融業(yè)未來
- 博通CEO陳福陽回應(yīng):忙于AI半導(dǎo)體業(yè)務(wù),暫無意收購英特爾,拒絕巨頭誘惑?
- 法拉第未來再獲融資,下月亮相首款原型車,或?qū)㈤_啟新篇章
- 央視揭露:未成年租號(hào)游戲亂象,防沉迷形同虛設(shè),需警惕
- 三星內(nèi)存部門發(fā)放超級(jí)績效獎(jiǎng)金,最高漲薪200%,員工福利再升級(jí)
- LG新能源南京總部啟動(dòng),智能電池生產(chǎn)引領(lǐng)綠色未來
- 東芝涅槃:退市裁員后重回盈利,改革之路如何重塑輝煌?
- 大眾汽車管理層降薪風(fēng)暴:獎(jiǎng)金縮水,未來兩年減薪10%,求真還需看業(yè)績表現(xiàn)
- 知乎預(yù)測(cè)未來:黑神話悟空領(lǐng)銜,諾貝爾物理學(xué)獎(jiǎng)成焦點(diǎn)
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。