《PaddlePaddle從入門到煉丹》二——計算1+1
前言
在第一章介紹了百度AI Studio這個平臺,接下來我們就使用這個平臺來開發我們的PaddlePaddle。PaddlePaddle是百度在2016年9月27日開源的一個深度學習框架,也是目前國內唯一一個開源的深度學習框架。PaddlePaddle在0.11.0版本之後,開始推出Fluid版本,Fluid版本相對之前的V2版本,Fluid的程式碼結構更加清晰,使用起來更加方便。這本章中我們將會介紹如何使用PaddlePaddle來計算1+1,選擇這個簡單的例子主要是為了讓讀者瞭解PaddlePaddle的Fluid版本的使用,掌握PaddlePaddle的使用流程。我們講過介紹如何使用PaddlePaddle定義一個張量和如何對張量進行計算。
計算常量的1+1
PaddlePaddle類似一個科學計算庫,比如Python下我們使用的numpy,提供的大量的計算操作,但是PaddlePaddle的計算物件是張量。我們下面就使用PaddlePaddle計算一個[[1, 1], [1, 1]] * [[1, 1], [1, 1]]
。
首先匯入PaddlePaddle庫,大部分的API都在paddle.fluid
下。
import paddle.fluid as fluid
定義兩個張量的常量x1和x2,並指定它們的形狀是[2, 2],並賦值為1鋪滿整個張量,型別為int64.
# 定義兩個張量
x1 = fluid.layers.fill_constant( shape=[2, 2], value=1, dtype='int64')
x2 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
接著定義一個操作,該計算是將上面兩個張量進行加法計算,並返回一個求和的運算元。PaddlePaddle提供了大量的操作,比如加減乘除、三角函式等,讀者可以在fluid.layers
找到。
# 將兩個張量求和
y1 = fluid.layers.sum(x=[x1, x2])
然後建立一個直譯器,可以在這裡指定計算使用CPU或GPU。當使用CPUPlace()
時使用的是CPU,如果是CUDAPlace()
program
也是要使用到解析器的,因為只有解析器才能執行program
。
# 建立一個使用CPU的直譯器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 進行引數初始化
exe.run(fluid.default_startup_program())
最後執行計算,program
的引數值是主程式,不是上一步使用的是初始化引數的程式,program
預設一共有兩個,分別是default_startup_program()
和default_main_program()
。fetch_list
引數的值是在解析器在run之後要輸出的值,我們要輸出計算加法之後輸出結果值。最後計算得到的也是一個張量。
# 進行運算,並把y的結果輸出
result = exe.run(program=fluid.default_main_program(),
fetch_list=[y1])
print(result)
計算變數的1+1
上面計算的是張量常量的1+1,並不能隨意修改常量的值,所以下面我們要編寫一個使用張量變數作為乘數的程式,類似是一個佔位符,等到將要計算時,再把要計算的值新增到佔位符中進行計算。
匯入PaddlePaddle庫和numpy的庫。
import paddle.fluid as fluid
import numpy as np
定義兩個張量,並不指定該張量的形狀和值,它們是之後動態賦值的。這裡只是指定它們的型別和名字,這個名字是我們之後賦值的關鍵。
# 定義兩個張量
a = fluid.layers.create_tensor(dtype='int64', name='a')
b = fluid.layers.create_tensor(dtype='int64', name='b')
使用同樣的方式,定義這個兩個張量的加法操作。
# 將兩個張量求和
y = fluid.layers.sum(x=[a, b])
這裡我們同樣是建立一個使用CPU的解析器,和進行引數初始化。
# 建立一個使用CPU的直譯器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 進行引數初始化
exe.run(fluid.default_startup_program())
然後使用numpy建立兩個張量值,之後我們要計算的就是這兩個值。
# 定義兩個要計算的變數
a1 = np.array([3, 2]).astype('int64')
b1 = np.array([1, 1]).astype('int64')
這次exe.run()
的引數有點不一樣了,多了一個feed
引數,這個就是要對張量變數進行賦值的。賦值的方式是使用了鍵值對的格式,key是定義張量變數是指定的名稱,value就是要傳遞的值。在fetch_list
引數中,筆者希望把a, b, y
的值都輸出來,所以要使用3個變數來接受返回值。
# 進行運算,並把y的結果輸出
out_a, out_b, result = exe.run(program=fluid.default_main_program(),
feed={'a': a1, 'b': b1},
fetch_list=[a, b, y])
print(out_a, " + ", out_b," = ", result)
到處為止,本章就結束了。在本章我們學會了PaddlePaddle的使用方式,那在下一章我們使用PaddlePaddle完成我們的第一個安裝——線性迴歸,我們下章見。