《機(jī)器視覺理論與實戰(zhàn)》 課件 第三章 paddle開發(fā)詳解_第1頁
《機(jī)器視覺理論與實戰(zhàn)》 課件 第三章 paddle開發(fā)詳解_第2頁
《機(jī)器視覺理論與實戰(zhàn)》 課件 第三章 paddle開發(fā)詳解_第3頁
《機(jī)器視覺理論與實戰(zhàn)》 課件 第三章 paddle開發(fā)詳解_第4頁
《機(jī)器視覺理論與實戰(zhàn)》 課件 第三章 paddle開發(fā)詳解_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第三章paddle開發(fā)詳解

本章知識點:Paddle介紹Paddle開發(fā)流程013.1paddle介紹3.1.1Paddle概述Paddle是一個由百度推出的開源深度學(xué)習(xí)框架,它包含了各種深度學(xué)習(xí)模型和工具,可以幫助開發(fā)者快速、高效地構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型,Paddle的優(yōu)勢主要體現(xiàn)在三個方面:支持多種深度學(xué)習(xí)模型和任務(wù):包括卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、語言模型(LM)等。支持多種深度學(xué)習(xí)任務(wù),如圖像分類、語音識別、自然語言處理等。提供豐富的模型庫和工具:幫助開發(fā)者快速構(gòu)建深度學(xué)習(xí)模型,并實現(xiàn)高效的模型訓(xùn)練和推理。提供了多種優(yōu)化工具和調(diào)試功能,可以幫助開發(fā)者更好地管理深度學(xué)習(xí)項目,調(diào)試模型。支持多種編程語言和在線社區(qū)支持:包括Python、C++和Go等,可以幫助開發(fā)者更快地實現(xiàn)深度學(xué)習(xí)項目。還提供了豐富的在線社區(qū)支持,可以幫助開發(fā)者解決問題,并分享技術(shù)經(jīng)驗。這里以Paddle2.4、Linux操作系統(tǒng)、Conda、CUDA11.2為例介紹如何在個人PC端安裝Paddle(更多安裝方式可以參考Paddle官網(wǎng)),下圖列出了各種安裝所需環(huán)境組合。Anaconda是一個免費開源的Python和R語言發(fā)行版本,致力于簡化包管理和部署,使用軟件包管理系統(tǒng)Conda進(jìn)行管理。Conda是一個開源包管理系統(tǒng)和環(huán)境管理系統(tǒng),可在Windows、macOS和Linux上運(yùn)行,并且可以安裝不同版本的軟件包及其依賴,能夠在不同環(huán)境之間切換。本節(jié)介紹Anaconda安裝方式,Paddle提供的Anaconda安裝包支持分布式訓(xùn)練(多機(jī)多卡)、TensorRT推理等功能。1.創(chuàng)建虛擬環(huán)境(1)安裝環(huán)境首先根據(jù)具體的Python版本創(chuàng)建Anaconda虛擬環(huán)境,Paddle的Anaconda安裝支持3.6~3.10版本的Python安裝環(huán)境。通過電腦“開始”,進(jìn)入Anaconda命令行窗口,界面如圖3-2所示:1.創(chuàng)建虛擬環(huán)境進(jìn)入Anaconda命令行窗口后,輸入如下命令創(chuàng)建虛擬環(huán)境:condacreate-nyour_env_namePython=your_py_ver其中:your_env_name——虛擬環(huán)境的名稱,可以自行設(shè)置,這里將以Paddle為例your_py_ver——使用的Python版本,建議3.7~3.9版本運(yùn)行后輸出如圖3-3所示信息,說明環(huán)境創(chuàng)建成功?。?)繼續(xù)在Anaconda命令行窗口,輸入如下命令激活剛剛創(chuàng)建的虛擬環(huán)境:condaactivatepaddle執(zhí)行命令后,出現(xiàn)如圖3-4所示信息,表明從base基礎(chǔ)環(huán)境切換到創(chuàng)建的paddle虛擬環(huán)境,說明進(jìn)入成功!2.開始安裝根據(jù)版本選擇要安裝的Paddle。(1)CPU版的Paddle如果您的計算機(jī)沒有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進(jìn)入Python解釋器,輸入importpaddle,再輸入paddle.utils.run_check(),如果打印輸出“Paddleisinstalledsuccessfully!”,說明已成功安裝!023.2快速上手paddle本節(jié)將從完成一個簡單的手寫數(shù)字識別任務(wù)開始,帶你快速了解深度學(xué)習(xí)模型開發(fā)的大致流程,并初步掌握PaddleAPI的使用方法。手寫數(shù)字識別指的是對0~9的十個數(shù)字進(jìn)行分類,即輸入手寫數(shù)字的圖片后,能識別出圖片中的數(shù)字。采用MNIST手寫數(shù)字?jǐn)?shù)據(jù)集,進(jìn)行模型的訓(xùn)練和測試。該數(shù)據(jù)集包含60000張訓(xùn)練圖片、10000張測試圖片、以及對應(yīng)的分類標(biāo)簽文件,每張圖片是一個0~9的手寫數(shù)字,分辨率為28*28。MNIST數(shù)據(jù)集部分圖像和對應(yīng)的分類標(biāo)簽如圖3-13所示:3.2.1數(shù)據(jù)集定義與加載深度學(xué)習(xí)模型需要大量數(shù)據(jù)完成訓(xùn)練和評估,這些數(shù)據(jù)樣本可能是圖片、文本、語音等多種類型。而模型訓(xùn)練過程實際是數(shù)學(xué)計算的過程,因此數(shù)據(jù)樣本在送入模型前需要經(jīng)過一系列處理,如轉(zhuǎn)換數(shù)據(jù)格式、劃分?jǐn)?shù)據(jù)集、變換數(shù)據(jù)形狀、制作數(shù)據(jù)迭代讀取器以備分批訓(xùn)練等。在Paddle框架中,可通過如下兩個核心步驟完成數(shù)據(jù)集的定義與加載:定義數(shù)據(jù)集:將原始圖片、文字等樣本和對應(yīng)的標(biāo)簽映射到Dataset,方便后續(xù)通過索引讀取數(shù)據(jù),還可以進(jìn)行一些數(shù)據(jù)變換、數(shù)據(jù)增廣等預(yù)處理操作。在Paddle框架中推薦使用paddle.io.Dataset自定義數(shù)據(jù)集,另外在paddle.vision.datasets和paddle.text目錄下內(nèi)置了一些經(jīng)典數(shù)據(jù)集方便直接調(diào)用。迭代讀取數(shù)據(jù)集:自動將數(shù)據(jù)集的樣本進(jìn)行分批、亂序等操作,方便訓(xùn)練時迭代讀取,同時還支持多進(jìn)程異步讀取功能以加快數(shù)據(jù)讀取速度。在Paddle框架中可使用paddle.io.DataLoader迭代讀取數(shù)據(jù)集。以下將對數(shù)據(jù)集定義與加載進(jìn)行詳細(xì)介紹。

