版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章paddle開發(fā)詳解
本章知識點:Paddle介紹Paddle開發(fā)流程013.1paddle介紹3.1.1Paddle概述Paddle是一個由百度推出的開源深度學習框架,它包含了各種深度學習模型和工具,可以幫助開發(fā)者快速、高效地構建和訓練深度學習模型,Paddle的優(yōu)勢主要體現在三個方面:支持多種深度學習模型和任務:包括卷積神經網絡、循環(huán)神經網絡(RNN)、語言模型(LM)等。支持多種深度學習任務,如圖像分類、語音識別、自然語言處理等。提供豐富的模型庫和工具:幫助開發(fā)者快速構建深度學習模型,并實現高效的模型訓練和推理。提供了多種優(yōu)化工具和調試功能,可以幫助開發(fā)者更好地管理深度學習項目,調試模型。支持多種編程語言和在線社區(qū)支持:包括Python、C++和Go等,可以幫助開發(fā)者更快地實現深度學習項目。還提供了豐富的在線社區(qū)支持,可以幫助開發(fā)者解決問題,并分享技術經驗。這里以Paddle2.4、Linux操作系統(tǒng)、Conda、CUDA11.2為例介紹如何在個人PC端安裝Paddle(更多安裝方式可以參考Paddle官網),下圖列出了各種安裝所需環(huán)境組合。Anaconda是一個免費開源的Python和R語言發(fā)行版本,致力于簡化包管理和部署,使用軟件包管理系統(tǒng)Conda進行管理。Conda是一個開源包管理系統(tǒng)和環(huán)境管理系統(tǒng),可在Windows、macOS和Linux上運行,并且可以安裝不同版本的軟件包及其依賴,能夠在不同環(huán)境之間切換。本節(jié)介紹Anaconda安裝方式,Paddle提供的Anaconda安裝包支持分布式訓練(多機多卡)、TensorRT推理等功能。1.創(chuàng)建虛擬環(huán)境(1)安裝環(huán)境首先根據具體的Python版本創(chuàng)建Anaconda虛擬環(huán)境,Paddle的Anaconda安裝支持3.6~3.10版本的Python安裝環(huán)境。通過電腦“開始”,進入Anaconda命令行窗口,界面如圖3-2所示:1.創(chuàng)建虛擬環(huán)境進入Anaconda命令行窗口后,輸入如下命令創(chuàng)建虛擬環(huán)境:condacreate-nyour_env_namePython=your_py_ver其中:your_env_name——虛擬環(huán)境的名稱,可以自行設置,這里將以Paddle為例your_py_ver——使用的Python版本,建議3.7~3.9版本運行后輸出如圖3-3所示信息,說明環(huán)境創(chuàng)建成功?。?)繼續(xù)在Anaconda命令行窗口,輸入如下命令激活剛剛創(chuàng)建的虛擬環(huán)境:condaactivatepaddle執(zhí)行命令后,出現如圖3-4所示信息,表明從base基礎環(huán)境切換到創(chuàng)建的paddle虛擬環(huán)境,說明進入成功!2.開始安裝根據版本選擇要安裝的Paddle。(1)CPU版的Paddle如果您的計算機沒有NVIDIA?GPU,請安裝CPU版的Paddle,安裝命令如下:condainstallPaddle==2.4.2--channel/anaconda/cloud/Paddle/(2)GPU版的Paddle對于CUDA11.2,需要搭配cuDNN8.2.1(多卡環(huán)境下NCCL>=2.7),安裝命令如下:condainstallPaddle-gpu==2.4.2cudatoolkit=11.2-c/anaconda/cloud/Paddle/-cconda-forge可參考NVIDIA官方文檔了解CUDA和CUDNN的安裝流程和配置方法。3.驗證安裝安裝完成后可以使用Python進入Python解釋器,輸入importpaddle,再輸入paddle.utils.run_check(),如果打印輸出“Paddleisinstalledsuccessfully!”,說明已成功安裝!023.2快速上手paddle本節(jié)將從完成一個簡單的手寫數字識別任務開始,帶你快速了解深度學習模型開發(fā)的大致流程,并初步掌握PaddleAPI的使用方法。手寫數字識別指的是對0~9的十個數字進行分類,即輸入手寫數字的圖片后,能識別出圖片中的數字。采用MNIST手寫數字數據集,進行模型的訓練和測試。該數據集包含60000張訓練圖片、10000張測試圖片、以及對應的分類標簽文件,每張圖片是一個0~9的手寫數字,分辨率為28*28。MNIST數據集部分圖像和對應的分類標簽如圖3-13所示:3.2.1數據集定義與加載深度學習模型需要大量數據完成訓練和評估,這些數據樣本可能是圖片、文本、語音等多種類型。而模型訓練過程實際是數學計算的過程,因此數據樣本在送入模型前需要經過一系列處理,如轉換數據格式、劃分數據集、變換數據形狀、制作數據迭代讀取器以備分批訓練等。在Paddle框架中,可通過如下兩個核心步驟完成數據集的定義與加載:定義數據集:將原始圖片、文字等樣本和對應的標簽映射到Dataset,方便后續(xù)通過索引讀取數據,還可以進行一些數據變換、數據增廣等預處理操作。在Paddle框架中推薦使用paddle.io.Dataset自定義數據集,另外在paddle.vision.datasets和paddle.text目錄下內置了一些經典數據集方便直接調用。迭代讀取數據集:自動將數據集的樣本進行分批、亂序等操作,方便訓練時迭代讀取,同時還支持多進程異步讀取功能以加快數據讀取速度。在Paddle框架中可使用paddle.io.DataLoader迭代讀取數據集。以下將對數據集定義與加載進行詳細介紹。
定義數據集1.直接加載內置數據集數據在使用之前,需要進行一些預處理,以便模型的訓練和驗證。Paddle在paddle.vision.transforms中提供了一些常用的圖像變換操作,如對圖像進行中心裁剪、水平翻轉和歸一化等,可以加快模型訓練的收斂速度。如下代碼,首先定義對數據集的處理方式,包括歸一化的均值和標準差值的設置、數據格式的設置。然后對加載的數據集進行初始化,并打印輸出測試集和驗證集的數量:#導入Normalize對圖像進行歸一化frompaddle.vision.transformsimportNormalize#用均值和標準差歸一化輸入數據,mean:設置每個通道歸一化的均值,std:設置每個通道歸一化的標準差值。#data_format數據的格式,必須為‘HIC’或‘CHN',默認值:'CHw'。transform=Normalize(mean=[127.5],std=[127.5],data_format='CHw')#下載數據集并初始化Datasettrain_dataset=paddle.vision.datasets.NWNIST(mode='train',transform=transform)test_dataset=paddle.vision.datasets.MNIST(mode='test',transform=transform)#打印數據集里圖片數量print('Thenumberoftrain_datasetis{}'.format(len(train_dataset)))print('Thenumberoftest_datasetis{}'.format(len(test_dataset)))程序執(zhí)行成功后,會打印輸出訓練集和測試集的數量,輸出內容如下:2.使用paddle.io.Dataset自定義數據集實際場景中,一般需要使用自有的數據來定義數據集,這時可以通過paddle.io.Dataset實現自定義數據集。一般通過構建一個子類繼承paddle.io.Dataset,并且實現下面的三個函數:__init__:完成數據集初始化操作,將磁盤中的樣本文件路徑和對應標簽映射到一個列表中。__getitem__:定義指定索引時如何獲取樣本數據,最終返回對應索引的單條數據(樣本數據、對應的標簽)。__len__:返回數據集的樣本總數。下載MNIST原始數據集文件后,使用paddle.io.Dataset定義數據集的代碼示例如下:#下載原始的MNIST數據集并解壓!wget/data/mnist.tar!tar-xfmnist.tar通過自定義的MyDataset類進行數據集的加載,整個過程包括四個步驟:首先繼承paddle.io.Dataset類,然后通過__init__函數完成數據集初始化操作,其次通過__getitem__函數定義獲取單條數據,最后使用__len__函數返回數據集的樣本總數。MyDataset繼承自paddle.io.Dataset基類,并且實現了__init__,__getitem__和__len__三個函數。在__init__函數中完成了對標簽文件的讀取和解析,并將所有圖像路徑image_path和對應的標簽label存放到一個列表data_list中。在__getitem__函數中定義了指定index獲取對應圖像數據的方法,完成了圖像的讀取、預處理和圖像標簽格式的轉換,最終返回圖像image和對應的標簽label。在__len__中返回__init__函數初始化好的數據集列表data_list的長度。另外,在__init__函數和__getitem__函數中還可以實現一些數據預處理操作,如對圖像的翻轉、裁剪、歸一化等,最終返回處理好的單條數據(樣本數據、對應的標簽)。該操作可以增加圖像數據多樣性,對增強模型的泛化能力帶來幫助。Paddle框架在paddle.vision.transforms中內置了幾十種圖像數據處理方法,詳細內容可參考3.2.3章節(jié)的“數據預處理”部分。
迭代讀取數據集1.使用paddle.io.DataLoader定義數據讀取器通過前面介紹的直接迭代讀取Dataset的方式雖然可實現對數據集的訪問,但是這種訪問方式只能單線程進行并且還需要手動分批次讀取。在Paddle框架中,更推薦使用paddle.io.DataLoaderAPI對數據集進行多進程讀取,并且可自動完成劃分batch的工作。如下示例代碼,實現數據讀取器的定義:#定義并初始化數據讀取器train_loader=paddle.io.DataLoader(train_custom_dataset,batch_size=64,shuffle=True,num_workers=1,drop_last=True)#調用DataLoader迭代讀取數據forbatch_id,datainenumerate(train_loader()):images,labels=dataprint("batch_id:{},訓練數據shape:{},標簽數據shape:{}".format(batch_id,images.shape,labels.shape))break上述代碼執(zhí)行成功后,會輸出batch信息:通過上述方法,初始化了一個數據讀取器train_loader,用于加載訓練數據集train_custom_dataset。在數據讀取器中,幾個常用字段如下:batch_size——每批次讀取的樣本數,示例中batch_size=64表示每批次讀取64個樣本數據。shuffle——樣本亂序,示例中shuffle=True表示在讀取數據時打亂樣本順序,以減少過擬合發(fā)生的可能性。drop_last——丟棄不完整的批次樣本,示例中drop_last=True表示丟棄因數據集樣本數不能被batch_size整除而產生的最后一個不完整的batch樣本。num_workers——同步/異步讀取數據,通過num_workers來設置加載數據的子進程個數。num_workers的值設為大于0時,即開啟多進程方式異步加載數據,可提升數據讀取速度。2.自定義數據采樣器采樣器定義了從數據集中的采樣行為,如順序采樣、批次采樣、隨機采樣、分布式采樣等。采樣器會根據設定的采樣規(guī)則,返回數據集中的索引列表,然后數據讀取器Dataloader即可根據索引列表從數據集中取出對應的樣本。Paddle框架在paddle.io目錄下提供了多種采樣器,如批采樣器BatchSampler、分布式批采樣器DistributedBatchSampler、順序采樣器SequenceSampler、隨機采樣器RandomSampler等。不同采樣器的采樣行為具有不同特點:順序采樣按照順序的方式輸出各個樣本的索引;隨機采樣先將樣本順序打亂,再輸出亂序后的樣本索引;分布式采樣常用于分布式訓練場景,將樣本數據切分成多份,分別放到不同卡上訓練。本小節(jié)介紹了在Paddle框架中將數據送入模型訓練之前的處理流程,總結整個流程和用到的關鍵API如圖,數據集定義和加載主要包括定義數據集和定義數據讀取器兩個步驟,另外在數據讀取器中可調用采樣器實現更靈活的采樣。其中,在定義數據集時,本節(jié)僅對數據集進行了歸一化處理,如需了解更多數據增強操作,可以參考3.2.3章節(jié)的“數據預處理”部分。3.2.3數據預處理在模型訓練過程中有時會遇到過擬合的問題,其中一個解決方法就是對訓練數據做數據增強處理。通過對圖像的裁剪、翻轉、亮度等處理,可以增加樣本的多樣性,從而增強模型的泛化能力。本節(jié)以圖像數據為例,介紹數據預處理的方法。Paddle框架在paddle.vision.transforms下內置了數十種圖像數據處理方法,包括圖像隨機裁剪、旋轉變換、改變亮度、改變對比度等操作,對于Paddle框架內置的數據預處理方法,可以單個調用,也可以將多個數據預處理方法進行組合使用,定義好數據處理方法后,可以直接在數據集Dataset中應用,兩種數據預處理應用方式:一種是在框架內置數據集中應用,一種是在自定義數據集中應用。3.2.4模型組網模型組網是深度學習任務中的重要一環(huán),該環(huán)節(jié)定義了神經網絡的層次結構、數據從輸入到輸出的計算過程(即前向計算)等。Paddle框架提供了多種模型組網方式,主要分為直接使用內置模型和使用paddle.nn.Sequential兩種組網方式。另外,Paddle框架提供了paddle.summary函數方便查看網絡結構、每層輸入輸出的形式和參數信息。手寫數字識別任務比較簡單,普通的神經網絡就能達到很高的精度,因此在本任務中我們使用識別手寫數字任務中最經典的卷積神經網絡——LeNet5模型,LeNet5網絡結構如圖所示:LetNet5共由5層組成,包括兩層卷積層和三層全連接層。輸入的圖片尺寸為28×28,經過Convolutions卷積層,獲得輸出的特征圖C1尺寸為28×28;然后經過Subsampling進行下采樣,獲得輸出的特征圖S2尺寸為14×14;再分別經過另外的卷積層和下采樣,獲得輸出的特征圖尺寸分別為10×10和5×5;最后經過三層全連接層,獲得最終的分類結果。直接使用內置模型Paddle在paddle.vision.models下內置了CV領域的一些經典模型,調用很方便,只需如下代碼即可完成網絡構建和初始化:importpaddleprint('Paddle框架內置模型:',paddle.vision.models.__all__)接下來,我們用LeNet5模型實現手寫數字識別,首先對網絡進行初始化,代碼如下:#模型組網并初始化網絡lenet=paddle.vision.models.LeNet(num_classes=10)通過paddle.summary()函數可打印網絡的基礎結構和參數信息,這里只需要在paddle.summary()函數中傳入兩個參數:待查看的網絡、網絡輸入的形狀(batch、通道數、長、寬),代碼如下:#可視化模型組網結構和參數paddle.summary(lenet,(1,1,28,28))上述代碼執(zhí)行成功后,會輸出LeNet5模型的網絡結構、每層的輸入輸出形式和參數信息,如下所示:通過paddle.summary可清晰地查看神經網絡層次結構、每一層的輸入數據和輸出數據的形狀(shape)、模型的參數量(params)等信息,方便可視化地了解模型結構、分析數據計算和傳遞過程。從打印結果可以看出,LeNet5模型包含2個Conv2D卷積層、2個ReLU激活層、2個MaxPool2D池化層以及3個Linear全連接層,將這些層堆疊組成LeNet5模型。使用paddle.nn.Sequential組網1.Paddle.nn簡介經典模型可以滿足一些簡單深度學習任務的需求,更多情況下,需要使用深度學習框架構建一個自己的神經網絡,這時可以使用Paddle框架中paddle.nn下的API構建網絡。2.使用paddle.nn.Sequential組網構建順序線性網絡結構時,可以選擇該方式,只需要按模型的結構順序,一層一層加到paddle.nn.Sequential子類中即可。參照前面LeNet5模型結構,構建該網絡結構的代碼如下:frompaddleimportnn#使用paddle.nn.Sequential構建LeNet模型lenet_Sequential=nn.Sequential(nn.Conv2D(1,6,3,stride=1,padding=1),nn.ReLU(),nn.MaxPool2D(2,2),nn.Conv2D(6,16,5,stride=1,padding=0),nn.ReLU(),nn.MaxPool2D(2,2),nn.Flatten(),nn.Linear(400,120),nn.Linear(120,84),nn.Linear(84,10))#可視化模型組網結構和參數paddle.summary(lenet_Sequential,(1,1,28,28))3.使用paddle.nn.Layer組網構建一些比較復雜的網絡結構時,可以選擇該方式,組網包括創(chuàng)建一個繼承自paddle.nn.Layer的類,在類的構造函數__init__中定義組網用到的神經網絡層(layer),在類的前向計算函數forward中使用定義好的layer執(zhí)行前向計算等三個步驟。然以LeNet5模型為例,使用paddle.nn.Layer組網的代碼如下:#使用Subclass方式構建LeNet模型classLeNet(nn.Layer):def__init__(self,num_classes=10):super().__init__()self.num_classes=num_classes#構建features子網,用于對輸入圖像進行特征提取
self.features=nn.Sequential(nn.Conv2D(1,6,3,stride=1,padding=1),nn.ReLU(),nn.MaxPool2D(2,2),nn.Conv2D(6,16,5,stride=1,padding=0),nn.ReLU(),nn.MaxPool2D(2,2))#構建linear子網,用于分類
ifnum_classes>0:self.linear=nn.Sequential(nn.Linear(400,120),nn.Linear(120,84),nn.Linear(84,num_classes))#執(zhí)行前向計算
defforward(self,inputs):x=self.features(inputs)ifself.num_classes>0:x=paddle.flatten(x,1)x=self.linear(x)returnxlenet_SubClass=LeNet()#可視化模型組網結構和參數params_info=paddle.summary(lenet_SubClass,(1,1,28,28))print(params_info)3.2.5模型訓練、評估與推理在準備好數據集和模型后,就可以將數據送入模型中啟動訓練評估了,包括模型訓練、模型評估、模型推理等三個步驟。使用paddle.Model高層API訓練、評估與推理模型訓練需完成如下步驟:1.使用paddle.Model封裝模型使用paddle.Model將上一小節(jié)搭建的網絡結構LeNet5,組合成可快速使用高層API進行訓練、評估、推理的實例,代碼如下:#封裝模型,便于進行后續(xù)的訓練、評估和推理model=paddle.Model(lenet)2.使用model.prepare配置訓練準備參數用paddle.Model完成模型的封裝后,需通過model.prepare進行訓練前的配置準備工作,包括設置Loss計算方法、優(yōu)化算法、評價指標計算方法等。模型的評價指標采用的是混淆矩陣,準確率Acc表示所有預測正確的正樣本和負樣本,占所有樣本的比例,精確率(precision)表示預測正確的樣本,占所有預測為正樣本的比例。召回率(recall)表示預測正確的樣本,占所有實際為正樣本的比例。調和平均數利用精確率和召回率的調和平均數綜合評估模型性能,是統(tǒng)計學中用來衡量二分類模型精確度的一種指標,它同時兼顧了分類模型的精確率和召回率。計算公式為在分類任務示例中,使用SGD優(yōu)化器,設置優(yōu)化器的學習率learning_rate=0.0001,并傳入封裝好的全部模型參數model.parameters用于后續(xù)更新。使用交叉熵損失函數CrossEntropyLoss用于分類模型評估。使用分類任務常用的準確率指標Accuracy計算模型在訓練集上的精度,代碼如下:#模型訓練的配置準備,準備損失函數,優(yōu)化器和評價指標model.prepare(paddle.optimizer.sGD(learning_rate=0.0001,parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy())3.使用model.fit訓練模型做好模型訓練的前期準備工作后,調用paddle.model.fit接口來啟動訓練。訓練過程采用兩層循環(huán)嵌套方式:內層循環(huán)完成整個數據集的一次遍歷,采用分批次方式;外層循環(huán)根據設置的訓練輪次完成數據集的多次遍歷。因此需要指定至少三個關鍵參數:訓練數據集、訓練輪次和每批次大小,啟動模型訓練代碼如下:#啟動模型訓練,指定訓練數據集,設置訓練輪次,設置每次數據集計算的批次大小,設置日志格式model.fit(train_dataset,epochs=5,batch_size=64,verbose=1)4.使用model.evaluate評估模型訓練好模型后,可在事先定義好的測試數據集上,使用model.evaluate接口完成模型評估操作,結束后根據在model.prepare中定義的loss和metric計算并返回相關評估結果,代碼如下:#用evaluate在測試集上對模型進行驗證eval_result=model.evaluate(test_dataset,verbose=1)print(eval_result)評估完成后,輸出對模型的評估結果,評估結果包括評估的進度顯示、損失值、準確率以及評估的樣本數,輸出結果如下:5.使用model.predict執(zhí)行推理高層API中提供了model.predict接口,可對訓練好的模型進行推理驗證。只需傳入待執(zhí)行推理驗證的樣本數據,即可計算并返回推理結果,代碼如下:#用predict在測試集上對模型進行推理test_result=model.predict(test_dataset)#由于模型是單一輸出,test_result的形狀為[1,10000],10000是測試數據集的數據量。這里打印第一個數據的結果,這個數組表示每個數字的預測概率print(len(test_result))print(test_result[0][0])#從測試集中取出一張圖片img,label=test_dataset[0]#打印推理結果,這里的argmax函數用于取出預測值中概率最高的一個的下標,作為預測標簽pred_label=test_result[0][0].argmax()print('truelabel:{},predlabel:{}'.format(label[0],pred_label))#使用matplotlib庫,可視化圖片frommatplotlibimportpyplotaspltplt.imshow(img[0])3.2.6模型保存與加載模型訓練后,訓練好的模型參數保存在內存中,通常需要使用模型保存功能將其持久化保存到磁盤文件中,并在后續(xù)需要訓練調優(yōu)或推理部署時,再加載到內存中運行。本節(jié)介紹不同場景下模型保存與加載的方法。在模型訓練過程中,通常會在訓練調優(yōu)和推理部署兩種場景下保存和加載模型。1.用于訓練調優(yōu)場景動態(tài)圖模式下,模型結構指的是Python前端組網代碼;模型參數主要指網絡層Layer.state_dict()和優(yōu)化器Optim
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)噪聲對自主神經功能的影響及機制
- 客服主管年終總結公式(3篇)
- 職業(yè)健康管理倫理問題探討
- 職業(yè)健康檔案電子化數據挖掘與早期干預策略
- 職業(yè)健康促進工作規(guī)范化與可持續(xù)發(fā)展
- 齊齊哈爾2025年黑龍江齊齊哈爾市委網絡安全和信息化委員會辦公室直屬事業(yè)單位招聘筆試歷年參考題庫附帶答案詳解
- 韶關2025年廣東韶關市教育局直屬學校招聘臨聘教師23人筆試歷年參考題庫附帶答案詳解
- 西雙版納云南西雙版納州人力資源和社會保障局公益性崗位招聘筆試歷年參考題庫附帶答案詳解
- 舟山2025年下半年浙江舟山市屬事業(yè)單位招聘28人筆試歷年參考題庫附帶答案詳解
- 玉林2025年廣西玉林市第二幼兒園招聘安保人員筆試歷年參考題庫附帶答案詳解
- GB/T 6974.5-2023起重機術語第5部分:橋式和門式起重機
- 心臟血管檢查課件
- 運用PDCA循環(huán)管理提高手衛(wèi)生依從性課件
- 二手房定金合同(2023版)正規(guī)范本(通用版)1
- 《高職應用數學》(教案)
- 點因素法崗位評估體系詳解
- 漢堡規(guī)則中英文
- DB63T 1933-2021無人機航空磁測技術規(guī)范
- YY/T 1843-2022醫(yī)用電氣設備網絡安全基本要求
- GB/T 5231-2022加工銅及銅合金牌號和化學成分
- GB/T 26480-2011閥門的檢驗和試驗
評論
0/150
提交評論