日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新手第四课-PaddlePaddle快速入门

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新手第四课-PaddlePaddle快速入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

新手第四課-PaddlePaddle快速入門

文章目錄

  • 新手第四課-PaddlePaddle快速入門
    • PaddlePaddle基礎命令
      • 計算常量的加法:1+1
      • 計算變量的加法:1+1
    • 使用PaddlePaddle做線性回歸

PaddlePaddle基礎命令

PaddlePaddle是百度開源的深度學習框架,類似的深度學習框架還有谷歌的 Tensorflow、Facebook的 Pytorch等,在入門深度學習時,學會并使用一門常見的框架,可以讓學習效率大大提升。

在 PaddlePaddle中,計算的對象是張量,我們可以先使用PaddlePaddle來計算一個[[1, 1], [1, 1]] * [[1, 1], [1, 1]]。

計算常量的加法:1+1

首先導入 PaddlePaddle庫

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()使用的是GPU。解析器是之后使用它來進行計算過的,比如在執行計算之前我們要先執行參數初始化的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)

計算結果為:[array([[2, 2], [2, 2]])]

計算變量的加法: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)

計算結果為:[3 2] + [1 1] = [4 3]

使用PaddlePaddle做線性回歸

在上面的教學中,教大家學會用PaddlePaddle做基本的算子運算,下面來教大家如何用PaddlePaddle來做簡單的線性回歸,包括從定義網絡到使用自定義的數據進行訓練,最后驗證我們網絡的預測能力。

首先導入PaddlePaddle庫和一些工具類庫。

import paddle.fluid as fluid import paddle import numpy as np

定義一個簡單的線性網絡,這個網絡非常簡單,結構是:輸出層–>>隱層–>>輸出層__,這個網絡一共有2層,因為輸入層不算網絡的層數。更具體的就是一個大小為100,激活函數是ReLU的全連接層和一個輸出大小為1的全連接層,就這樣構建了一個非常簡單的網絡。這里使用輸入fluid.layers.data()定義的輸入層類似fluid.layers.create_tensor(),也是有name屬性,之后也是根據這個屬性來填充數據的。這里定義輸入層的形狀為13,這是因為波士頓房價數據集的每條數據有13個屬性,我們之后自定義的數據集也是為了符合這一個維度。

# 定義一個簡單的線性網絡 x = fluid.layers.data(name='x', shape=[13], dtype='float32') hidden = fluid.layers.fc(input=x, size=100, act='relu') net = fluid.layers.fc(input=hidden, size=1, act=None)

接著定義神經網絡的損失函數,這里同樣使用了fluid.layers.data()這個接口,這個可以理解為數據對應的結果,上面name為x的fluid.layers.data()為屬性數據。這里使用了平方差損失函數(square_error_cost),PaddlePaddle提供了很多的損失函數的接口,比如交叉熵損失函數(cross_entropy)。因為本項目是一個線性回歸任務,所以我們使用的是平方差損失函數。因為fluid.layers.square_error_cost()求的是一個Batch的損失值,所以我們還要對他求一個平均值。

# 定義損失函數 y = fluid.layers.data(name='y', shape=[1], dtype='float32') cost = fluid.layers.square_error_cost(input=net, label=y) avg_cost = fluid.layers.mean(cost)

定義損失函數之后,可以在主程序(fluid.default_main_program)中克隆一個程序作為預測程序,用于訓練完成之后使用這個預測程序進行預測數據。這個定義的順序不能錯,因為我們定義的網絡結構,損失函數等等都是更加順序記錄到PaddlePaddle的主程序中的。主程序定義了神經網絡模型,前向反向計算,以及優化算法對網絡中可學習參數的更新,是我們整個程序的核心,這個是PaddlePaddle已經幫我們實現的了,我們只需注重網絡的構建和訓練即可。

# 復制一個主程序,方便之后使用 test_program = fluid.default_main_program().clone(for_test=True)

接著是定義訓練使用的優化方法,這里使用的是隨機梯度下降優化方法。PaddlePaddle提供了大量的優化函數接口,除了本項目使用的隨機梯度下降法(SGD),還有Momentum、Adagrad、Adagrad等等,讀者可以更加自己項目的需求使用不同的優化方法。

# 定義優化方法 optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.01) opts = optimizer.minimize(avg_cost)

然后是創建一個解析器,我們同樣是使用CPU來進行訓練。創建解析器之后,使用解析器來執行fluid.default_startup_program()初始化參數。

# 創建一個使用CPU的解釋器 place = fluid.CPUPlace() exe = fluid.Executor(place) # 進行參數初始化 exe.run(fluid.default_startup_program())

我們使用numpy定義一組數據,這組數據的每一條數據有13個,這是因為我們在定義網絡的輸入層時,shape是13,但是每條數據的后面12個數據是沒意義的,因為筆者全部都是使用0來填充,純粹是為了符合數據的格式而已。這組數據是符合y = 2 * x + 1,但是程序是不知道的,我們之后使用這組數據進行訓練,看看強大的神經網絡是否能夠訓練出一個擬合這個函數的模型。最后定義了一個預測數據,是在訓練完成,使用這個數據作為x輸入,看是否能夠預測于正確值相近結果。

# 定義訓練和測試數據 x_data = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32') y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32') test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')

定義數據之后,我們就可以使用數據進行訓練了。我們這次訓練了10個pass,讀者可根據情況設置更多的訓練輪數,通常來說訓練的次數越多,模型收斂的越好。同樣我們使用的時profram是fluid.default_main_program(),feed中是在訓練時把數據傳入fluid.layers.data()定義的變量中,及那個鍵值對的key對用的就是fluid.layers.data()中的name的值。我們讓訓練過程中輸出avg_cost的值。

在訓練過程中,我們可以看到輸出的損失值在不斷減小,證明我們的模型在不斷收斂。

# 開始訓練10個passfor pass_id in range(10):train_cost = exe.run(program=fluid.default_main_program(),feed={'x': x_data, 'y': y_data},fetch_list=[avg_cost])print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0]))

訓練完成之后,我們使用上面克隆主程序得到的預測程序了預測我們剛才定義的預測數據。預測數據同樣作為x在feed輸入,在預測時,理論上是不用輸入y的,但是要符合輸入格式,我們模擬一個y的數據值,這個值并不會影響我們的預測結果。fetch_list的值,也就是我們執行預測之后要輸出的結果,這是網絡的最后一層,而不是平均損失函數(avg_cost),因為我們是想要預測程序輸出預測結果。根據我們上面定義數據時,滿足規律y = 2 * x + 1,所以當x為6時,y應該時13,最后輸出的結果也是應該接近13的。

# 開始預測 result = exe.run(program=test_program,feed={'x': test_data, 'y': np.array([[0.0]]).astype('float32')},fetch_list=[net]) print("當x為6.0時,y為:%0.5f" % result[0][0][0])

預測結果:當x為6.0時,y為:13.23625

總結

以上是生活随笔為你收集整理的新手第四课-PaddlePaddle快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。