定義數(shù)據(jù)集1.直接加載內(nèi)置數(shù)據(jù)集數(shù)據(jù)在使用之前,需要進(jìn)行一些預(yù)處理,以便模型的訓(xùn)練和驗證。Paddle在paddle.vision.transforms中提供了一些常用的圖像變換操作,如對圖像進(jìn)行中心裁剪、水平翻轉(zhuǎn)和歸一化等,可以加快模型訓(xùn)練的收斂速度。如下代碼,首先定義對數(shù)據(jù)集的處理方式,包括歸一化的均值和標(biāo)準(zhǔn)差值的設(shè)置、數(shù)據(jù)格式的設(shè)置。然后對加載的數(shù)據(jù)集進(jìn)行初始化,并打印輸出測試集和驗證集的數(shù)量:#導(dǎo)入Normalize對圖像進(jìn)行歸一化frompaddle.vision.transformsimportNormalize#用均值和標(biāo)準(zhǔn)差歸一化輸入數(shù)據(jù),mean:設(shè)置每個通道歸一化的均值,std:設(shè)置每個通道歸一化的標(biāo)準(zhǔn)差值。#data_format數(shù)據(jù)的格式,必須為‘HIC’或‘CHN',默認(rèn)值:'CHw'。transform=Normalize(mean=[127.5],std=[127.5],data_format='CHw')#下載數(shù)據(jù)集并初始化Datasettrain_dataset=paddle.vision.datasets.NWNIST(mode='train',transform=transform)test_dataset=paddle.vision.datasets.MNIST(mode='test',transform=transform)#打印數(shù)據(jù)集里圖片數(shù)量print('Thenumberoftrain_datasetis{}'.format(len(train_dataset)))print('Thenumberoftest_datasetis{}'.format(len(test_dataset)))程序執(zhí)行成功后,會打印輸出訓(xùn)練集和測試集的數(shù)量,輸出內(nèi)容如下:2.使用paddle.io.Dataset自定義數(shù)據(jù)集實際場景中,一般需要使用自有的數(shù)據(jù)來定義數(shù)據(jù)集,這時可以通過paddle.io.Dataset實現(xiàn)自定義數(shù)據(jù)集。一般通過構(gòu)建一個子類繼承paddle.io.Dataset,并且實現(xiàn)下面的三個函數(shù):__init__:完成數(shù)據(jù)集初始化操作,將磁盤中的樣本文件路徑和對應(yīng)標(biāo)簽映射到一個列表中。__getitem__:定義指定索引時如何獲取樣本數(shù)據(jù),最終返回對應(yīng)索引的單條數(shù)據(jù)(樣本數(shù)據(jù)、對應(yīng)的標(biāo)簽)。__len__:返回數(shù)據(jù)集的樣本總數(shù)。下載MNIST原始數(shù)據(jù)集文件后,使用paddle.io.Dataset定義數(shù)據(jù)集的代碼示例如下:#下載原始的MNIST數(shù)據(jù)集并解壓!wget/data/mnist.tar!tar-xfmnist.tar通過自定義的MyDataset類進(jìn)行數(shù)據(jù)集的加載,整個過程包括四個步驟:首先繼承paddle.io.Dataset類,然后通過__init__函數(shù)完成數(shù)據(jù)集初始化操作,其次通過__getitem__函數(shù)定義獲取單條數(shù)據(jù),最后使用__len__函數(shù)返回數(shù)據(jù)集的樣本總數(shù)。MyDataset繼承自paddle.io.Dataset基類,并且實現(xiàn)了__init__,__getitem__和__len__三個函數(shù)。在__init__函數(shù)中完成了對標(biāo)簽文件的讀取和解析,并將所有圖像路徑image_path和對應(yīng)的標(biāo)簽label存放到一個列表data_list中。在__getitem__函數(shù)中定義了指定index獲取對應(yīng)圖像數(shù)據(jù)的方法,完成了圖像的讀取、預(yù)處理和圖像標(biāo)簽格式的轉(zhuǎn)換,最終返回圖像image和對應(yīng)的標(biāo)簽label。在__len__中返回__init__函數(shù)初始化好的數(shù)據(jù)集列表data_list的長度。另外,在__init__函數(shù)和__getitem__函數(shù)中還可以實現(xiàn)一些數(shù)據(jù)預(yù)處理操作,如對圖像的翻轉(zhuǎn)、裁剪、歸一化等,最終返回處理好的單條數(shù)據(jù)(樣本數(shù)據(jù)、對應(yīng)的標(biāo)簽)。該操作可以增加圖像數(shù)據(jù)多樣性,對增強(qiáng)模型的泛化能力帶來幫助。Paddle框架在paddle.vision.transforms中內(nèi)置了幾十種圖像數(shù)據(jù)處理方法,詳細(xì)內(nèi)容可參考3.2.3章節(jié)的“數(shù)據(jù)預(yù)處理”部分。

