當前位置:
首頁 > 知識 > 如何用Paddle Fluid API搭建一個簡單的神經網路?這裡有一份編程指南

如何用Paddle Fluid API搭建一個簡單的神經網路?這裡有一份編程指南

機器之心發布

機器之心編輯部

PaddlePaddle 是百度自主研發,集深度學習核心框架、工具組件和服務平台為一體的開源深度學習平台。該平台技術領先、功能完備。Paddle Fluid 是 PaddlePaddle 的核心框架,滿足模型開發、訓練、部署的全流程需求。本文將展示如何用 Paddle Fluid API 編程並搭建一個簡單的神經網路。

本文將介紹:

Paddle Fluid 有哪些核心概念

如何在 Paddle Fluid 中定義運算過程

如何使用 executor 運行 Paddle Fluid 操作

如何從邏輯層對實際問題建模

如何調用 API(層,數據集,損失函數,優化方法等等)

使用 Tensor 表示數據

Paddle Fluid 和其它主流框架一樣,使用 Tensor 數據結構來承載數據。Tensor 可以簡單理解成一個多維數組,一般而言可以有任意多的維度。不同的 Tensor 可以具有自己的數據類型和形狀,同一 Tensor 中每個元素的數據類型是一樣的,Tensor 的形狀就是 Tensor 的維度。

下圖直觀地表示 1~6 維的 Tensor:

在 Paddle Fluid 中存在三種特殊的 Tensor:

1. 模型中的可學習參數

模型中的可學習參數(包括網路權重、偏置等)生存期和整個訓練任務一樣長,會接受優化演算法的更新,在 Paddle Fluid 中以 Variable 的子類 Parameter 表示。

一般情況下,您不需要自己來創建網路中的可學習參數,Paddle Fluid 為大部分常見的神經網路基本計算模塊都提供了封裝。以最簡單的全連接模型為例,下面的代碼片段會直接為全連接層創建連接權值(W)和偏置(bias)兩個可學習參數,無需顯式地調用 Parameter 相關介面來創建。

2. 輸入輸出 Tensor

整個神經網路的輸入數據也是一個特殊的 Tensor,在這個 Tensor 中,一些維度的大小在定義模型時無法確定(通常包括:batch size,如果 mini-batch 之間數據可變,也會包括圖片的寬度和高度等),在定義模型時需要佔位。

其中,dtype="int64" 表示有符號 64 位整數數據類型,更多 Paddle Fluid 目前支持的數據類型請在官網查閱:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/howto/prepare_data/feeding_data.html#fluid。

3. 常量 Tensor

需要注意的是,上述定義的 tensor 並不具有值,它們僅表示將要執行的操作,如您直接列印 data 將會得到描述該 data 的一段信息:

輸出結果:

具體輸出數值將在 Executor 運行時得到,詳細過程會在後文展開描述。

數據傳入

Paddle Fluid 有特定的數據傳入方式:

具體的數據準備過程,您可以閱讀官網使用指南「準備數據」章節。

使用 Operator 表示對數據的操作

輸出結果:

本次運行時,輸入 a=7,b=3,得到 outs=10。

您可以複製這段代碼在本地執行,根據指示輸入其它數值觀察計算結果。

如果想獲取網路執行過程中的 a,b 的具體值,可以將希望查看的變數添加在 fetch_list 中。

輸出結果:

使用 Program 描述神經網路模型

Paddle Fluid 不同於其它大部分深度學習框架,去掉了靜態計算圖的概念,代之以 Program 的形式動態描述計算過程。這種動態的計算描述方式兼具網路結構修改的靈活性和模型搭建的便捷性,在保證性能的同時極大地提高了框架對模型的表達能力。

開發者的所有 Operator 都將寫入 Program,在 Paddle Fluid 內部將自動轉化為一種叫作 ProgramDesc 的描述語言,Program 的定義過程就像在寫一段通用程序,有開發經驗的用戶在使用 Paddle Fluid 時,會很自然的將自己的知識遷移過來。

其中,Paddle Fluid 通過提供順序、分支和循環三種執行結構的支持,讓用戶可以通過組合描述任意複雜的模型。

順序執行:

用戶可以使用順序執行的方式搭建網路:

條件分支——switch、if else:

Paddle Fluid 中有 switch 和 if-else 類來實現條件選擇,用戶可以使用這一執行結構在學習率調節器中調整學習率或其它希望的操作:

關於 Paddle Fluid 中 Program 的詳細設計思想,可以參考閱讀官網進階使用「設計思想」中更多 Fluid 中的控制流,可以參考閱讀 API 文檔。

使用 Executor 執行 Program

Paddle Fluid 的設計思想類似於高級編程語言 C 和 JAVA 等。程序的執行過程被分為編譯和執行兩個階段。用戶完成對 Program 的定義後,Executor 接受這段 Program 並轉化為 C 後端真正可執行的 FluidProgram,這一自動完成的過程叫做編譯。編譯過後需要 Executor 來執行這段編譯好的 FluidProgram。例如上文實現的加法運算,當構建好 Program 後,需要創建 Executor,進行初始化 Program 和訓練 Program:

代碼實例

您已經對 Paddle Fluid 核心概念有了初步認識了,不妨嘗試配置一個簡單的網路吧。如果感興趣的話可以跟隨本部分,完成一個非常簡單的數據預測。

從邏輯層面明確了輸入數據格式、模型結構、損失函數以及優化演算法後,需要使用 Paddle Fluid 提供的 API 及運算元來實現模型邏輯。一個典型的模型主要包含 4 個部分,分別是:輸入數據格式定義,模型前向計算邏輯,損失函數以及優化演算法。

1、問題描述

給定一組數據 ,求解出函數 f,使得 y=f(x),其中 X,Y 均為一維張量。最終網路可以依據輸入 x,準確預測出 y_predict。

2、定義數據

假設輸入數據 X=[1 2 3 4],Y=[2,4,6,8],在網路中定義:

3、搭建網路(定義前向計算邏輯)

接下來需要定義預測值與輸入的關係,本次使用一個簡單的線性回歸函數進行預測:

這樣的網路就可以進行預測了,雖然輸出結果只是一組隨機數,離預期結果仍相差甚遠:

輸出結果:

4、添加損失函數

完成模型搭建後,如何評估預測結果的好壞呢?我們通常在設計的網路中添加損失函數,以計算真實值與預測值的差。

在本例中,損失函數採用均方差函數:

輸出一輪計算後的預測值和損失函數:

輸出結果:

可以看到第一輪計算後的損失函數為 9.0,仍有很大的下降空間。

5、網路優化

確定損失函數後,可以通過前向計算得到損失值,然後通過鏈式求導法則得到參數的梯度值。

獲取梯度值後需要更新參數,最簡單的演算法是隨機梯度下降法:w=w?η?g,由 fluid.optimizer.SGD 實現:

讓我們的網路訓練 100 次,查看結果:

輸出結果:

可以看到 100 次迭代後,預測值已經非常接近真實值了,損失值也從初始值 9.05 下降到了 0.01。

至此,恭喜您!已經成功使用 PaddlePaddle 核心框架 Paddle Fluid 搭建了一個簡單網路。如果您還想嘗試更多,可以從官網繼續閱讀相關的文檔及更多豐富的模型實例。

PaddlePaddle 項目地址:https://github.com/PaddlePaddle

PaddlePaddle 官網使用指南地址:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/index_cn.html?from=paddlenav

本文為機器之心發布,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

清華AI研究院里程碑事件:成立「智能人機交互研究中心」,發布四大開放平台

TAG:機器之心 |