迭代讀取數(shù)據(jù)集1.使用paddle.io.DataLoader定義數(shù)據(jù)讀取器通過前面介紹的直接迭代讀取Dataset的方式雖然可實現(xiàn)對數(shù)據(jù)集的訪問,但是這種訪問方式只能單線程進(jìn)行并且還需要手動分批次讀取。在Paddle框架中,更推薦使用paddle.io.DataLoaderAPI對數(shù)據(jù)集進(jìn)行多進(jìn)程讀取,并且可自動完成劃分batch的工作。如下示例代碼,實現(xiàn)數(shù)據(jù)讀取器的定義:#定義并初始化數(shù)據(jù)讀取器train_loader=paddle.io.DataLoader(train_custom_dataset,batch_size=64,shuffle=True,num_workers=1,drop_last=True)#調(diào)用DataLoader迭代讀取數(shù)據(jù)forbatch_id,datainenumerate(train_loader()):images,labels=dataprint("batch_id:{},訓(xùn)練數(shù)據(jù)shape:{},標(biāo)簽數(shù)據(jù)shape:{}".format(batch_id,images.shape,labels.shape))break上述代碼執(zhí)行成功后,會輸出batch信息:通過上述方法,初始化了一個數(shù)據(jù)讀取器train_loader,用于加載訓(xùn)練數(shù)據(jù)集train_custom_dataset。在數(shù)據(jù)讀取器中,幾個常用字段如下:batch_size——每批次讀取的樣本數(shù),示例中batch_size=64表示每批次讀取64個樣本數(shù)據(jù)。shuffle——樣本亂序,示例中shuffle=True表示在讀取數(shù)據(jù)時打亂樣本順序,以減少過擬合發(fā)生的可能性。drop_last——丟棄不完整的批次樣本,示例中drop_last=True表示丟棄因數(shù)據(jù)集樣本數(shù)不能被batch_size整除而產(chǎn)生的最后一個不完整的batch樣本。num_workers——同步/異步讀取數(shù)據(jù),通過num_workers來設(shè)置加載數(shù)據(jù)的子進(jìn)程個數(shù)。num_workers的值設(shè)為大于0時,即開啟多進(jìn)程方式異步加載數(shù)據(jù),可提升數(shù)據(jù)讀取速度。2.自定義數(shù)據(jù)采樣器采樣器定義了從數(shù)據(jù)集中的采樣行為,如順序采樣、批次采樣、隨機(jī)采樣、分布式采樣等。采樣器會根據(jù)設(shè)定的采樣規(guī)則,返回數(shù)據(jù)集中的索引列表,然后數(shù)據(jù)讀取器Dataloader即可根據(jù)索引列表從數(shù)據(jù)集中取出對應(yīng)的樣本。Paddle框架在paddle.io目錄下提供了多種采樣器,如批采樣器BatchSampler、分布式批采樣器DistributedBatchSampler、順序采樣器SequenceSampler、隨機(jī)采樣器RandomSampler等。不同采樣器的采樣行為具有不同特點:順序采樣按照順序的方式輸出各個樣本的索引;隨機(jī)采樣先將樣本順序打亂,再輸出亂序后的樣本索引;分布式采樣常用于分布式訓(xùn)練場景,將樣本數(shù)據(jù)切分成多份,分別放到不同卡上訓(xùn)練。本小節(jié)介紹了在Paddle框架中將數(shù)據(jù)送入模型訓(xùn)練之前的處理流程,總結(jié)整個流程和用到的關(guān)鍵API如圖,數(shù)據(jù)集定義和加載主要包括定義數(shù)據(jù)集和定義數(shù)據(jù)讀取器兩個步驟,另外在數(shù)據(jù)讀取器中可調(diào)用采樣器實現(xiàn)更靈活的采樣。其中,在定義數(shù)據(jù)集時,本節(jié)僅對數(shù)據(jù)集進(jìn)行了歸一化處理,如需了解更多數(shù)據(jù)增強(qiáng)操作,可以參考3.2.3章節(jié)的“數(shù)據(jù)預(yù)處理”部分。3.2.3數(shù)據(jù)預(yù)處理在模型訓(xùn)練過程中有時會遇到過擬合的問題,其中一個解決方法就是對訓(xùn)練數(shù)據(jù)做數(shù)據(jù)增強(qiáng)處理。通過對圖像的裁剪、翻轉(zhuǎn)、亮度等處理,可以增加樣本的多樣性,從而增強(qiáng)模型的泛化能力。本節(jié)以圖像數(shù)據(jù)為例,介紹數(shù)據(jù)預(yù)處理的方法。Paddle框架在paddle.vision.transforms下內(nèi)置了數(shù)十種圖像數(shù)據(jù)處理方法,包括圖像隨機(jī)裁剪、旋轉(zhuǎn)變換、改變亮度、改變對比度等操作,對于Paddle框架內(nèi)置的數(shù)據(jù)預(yù)處理方法,可以單個調(diào)用,也可以將多個數(shù)據(jù)預(yù)處理方法進(jìn)行組合使用,定義好數(shù)據(jù)處理方法后,可以直接在數(shù)據(jù)集Dataset中應(yīng)用,兩種數(shù)據(jù)預(yù)處理應(yīng)用方式:一種是在框架內(nèi)置數(shù)據(jù)集中應(yīng)用,一種是在自定義數(shù)據(jù)集中應(yīng)用。3.2.4模型組網(wǎng)模型組網(wǎng)是深度學(xué)習(xí)任務(wù)中的重要一環(huán),該環(huán)節(jié)定義了神經(jīng)網(wǎng)絡(luò)的層次結(jié)構(gòu)、數(shù)據(jù)從輸入到輸出的計算過程(即前向計算)等。Paddle框架提供了多種模型組網(wǎng)方式,主要分為直接使用內(nèi)置模型和使用paddle.nn.Sequential兩種組網(wǎng)方式。另外,Paddle框架提供了paddle.summary函數(shù)方便查看網(wǎng)絡(luò)結(jié)構(gòu)、每層輸入輸出的形式和參數(shù)信息。手寫數(shù)字識別任務(wù)比較簡單,普通的神經(jīng)網(wǎng)絡(luò)就能達(dá)到很高的精度,因此在本任務(wù)中我們使用識別手寫數(shù)字任務(wù)中最經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)——LeNet5模型,LeNet5網(wǎng)絡(luò)結(jié)構(gòu)如圖所示:LetNet5共由5層組成,包括兩層卷積層和三層全連接層。輸入的圖片尺寸為28×28,經(jīng)過Convolutions卷積層,獲得輸出的特征圖C1尺寸為28×28;然后經(jīng)過Subsampling進(jìn)行下采樣,獲得輸出的特征圖S2尺寸為14×14;再分別經(jīng)過另外的卷積層和下采樣,獲得輸出的特征圖尺寸分別為10×10和5×5;最后經(jīng)過三層全連接層,獲得最終的分類結(jié)果。直接使用內(nèi)置模型Paddle在paddle.vision.models下內(nèi)置了CV領(lǐng)域的一些經(jīng)典模型,調(diào)用很方便,只需如下代碼即可完成網(wǎng)絡(luò)構(gòu)建和初始化:importpaddleprint('Paddle框架內(nèi)置模型:',paddle.vision.models.__all__)接下來,我們用LeNet5模型實現(xiàn)手寫數(shù)字識別,首先對網(wǎng)絡(luò)進(jìn)行初始化,代碼如下:#模型組網(wǎng)并初始化網(wǎng)絡(luò)lenet=paddle.vision.models.LeNet(num_classes=10)通過paddle.summary()函數(shù)可打印網(wǎng)絡(luò)的基礎(chǔ)結(jié)構(gòu)和參數(shù)信息,這里只需要在paddle.summary()函數(shù)中傳入兩個參數(shù):待查看的網(wǎng)絡(luò)、網(wǎng)絡(luò)輸入的形狀(batch、通道數(shù)、長、寬),代碼如下:#可視化模型組網(wǎng)結(jié)構(gòu)和參數(shù)paddle.summary(lenet,(1,1,28,28))上述代碼執(zhí)行成功后,會輸出LeNet5模型的網(wǎng)絡(luò)結(jié)構(gòu)、每層的輸入輸出形式和參數(shù)信息,如下所示:通過paddle.summary可清晰地查看神經(jīng)網(wǎng)絡(luò)層次結(jié)構(gòu)、每一層的輸入數(shù)據(jù)和輸出數(shù)據(jù)的形狀(shape)、模型的參數(shù)量(params)等信息,方便可視化地了解模型結(jié)構(gòu)、分析數(shù)據(jù)計算和傳遞過程。從打印結(jié)果可以看出,LeNet5模型包含2個Conv2D卷積層、2個ReLU激活層、2個MaxPool2D池化層以及3個Linear全連接層,將這些層堆疊組成LeNet5模型。使用paddle.nn.Sequential組網(wǎng)1.Paddle.nn簡介經(jīng)典模型可以滿足一些簡單深度學(xué)習(xí)任務(wù)的需求,更多情況下,需要使用深度學(xué)習(xí)框架構(gòu)建一個自己的神經(jīng)網(wǎng)絡(luò),這時可以使用Paddle框架中paddle.nn下的API構(gòu)建網(wǎng)絡(luò)。2.使用paddle.nn.Sequential組網(wǎng)構(gòu)建順序線性網(wǎng)絡(luò)結(jié)構(gòu)時,可以選擇該方式,只需要按模型的結(jié)構(gòu)順序,一層一層加到paddle.nn.Sequential子類中即可。參照前面LeNet5模型結(jié)構(gòu),構(gòu)建該網(wǎng)絡(luò)結(jié)構(gòu)的代碼如下:frompaddleimportnn#使用paddle.nn.Sequential構(gòu)建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))#可視化模型組網(wǎng)結(jié)構(gòu)和參數(shù)paddle.summary(lenet_Sequential,(1,1,28,28))3.使用paddle.nn.Layer組網(wǎng)構(gòu)建一些比較復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)時,可以選擇該方式,組網(wǎng)包括創(chuàng)建一個繼承自paddle.nn.Layer的類,在類的構(gòu)造函數(shù)__init__中定義組網(wǎng)用到的神經(jīng)網(wǎng)絡(luò)層(layer),在類的前向計算函數(shù)forward中使用定義好的layer執(zhí)行前向計算等三個步驟。然以LeNet5模型為例,使用paddle.nn.Layer組網(wǎng)的代碼如下:#使用Subclass方式構(gòu)建LeNet模型classLeNet(nn.Layer):def__init__(self,num_classes=10):super().__init__()self.num_classes=num_classes#構(gòu)建features子網(wǎng),用于對輸入圖像進(jìn)行特征提取

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))#構(gòu)建linear子網(wǎng),用于分類

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()#可視化模型組網(wǎng)結(jié)構(gòu)和參數(shù)params_info=paddle.summary(lenet_SubClass,(1,1,28,28))print(params_info)3.2.5模型訓(xùn)練、評估與推理在準(zhǔn)備好數(shù)據(jù)集和模型后,就可以將數(shù)據(jù)送入模型中啟動訓(xùn)練評估了,包括模型訓(xùn)練、模型評估、模型推理等三個步驟。使用paddle.Model高層API訓(xùn)練、評估與推理模型訓(xùn)練需完成如下步驟:1.使用paddle.Model封裝模型使用paddle.Model將上一小節(jié)搭建的網(wǎng)絡(luò)結(jié)構(gòu)LeNet5,組合成可快速使用高層API進(jìn)行訓(xùn)練、評估、推理的實例,代碼如下:#封裝模型,便于進(jìn)行后續(xù)的訓(xùn)練、評估和推理model=paddle.Model(lenet)2.使用model.prepare配置訓(xùn)練準(zhǔn)備參數(shù)用paddle.Model完成模型的封裝后,需通過model.prepare進(jìn)行訓(xùn)練前的配置準(zhǔn)備工作,包括設(shè)置Loss計算方法、優(yōu)化算法、評價指標(biāo)計算方法等。模型的評價指標(biāo)采用的是混淆矩陣,準(zhǔn)確率Acc表示所有預(yù)測正確的正樣本和負(fù)樣本,占所有樣本的比例,精確率(precision)表示預(yù)測正確的樣本,占所有預(yù)測為正樣本的比例。召回率(recall)表示預(yù)測正確的樣本,占所有實際為正樣本的比例。調(diào)和平均數(shù)利用精確率和召回率的調(diào)和平均數(shù)綜合評估模型性能,是統(tǒng)計學(xué)中用來衡量二分類模型精確度的一種指標(biāo),它同時兼顧了分類模型的精確率和召回率。計算公式為在分類任務(wù)示例中,使用SGD優(yōu)化器,設(shè)置優(yōu)化器的學(xué)習(xí)率learning_rate=0.0001,并傳入封裝好的全部模型參數(shù)model.parameters用于后續(xù)更新。使用交叉熵?fù)p失函數(shù)CrossEntropyLoss用于分類模型評估。使用分類任務(wù)常用的準(zhǔn)確率指標(biāo)Accuracy計算模型在訓(xùn)練集上的精度,代碼如下:#模型訓(xùn)練的配置準(zhǔn)備,準(zhǔn)備損失函數(shù),優(yōu)化器和評價指標(biāo)model.prepare(paddle.optimizer.sGD(learning_rate=0.0001,parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy())3.使用model.fit訓(xùn)練模型做好模型訓(xùn)練的前期準(zhǔn)備工作后,調(diào)用paddle.model.fit接口來啟動訓(xùn)練。訓(xùn)練過程采用兩層循環(huán)嵌套方式:內(nèi)層循環(huán)完成整個數(shù)據(jù)集的一次遍歷,采用分批次方式;外層循環(huán)根據(jù)設(shè)置的訓(xùn)練輪次完成數(shù)據(jù)集的多次遍歷。因此需要指定至少三個關(guān)鍵參數(shù):訓(xùn)練數(shù)據(jù)集、訓(xùn)練輪次和每批次大小,啟動模型訓(xùn)練代碼如下:#啟動模型訓(xùn)練,指定訓(xùn)練數(shù)據(jù)集,設(shè)置訓(xùn)練輪次,設(shè)置每次數(shù)據(jù)集計算的批次大小,設(shè)置日志格式model.fit(train_dataset,epochs=5,batch_size=64,verbose=1)4.使用model.evaluate評估模型訓(xùn)練好模型后,可在事先定義好的測試數(shù)據(jù)集上,使用model.evaluate接口完成模型評估操作,結(jié)束后根據(jù)在model.prepare中定義的loss和metric計算并返回相關(guān)評估結(jié)果,代碼如下:#用evaluate在測試集上對模型進(jìn)行驗證eval_result=model.evaluate(test_dataset,verbose=1)print(eval_result)評估完成后,輸出對模型的評估結(jié)果,評估結(jié)果包括評估的進(jìn)度顯示、損失值、準(zhǔn)確率以及評估的樣本數(shù),輸出結(jié)果如下:5.使用model.predict執(zhí)行推理高層API中提供了model.predict接口,可對訓(xùn)練好的模型進(jìn)行推理驗證。只需傳入待執(zhí)行推理驗證的樣本數(shù)據(jù),即可計算并返回推理結(jié)果,代碼如下:#用predict在測試集上對模型進(jìn)行推理test_result=model.predict(test_dataset)#由于模型是單一輸出,test_result的形狀為[1,10000],10000是測試數(shù)據(jù)集的數(shù)據(jù)量。這里打印第一個數(shù)據(jù)的結(jié)果,這個數(shù)組表示每個數(shù)字的預(yù)測概率print(len(test_result))print(test_result[0][0])#從測試集中取出一張圖片img,label=test_dataset[0]#打印推理結(jié)果,這里的argmax函數(shù)用于取出預(yù)測值中概率最高的一個的下標(biāo),作為預(yù)測標(biāo)簽pred_label=test_result[0][0].argmax()print('truelabel:{},predlabel:{}'.format(label[0],pred_label))#使用matplotlib庫,可視化圖片frommatplotlibimportpyplotaspltplt.imshow(img[0])3.2.6模型保存與加載模型訓(xùn)練后,訓(xùn)練好的模型參數(shù)保存在內(nèi)存中,通常需要使用模型保存功能將其持久化保存到磁盤文件中,并在后續(xù)需要訓(xùn)練調(diào)優(yōu)或推理部署時,再加載到內(nèi)存中運(yùn)行。本節(jié)介紹不同場景下模型保存與加載的方法。在模型訓(xùn)練過程中,通常會在訓(xùn)練調(diào)優(yōu)和推理部署兩種場景下保存和加載模型。1.用于訓(xùn)練調(diào)優(yōu)場景動態(tài)圖模式下,模型結(jié)構(gòu)指的是Python前端組網(wǎng)代碼;模型參數(shù)主要指網(wǎng)絡(luò)層Layer.state_dict()和優(yōu)化器Optim

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論