




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PyTorch深度學(xué)習(xí)項(xiàng)目教程項(xiàng)目1手寫數(shù)字識(shí)別HANDWRITTENDIGITRECOGNITION要點(diǎn):人工智能、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的基本概念、PyTorch庫介紹、PyTorch開發(fā)環(huán)境的配置、深度學(xué)習(xí)領(lǐng)域的HelloWorld講課人:0講課時(shí)間:2025年3月12日項(xiàng)目背景ProjectBackground要點(diǎn):手寫識(shí)別應(yīng)用廣泛。問題:傳統(tǒng)方法在處理手寫數(shù)字識(shí)別問題時(shí)過于依賴人工制定的規(guī)則或者手工提取的特征,這種方法面臨著泛化能力差、復(fù)雜度高的問題。解決:深度學(xué)習(xí)模型直接將手寫數(shù)字圖像像素作為輸入,通過逐層學(xué)習(xí)抽取特征,最后得到準(zhǔn)確的分類結(jié)果,整個(gè)過程不需要依賴人工提取特征,而是通過模型自身學(xué)習(xí)到有效的特征表示。知識(shí)目標(biāo)KnowledgeObjectives理解人工智能、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的基本概念熟悉機(jī)器學(xué)習(xí)的基本工作流程,包括數(shù)據(jù)預(yù)處理、模型訓(xùn)練、模型評(píng)估和模型部署掌握Python繪圖庫PyPlot的基本使用方法,能夠繪制手寫數(shù)字識(shí)別過程中的曲線圖掌握PyTorch框架的基本使用方法,能夠構(gòu)建、訓(xùn)練和測(cè)試一個(gè)簡(jiǎn)單的手寫數(shù)字識(shí)別神經(jīng)網(wǎng)絡(luò)能力目標(biāo)AbilityGoals能夠獨(dú)立搭建Anaconda開發(fā)環(huán)境,包括Python、numpy、Matplotlib等庫的安裝能夠訪問英偉達(dá)官網(wǎng)并按照指南完成CUDA環(huán)境的安裝及配置,以便支持GPU加速計(jì)算能夠獨(dú)立完成PyTorch框架的安裝及配置,并在PyTorch環(huán)境中實(shí)現(xiàn)手寫數(shù)字識(shí)別模型素養(yǎng)目標(biāo)ProfessionalAttainments培養(yǎng)辯證性思維和問題解決能力培養(yǎng)實(shí)踐操作能力培養(yǎng)對(duì)人工智能領(lǐng)域的興趣和社會(huì)責(zé)任感目錄任務(wù)1初識(shí)深度學(xué)習(xí)任務(wù)2配置PyTorch開發(fā)環(huán)境任務(wù)3快速完成手寫數(shù)字識(shí)別功能01任務(wù)1初識(shí)深度學(xué)習(xí)1.1人工智能自然界四大奧秘:物質(zhì)的本質(zhì)、宇宙的起源、生命的本質(zhì)、智能的發(fā)生對(duì)智能還沒有確切的定義,主要流派有:(1)思維理論:智能的核心是思維(2)知識(shí)閾值理論:智能取決于知識(shí)的數(shù)量及一般化程度(3)進(jìn)化理論:用控制取代知識(shí)的表示—控制:操控和制造
智能是知識(shí)與智力的總和知識(shí)是一切智能行為的基礎(chǔ)獲取知識(shí)并應(yīng)用知識(shí)求解問題的能力人工智能:用人工的方法在機(jī)器(計(jì)算機(jī))上實(shí)現(xiàn)的智能;或者說是人們使機(jī)器具有類似于人的智能1.2機(jī)器學(xué)習(xí)我們學(xué)習(xí)機(jī)器的語言機(jī)器學(xué)習(xí)我們的語言1.2機(jī)器學(xué)習(xí)機(jī)器學(xué)習(xí)MachineLearning機(jī)器學(xué)習(xí)(MachineLearning)是一種人工智能技術(shù),它對(duì)研究問題進(jìn)行模型假設(shè),利用計(jì)算機(jī)從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)得到模型參數(shù),并最終對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測(cè)和分析。1980年起,以決策樹、貝葉斯模型和支持向量機(jī)為代表的機(jī)器學(xué)習(xí)技術(shù)得到了發(fā)展,通過特征工程(FeatureEngineering),利用專家經(jīng)驗(yàn),人工對(duì)數(shù)據(jù)進(jìn)行清洗提煉,讓計(jì)算機(jī)具備一定的環(huán)境理解和預(yù)測(cè)推理能力。機(jī)器學(xué)習(xí)算法處理流程1.3深度學(xué)習(xí)訓(xùn)練:基于樣本數(shù)據(jù)集自主進(jìn)行特征提取的過程推理:新的數(shù)據(jù)集上進(jìn)行預(yù)測(cè)的過程物聯(lián)網(wǎng)大數(shù)據(jù)云計(jì)算深度學(xué)習(xí):層次網(wǎng)狀結(jié)構(gòu),可以自動(dòng)學(xué)習(xí)數(shù)據(jù)特征的分布規(guī)律02任務(wù)2配置PyTorch開發(fā)環(huán)境2.1PyTorch概述基于Python的科學(xué)計(jì)算庫,用于構(gòu)建深度學(xué)習(xí)模型的開源機(jī)器學(xué)習(xí)框架語法簡(jiǎn)潔開發(fā)高效運(yùn)行快速資料豐富2.2硬件配置2.3軟件配置2.3.1Python環(huán)境的安裝1.訪問清華大學(xué)開源鏡像網(wǎng)站:/help/anaconda/,并跳轉(zhuǎn)到最新安裝包下載頁面(/anaconda/archive)2.3.1Python環(huán)境的安裝2.下載最新的安裝包,注意時(shí)間順序2.3.1Python環(huán)境的安裝3.下載后按照步驟安裝,對(duì)應(yīng)步驟截圖參考如下,詳細(xì)可見教材,安裝盤注意選擇空間較大的磁盤?。?!注意“Createstartmenushortcuts”務(wù)必勾選?。。?.3.1Python環(huán)境的安裝4.在win11的搜索欄中可以輸入【AnacondaPrompt】,快速彈出命令行界面在彈出的Anaconda控制臺(tái)中,輸入python,出現(xiàn)Python環(huán)境提示信息,證明Python安裝成功,鍵入“exit()”退出python環(huán)境,關(guān)閉對(duì)話框。2.3.2CUDA環(huán)境安裝/s/1KJrZ8D3txpoIIQbSvRPL6Q?pwd=ebphCUDA11.8和配套cuDnn:CUDA12.x:/cuda-downloads一般而言,計(jì)算機(jī)的中央處理器(CPU)會(huì)針對(duì)單線程性能進(jìn)行優(yōu)化,但不擅長(zhǎng)處理計(jì)算密集型任務(wù),因此需要借助顯卡的圖形處理單元(GPU)進(jìn)行計(jì)算。CUDA是英偉達(dá)專為GPU上的通用計(jì)算開發(fā)的并行計(jì)算平臺(tái)和編程模型。在經(jīng)GPU加速的應(yīng)用中,工作負(fù)載的串行部分在CPU上運(yùn)行,而應(yīng)用的計(jì)算密集型部分則以并行方式在數(shù)千個(gè)GPU核心上運(yùn)行。深度神經(jīng)網(wǎng)絡(luò)庫(cuDNN)可以加速PyTorch等深度學(xué)習(xí)框架,能夠以高度優(yōu)化的方式實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)中的前向和反向卷積、池化層、歸一化和激活層等操作。/zh-cn/cudnncuDNN:解壓下載后的cuDNN壓縮包,選中其中bin、include和lib三個(gè)文件夾,拷貝到cuda安裝目錄下,一般為:C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\vX.XcuDnn版本要和CUDA版本對(duì)應(yīng)2.3.2CUDA環(huán)境安裝將cuDNN拷貝到CUDA目錄2.3.3PyTorch安裝condacreate-nlearn-pytorchpython=3.9#pytorch環(huán)境創(chuàng)建condaactivatelearn-pytorch#激活該環(huán)境pipconfigsetglobal.index-url/simple#更換pytorch安裝源pip3installtorchtorchvisiontorchaudio--index-url/whl/cu118打開AnacondaPrompt,依次輸入:安裝pytorch成功截圖2.3.3PyTorch安裝pythonimporttorchprint(torch.cuda.is_available())驗(yàn)證安裝是否成功,依次輸入:驗(yàn)證pytorch及CUDA是否安裝成功2.3.4PyCharm安裝及配置PyCharm下載網(wǎng)址為/pycharm/download/#section=windows如果有edu郵箱,可以下載專業(yè)版(Professional),否則可以下載社區(qū)版(Community)。2.3.4PyCharm安裝及配置①項(xiàng)目創(chuàng)建②③④PyCharm的使用開發(fā)環(huán)境選擇2.3.4PyCharm安裝及配置程序主界面PyCharm的使用創(chuàng)建Python程序2.3.4PyCharm安裝及配置編寫代碼及運(yùn)行PyCharm的使用03任務(wù)3完成手寫數(shù)字識(shí)別功能深度學(xué)習(xí)的HelloWorld3.1手寫識(shí)別開發(fā)流程創(chuàng)建數(shù)據(jù)集創(chuàng)建深度學(xué)習(xí)模型訓(xùn)練和評(píng)估模型保存和導(dǎo)出模型預(yù)測(cè)結(jié)果新的圖片73.2MNIST手寫數(shù)據(jù)集MNIST數(shù)據(jù)集中的數(shù)字圖片是由250個(gè)不同職業(yè)的人純手寫繪制,數(shù)據(jù)集官方網(wǎng)址為:/exdb/mnist/包含有60000張圖片作為訓(xùn)練集數(shù)據(jù),10000張圖片作為測(cè)試集數(shù)據(jù),且每一個(gè)訓(xùn)練元素都是28×28像素的手寫數(shù)字圖片,每一張圖片代表的是從0到9中的每個(gè)數(shù)字?jǐn)?shù)據(jù)集大小[60000,784](60000,28x28)標(biāo)簽表示:one-hot編碼類別0:[1,0,0,0,0,0,0,0,0,0]類別1:
[0,1,0,0,0,0,0,0,0,0]
類別2:
[0,0,1,0,0,0,0,0,0,0]…3.3完成代碼編寫1.創(chuàng)建Chp12.創(chuàng)建utils.py①繪制曲線②顯示手寫文字③標(biāo)簽轉(zhuǎn)為one-hot3.創(chuàng)建mnist_recognize.py①加載訓(xùn)練集②加載測(cè)試集③數(shù)據(jù)可視化④定義網(wǎng)絡(luò)模型⑤訓(xùn)練網(wǎng)絡(luò)模型⑥網(wǎng)絡(luò)推理上個(gè)任務(wù)已完成項(xiàng)目創(chuàng)建通過可視化工具監(jiān)測(cè)訓(xùn)練效果和模型性能具體代碼參見教材,運(yùn)行結(jié)果,準(zhǔn)確率acc:0.969104任務(wù)4完成作業(yè)作業(yè)簡(jiǎn)述深度學(xué)習(xí)的應(yīng)用領(lǐng)域。在任務(wù)3的1.3.3中給出手寫數(shù)字識(shí)別測(cè)試代碼,實(shí)現(xiàn)了預(yù)測(cè)其中最為可能的值,并評(píng)估了其準(zhǔn)確率,一般該評(píng)估方式稱為top-1accuracy,可以進(jìn)一步輸出前5個(gè)可能的值,預(yù)測(cè)其top-5accuracy,修改步驟4代碼,實(shí)現(xiàn)top-5accuracy的評(píng)估。PyTorch深度學(xué)習(xí)項(xiàng)目教程項(xiàng)目2二維曲線擬合CURVEFITTING要點(diǎn):PyTorch基礎(chǔ)語法、神經(jīng)網(wǎng)絡(luò)基礎(chǔ)、多層感知機(jī)、正向傳播、反向傳播、損失函數(shù)和優(yōu)化器講課人:0講課時(shí)間:2025年3月12日項(xiàng)目背景ProjectBackground要點(diǎn):回歸任務(wù)是深度學(xué)習(xí)的基本任務(wù)。問題:工業(yè)上很多測(cè)量無法直接測(cè)量最終結(jié)果。例如想獲得不規(guī)則物體的周長(zhǎng),但是轉(zhuǎn)速和激光點(diǎn)到平臺(tái)的距離,如何找到最能代表數(shù)據(jù)特征的曲線?解決:在工業(yè)測(cè)量和檢測(cè)任務(wù)中,曲線擬合是一個(gè)廣泛應(yīng)用的技術(shù)。曲線擬合是一種利用已知數(shù)據(jù)點(diǎn)來推測(cè)未知數(shù)據(jù)點(diǎn)的方法,常常用于分析傳感器測(cè)量得到的數(shù)據(jù),并根據(jù)這些數(shù)據(jù)預(yù)測(cè)未來的趨勢(shì)。知識(shí)目標(biāo)KnowledgeObjectives掌握PyTorch張量數(shù)據(jù)結(jié)構(gòu)及其運(yùn)算掌握PyTorchGPU計(jì)算方法掌握神經(jīng)網(wǎng)絡(luò)概念及多層感知機(jī)全連接網(wǎng)絡(luò)的搭建掌握損失函數(shù)的選擇和迭代優(yōu)化機(jī)制能力目標(biāo)AbilityGoals能夠根據(jù)需求自定義PyTorch數(shù)據(jù)集類能夠繼承自PyTorch的nn.Module類,編寫神經(jīng)網(wǎng)絡(luò)模型類的代碼能夠編寫訓(xùn)練代碼,包括數(shù)據(jù)加載、模型訓(xùn)練、損失計(jì)算和參數(shù)更新等步驟具備對(duì)網(wǎng)絡(luò)模型性能進(jìn)行初步評(píng)估的能力,包括損失函數(shù)值、準(zhǔn)確率等指標(biāo)的計(jì)算素養(yǎng)目標(biāo)ProfessionalAttainments具備項(xiàng)目化思維,能夠?qū)ぷ魅蝿?wù)進(jìn)行有效分解,并主動(dòng)承擔(dān)相應(yīng)的任務(wù)具備較強(qiáng)的自主學(xué)習(xí)能力,能夠主動(dòng)探索并應(yīng)用新的知識(shí)和技能具備創(chuàng)新意識(shí),能夠針對(duì)不同的曲線擬合場(chǎng)景提出新的解決方案能夠從實(shí)際應(yīng)用角度出發(fā),思考和探索利用模型進(jìn)行預(yù)測(cè)任務(wù)的應(yīng)用場(chǎng)景目錄任務(wù)1理解曲線擬合需求任務(wù)2掌握PyTorch基本語法任務(wù)3搭建二維曲線數(shù)據(jù)集任務(wù)4搭建網(wǎng)絡(luò)結(jié)構(gòu)任務(wù)5訓(xùn)練網(wǎng)絡(luò)模型任務(wù)6網(wǎng)絡(luò)推理任務(wù)7模型結(jié)構(gòu)分析任務(wù)8擬合更多的二維曲線01任務(wù)1理解曲線擬合需求1.1曲線擬合
1.2欠擬合與過擬合欠擬合:如果數(shù)據(jù)本身不符合擬合曲線的模型,那么擬合結(jié)果可能會(huì)出現(xiàn)偏差,甚至出現(xiàn)錯(cuò)誤過擬合:過于復(fù)雜地描述了數(shù)據(jù),對(duì)當(dāng)前采樣數(shù)據(jù)表現(xiàn)良好,但是在新的數(shù)據(jù)點(diǎn)上預(yù)測(cè)精度下降
02任務(wù)2掌握PyTorch基本語法2Tensor基本操作一覽2.1創(chuàng)建TensorTensor是指多維張量(數(shù)組),對(duì)應(yīng)的,零維張量稱之為標(biāo)量,一維張量稱之為矢量,二維張量稱之為矩陣importtorch#標(biāo)量scalar=torch.tensor(1)#向量vector=torch.tensor([1,1])#矩陣matrix=torch.tensor([[1,2],[3,4]])#N維張量tensor_n=torch.rand(3,5,2)
標(biāo)量向量矩陣2.2索引Tensor#訪問向量中的第一個(gè)元素print(vector[0])#訪問矩陣中的第一行元素print(matrix[0,:])#訪問矩陣中的第二列元素print(matrix[:,1])#訪問3維張量中的最后一組矩陣中,除了第一行以外的數(shù)據(jù)print(tensor_n[-1,1:-1,:])索引位置對(duì)應(yīng)為[維數(shù)1,維數(shù)2,維數(shù)3,…,維數(shù)n]。其中:“:”為返回該維度的所有值;“m:n”可以返回該從起始位置m到結(jié)束位置n-1的數(shù)組元素;首個(gè)位置的索引編號(hào)為0;負(fù)數(shù)為從尾部計(jì)算索引位置,尾部的首個(gè)位置索引編號(hào)為“-1”2.3形狀變換1.維度交換228×228×3(高度×寬度×通道數(shù))的RGB圖片轉(zhuǎn)換為3×228×228(通道數(shù)×高度×寬度)的變換#模擬一張RGB圖像image=torch.randint(0,255,(114,228,3))print(image.shape)#輸出為:torch.Size([114,228,3]),分別對(duì)應(yīng)圖像的高度、寬度和通道數(shù)#將H×W×C轉(zhuǎn)換為C×H×Wimage=image.permute(2,1,0)print(image.shape)#輸出為:torch.Size([3,228,114]),分別對(duì)應(yīng)圖像的通道數(shù)、寬度和高度2.3形狀變換2.升降維度可以通過unsqueeze()和squeeze()函數(shù)來實(shí)現(xiàn)維度的提升和降低#提升維度image=image.unsqueeze(0)print(image.shape)#輸出為:torch.Size([1,3,228,114])torch.Size([3,228,114])#降低維度image=image.squeeze(0)print(image.shape)#輸出為:torch.Size([3,228,114])2.3形狀變換3.改變形狀可以通過reshape()和view()函數(shù)改變張量的維度data=torch.randn(4,4)print("數(shù)據(jù)變形前的形狀:{}".format(data.shape))#torch.Size([4,4])data=data.view(2,8)print("數(shù)據(jù)view變形后的形狀:{}".format(data.shape))#torch.Size([2,8])data=data.permute(1,0)print("數(shù)據(jù)維度轉(zhuǎn)換后的形狀:{}".format(data.shape))#torch.Size([8,2])data=data.reshape(4,4)#此處不能用view,因其不能處理內(nèi)存不連續(xù)Tensor的結(jié)構(gòu)print("數(shù)據(jù)reshape變形后的形狀:{}".format(data.shape))#torch.Size([4,4])2.4數(shù)學(xué)運(yùn)算1.算術(shù)運(yùn)算注意其中的機(jī)制:廣播以及in_place操作#標(biāo)量scalar=torch.tensor(1)#向量vector=torch.tensor([1,1])#標(biāo)量與向量相加,廣播print(vector+scalar)#輸出為tensor([2,2])print(torch.add(vector,scalar))#輸出為tensor([2,2])print(vector.add(scalar))#輸出為tensor([2,2])print(vector)#輸出為tensor([1,1]),vector本身沒有被改變print(vector.add_(scalar))#in_place:當(dāng)在一個(gè)張量tensor上進(jìn)行操作之后,直接修改了這個(gè)tensor本身print(vector)#輸出為tensor([2,2]),帶有_的函數(shù)操作,會(huì)對(duì)當(dāng)前值產(chǎn)生影響2.4數(shù)學(xué)運(yùn)算2.矩陣運(yùn)算注意點(diǎn)乘和矩陣乘法a=torch.full([2,2],3,dtype=torch.float)b=torch.ones(2,2)c=a*b#矩陣元素相乘torch.mm(a,b)#矩陣相乘torch.matmul(a,b)#矩陣相乘a@b#矩陣相乘DatatypedtypeTensortype16-bitfloattorch.float16/torch.halftorch.HalfTensor32-bitfloattorch.float32/torch.floattorch.FloatTensor64-bitfloattorch.float64/torch.doubletorch.DoubleTensor8-bitint(u)torch.uint8torch.ByteTensor8-bitint8torch.CharTensor16-bitint16/torch.shorttorch.ShortTensor32-bitint32/torch.IntTensor64-bitint64/torch.longtorch.LongTensorbooleanTorch.boolTorch.BoolTensorPyTorch支持的數(shù)據(jù)類型tensor.type()返回Tensor類型,如torch.LongTensor等tensor.dtype返回tensor數(shù)據(jù)自身的類型,如8,torch.long等2.4數(shù)學(xué)運(yùn)算3.指數(shù)運(yùn)算pow、sqrt、rsqrt、exp和loga=torch.full([2,2],3)a.pow(2)#平方b=a**2#平方b**(0.5)#開根號(hào)torch.sqrt(b.to(torch.double))#開根號(hào)torch.rsqrt(b.to(torch.double))#開根號(hào)之后求倒數(shù)a=torch.exp(torch.ones(2,2))#指數(shù)操作torch.log(a)#默認(rèn)以e為底2.4數(shù)學(xué)運(yùn)算4.均值、方差、標(biāo)準(zhǔn)差運(yùn)算mean、var、stddata=torch.Tensor([1,2,3])#1.求均值dat_mean=torch.mean(data)#=>dat_mean=tensor(2.),均值為2#2.求方差dat_var=torch.var(data)#=>dat_var=tensor(1.),方差為1#3.求標(biāo)準(zhǔn)差data_std=torch.std(data)#=>data_std=tensor(1.),標(biāo)準(zhǔn)差為1
2.5廣播機(jī)制在進(jìn)行逐元素操作時(shí),如果兩個(gè)張量的形狀不完全匹配,PyTorch會(huì)自動(dòng)使用廣播機(jī)制來進(jìn)行形狀的擴(kuò)展,使得兩個(gè)張量的形狀相容,從而進(jìn)行逐元素操作張量維度個(gè)數(shù)不同:將維度較少的張量通過在前面插入長(zhǎng)度為1的維度來擴(kuò)展,直到兩個(gè)張量具有相同的維度個(gè)數(shù)張量在某個(gè)維度上的長(zhǎng)度不匹配:如果其中一個(gè)張量在該維度上的長(zhǎng)度為1,那么可以通過復(fù)制該張量的值來擴(kuò)展該維度,使得兩個(gè)張量在該維度上的長(zhǎng)度相同
報(bào)錯(cuò):如果以上兩個(gè)步驟無法使得兩個(gè)張量的形狀匹配,那么會(huì)拋出形狀不兼容的錯(cuò)誤#創(chuàng)建兩個(gè)形狀不同的張量a=torch.tensor([[1,2,3],[4,5,6]])#形狀為(2,3)b=torch.tensor([10,20,30])#形狀為(3,)#使用廣播機(jī)制進(jìn)行逐元素相加c=a+b#廣播機(jī)制會(huì)自動(dòng)將b擴(kuò)展為(2,3),使得a和b的形狀相同print(c)#輸出為tensor([[11,22,33],#[14,25,36]])2.6Tensor和NumPy的轉(zhuǎn)換NumPy是機(jī)器學(xué)習(xí)和數(shù)據(jù)處理的Python基礎(chǔ)庫,其操作和Tensor類似,很多第三方庫,如OpenCV-Python等,基于NumPy實(shí)現(xiàn)了數(shù)據(jù)預(yù)處理、數(shù)據(jù)增強(qiáng)等操作importnumpyasnpa=torch.tensor([4.0,6])print(a.dtype)#=>torch.float32b=a.numpy()#tensor轉(zhuǎn)換為numpyprint(b.dtype)#=>float32c=torch.from_numpy(b)#numpy轉(zhuǎn)換為tensorprint(c.dtype)#=>torch.float322.7在GPU操作GPU用來執(zhí)行耗時(shí)的密集型計(jì)算操作,CPU用來執(zhí)行調(diào)度、任務(wù)處理等控制型操作iftorch.cuda.is_available():device=torch.device("cuda")x=torch.randn(2,3)print(x)y=x.to(device)z=torch.randn(2,3,device="cuda")print(y+z)#同時(shí)在GPU上才能相加print(z.to("cpu"))#轉(zhuǎn)換回cpu03任務(wù)3搭建二維曲線數(shù)據(jù)集3數(shù)據(jù)集數(shù)據(jù)集(Dataset)一組樣本的集合(Acollectionofexamples)。樣本(Example):
要素:特征、標(biāo)簽數(shù)據(jù)集的一行。一個(gè)樣本包含一個(gè)或多個(gè)特征,此外還可能包含一個(gè)標(biāo)簽。標(biāo)準(zhǔn)數(shù)據(jù)集(StandardDataset)符合一定規(guī)范要求的數(shù)據(jù)集。
classCurveDataSetX2(Dataset):
def__init__(self,start,end,num=100):
#返回大小為(end?start)/step大小的一維張量
#參數(shù)1為初始值,參數(shù)2為結(jié)束值,參數(shù)3為步長(zhǎng)#unsqueeze()用于實(shí)現(xiàn)數(shù)據(jù)升維,滿足PyTorch的數(shù)據(jù)格式要求
self.x=torch.arange(start,end,
(end-start)*1.0/num,
dtype=torch.float32).unsqueeze(1)
noise=torch.normal(0,0.1,self.x.shape)
self.y=self.x.pow(2)+noise
def__getitem__(self,index):
xi=self.x[index]
yi=self.y[index]
returnxi,yi
def__len__(self):
returnlen(self.x)
@staticmethod
defx2(x):
returnx**2PyTorch在數(shù)據(jù)集構(gòu)建上提供了一個(gè)Dataset抽象類。任何自定義的數(shù)據(jù)集都需要繼承這個(gè)類并實(shí)現(xiàn)它的__getitem__()方法和__len__()方法
數(shù)據(jù)集可視化defvisualizing_data(func,x,y_predict,epoch=0,save=False,savePrefix=''):
y=func(x)
plt.figure()
plt.title('curve(epoch={})'.format(epoch))
plt.plot(x,y,color='red',linewidth=1.0,linestyle='-’,
label='groundtruth')
plt.plot(x,y_predict,color='blue',linewidth=1.0,
linestyle='--',
label='predict')
plt.legend(loc='upperright')
ifsave:
plt.savefig('{0}-epoch-{1}.svg'.format(savePrefix,epoch),format='svg',dpi=300)
plt.show()
classCurveDataSetSinX(Dataset):
def__init__(self,start,end,num=100):
self.x=torch.arange(start,end,
(end-start)*1.0/num,
dtype=torch.float32).unsqueeze(1)
noise=torch.normal(0,0.1,self.x.shape)
self.y=torch.sin(self.x)+noise
def__getitem__(self,index):
xi=self.x[index]
yi=self.y[index]
returnxi,yi
def__len__(self):
returnlen(self.x)
@staticmethod
defsin(x):
returnnp.sin(x)04任務(wù)4搭建神經(jīng)網(wǎng)絡(luò)4.1神經(jīng)網(wǎng)絡(luò)人腦中的生物神經(jīng)網(wǎng)絡(luò)計(jì)算機(jī)中的人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)模仿網(wǎng)絡(luò)模仿神經(jīng)元神經(jīng)元連接多層感知機(jī)感知機(jī)4.1神經(jīng)網(wǎng)絡(luò)
4.2激活函數(shù)神經(jīng)網(wǎng)絡(luò)的線性操作可以進(jìn)行傳導(dǎo),但多次傳導(dǎo)的線性預(yù)測(cè)還是線性預(yù)測(cè),對(duì)于復(fù)雜分析缺乏擬合能力
為了提高模型的表達(dá)能力,在神經(jīng)元的傳導(dǎo)之間,添加了一個(gè)非線性函數(shù),并稱之為激活函數(shù)4.2激活函數(shù)
激活函數(shù)給神經(jīng)元引入了非線性因素,使得神經(jīng)網(wǎng)絡(luò)可以任意逼近任何非線性函數(shù),這樣神經(jīng)網(wǎng)絡(luò)就可以應(yīng)用到眾多的非線性模型中,以下為常見的一些激活函數(shù)4.3多層感知機(jī)(全連接網(wǎng)絡(luò))classMLP(nn.Module):
def__init__(self,input_features=1,output_num=1):
#使用super調(diào)用父類中的init函數(shù)對(duì)網(wǎng)絡(luò)進(jìn)行初始化
super(MLP,self).__init__()
#構(gòu)建網(wǎng)絡(luò)子模塊,存儲(chǔ)到MLP的module屬性中
self.fc1=nn.Linear(input_features,20)
self.fc2=nn.Linear(20,20)
self.fc3=nn.Linear(20,output_num)
#按照每層網(wǎng)絡(luò)結(jié)構(gòu)寫處forward函數(shù),即如何進(jìn)行前向傳播
defforward(self,x):
out=torch.tanh(self.fc1(x))
out=torch.tanh(self.fc2(out))
out=self.fc3(out)
returnout
網(wǎng)絡(luò)參數(shù)個(gè)數(shù)
05任務(wù)5訓(xùn)練網(wǎng)絡(luò)模型5.1訓(xùn)練的意義多次的投籃訓(xùn)練為了命中目標(biāo)#單個(gè)數(shù)
dumpy_input=torch.tensor(1.0,dtype=torch.float32).unsqueeze(0)
model=MLP()
output=model(dumpy_input)
print(output)
#一組數(shù)同時(shí)計(jì)算其輸出
dumpy_input=torch.tensor([1.0,2.0],dtype=torch.float32).unsqueeze(1)
model=MLP()
output=model(dumpy_input)
print(output)
多次的網(wǎng)絡(luò)訓(xùn)練為了預(yù)測(cè)結(jié)果5.2正向傳播網(wǎng)絡(luò)計(jì)算過程是從最里層的括號(hào)逐級(jí)到外層的,這個(gè)計(jì)算過程在深度學(xué)習(xí)中被稱為正向傳播5.3損失函數(shù)損失函數(shù)是衡量模型推理和真值之間差異進(jìn)行量化的函數(shù)
5.4反向傳播與優(yōu)化損失函數(shù)梯度下降法:優(yōu)化損失函數(shù)到最小
L2Loss的最小點(diǎn)剛好位于函數(shù)導(dǎo)數(shù)為0的點(diǎn),而且越接近最小點(diǎn),函數(shù)導(dǎo)數(shù)的值越小。因此可以通過求函數(shù)導(dǎo)數(shù)的方法進(jìn)行迭代,函數(shù)的一階導(dǎo)數(shù)也稱為梯度,沿著導(dǎo)數(shù)減少的方向逐漸逼近最優(yōu)點(diǎn)的方法也稱為梯度下降法實(shí)際開發(fā)過程中,由于參數(shù)眾多梯度下降是多次求導(dǎo)迭代的過程5.4反向傳播與優(yōu)化損失函數(shù)
5.5訓(xùn)練迭代過程多次迭代的擬合過程訓(xùn)練使得損失函數(shù)值逐漸減小06任務(wù)6網(wǎng)絡(luò)推理6網(wǎng)絡(luò)推理importtorch
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
model=torch.load('best.pth')
model.eval()
inputs=[-2,-1,0,1,2,18,20]
forinputininputs:
input_tensor=torch.tensor(input,dtype=torch.float32)
outputs=model(input_tensor.to(device).unsqueeze(0))
print(outputs.squeeze(0).cpu().detach().numpy())輸入值預(yù)測(cè)值期望值-23.998024-11.0044901100.079760075010.93614674124.121199641817.6481253242017.461924400在原始觀測(cè)數(shù)據(jù)集上增加了噪聲,所以預(yù)測(cè)值的擬合效果接近但不等于我們的期望值需要注意的是,訓(xùn)練數(shù)據(jù)集的取值范圍為[-4,4),超出該取值范圍的值,模擬缺乏對(duì)應(yīng)的預(yù)測(cè)能力回顧人工智能概念:智能=知識(shí)+智力,網(wǎng)絡(luò)僅限于對(duì)自己了解的知識(shí)進(jìn)行推理07任務(wù)7模型結(jié)構(gòu)分析7.1onnx格式OpenNeuralNetworkExchange(ONNX,開放神經(jīng)網(wǎng)絡(luò)交換)格式,是一個(gè)用于表示深度學(xué)習(xí)模型的文件格式標(biāo)準(zhǔn),可以使不同的人工智能框架(如Pytorch,MXNet等)可以采用相同格式存儲(chǔ)模型數(shù)據(jù)并交互7.2onnx格式導(dǎo)出importos
importtorch
model=torch.load(os.path.join('best.pth'))
model.eval()
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
dummy_input=torch.randn(1,1).to(device)
torch.onnx.export(
model,
dummy_input,
'model_x2.onnx',
input_names=['input'],
output_names=['output'],
#dynamic_axes={'input':{0:'batch_size'},'output':{0:'batch_size'}}
)7.3onnx格式查看Netron軟件下載地址:/lutzroeder/netron或打開https://netron.app/網(wǎng)站可以利用該軟件分析我們的網(wǎng)絡(luò)模型07任務(wù)8擬合更多的二維曲線8.1y=sin(x)擬合train_data=CurveDataSetSinX(start=-4,end=4,num=INPUT_NUM)valid_data=CurveDataSetSinX(start=-4,end=4,num=INPUT_NUM)8.2提升模型表現(xiàn)classMLP(nn.Module):
def__init__(self,input_features=1,output_num=1):
#使用super調(diào)用父類中的init函數(shù)對(duì)網(wǎng)絡(luò)進(jìn)行初始化
super(MLP,self).__init__()
#構(gòu)建網(wǎng)絡(luò)子模塊,存儲(chǔ)到MLP的module屬性中
self.fc1=nn.Linear(input_features,128)
self.fc2=nn.Linear(128,256)
self.fc3=nn.Linear(256,output_num)
#按照每層網(wǎng)絡(luò)結(jié)構(gòu)寫處forward函數(shù),即如何進(jìn)行前向傳播
defforward(self,x):
out=torch.tanh(self.fc1(x))
out=torch.tanh(self.fc2(out))
out=self.fc3(out)
returnout重新訓(xùn)練后的網(wǎng)絡(luò),增加了神經(jīng)元,對(duì)于y=sinx曲線具備了更好的表現(xiàn)力,但同時(shí)也提高了網(wǎng)絡(luò)模型的參數(shù)個(gè)數(shù),修改后的模型參數(shù)個(gè)數(shù):(128+128)+(128*256+256)+(256+1)=33,537個(gè)。訓(xùn)練口號(hào):更高、更快、更強(qiáng)實(shí)際項(xiàng)目上,需要根據(jù)算力等資源取舍09任務(wù)9完成作業(yè)作業(yè)1.修改mlp.py中的代碼,將forward函數(shù)中的激活函數(shù)調(diào)整為torch.sigmoid,運(yùn)行程序,觀察結(jié)果。2.修改train-x2.py中的代碼,調(diào)整以下參數(shù),觀察運(yùn)行結(jié)果,例如將生成隨機(jī)數(shù)據(jù)由400個(gè)改為200個(gè),注意同步修改BATCH_SIZE個(gè)數(shù),對(duì)應(yīng)代碼位置為(以下為未修改之前的狀態(tài)):INPUT_NUM=400#生成400個(gè)隨機(jī)數(shù)據(jù)MAX_EPOCH=300#訓(xùn)練輪數(shù)為300輪BATCH_SIZE=400#單次次訓(xùn)練讀取的數(shù)據(jù)個(gè)數(shù)LR=0.01#學(xué)習(xí)率,即利用反向傳播求導(dǎo)后,更新參數(shù)值的步長(zhǎng)w=w-lr*gradwlog_interval=10#訓(xùn)練信息輸出頻率val_interval=10#驗(yàn)證信息輸出頻率PyTorch深度學(xué)習(xí)項(xiàng)目教程項(xiàng)目3貓狗圖像分類IMAGECLASSIFICATION要點(diǎn):監(jiān)督學(xué)習(xí)、分類任務(wù)、多層感知機(jī)、數(shù)據(jù)增強(qiáng)講課人:0講課時(shí)間:2025年3月12日項(xiàng)目背景ProjectBackground要點(diǎn):分類任務(wù)是深度學(xué)習(xí)的基本任務(wù)。問題:貓狗圖像分類是一個(gè)經(jīng)典的計(jì)算機(jī)視覺問題,目標(biāo)是對(duì)給定的圖像進(jìn)行分類,判斷圖像中是貓還是狗。由于貓狗的相似性,將二者完全分開面臨極大的挑戰(zhàn)。解決:通過監(jiān)督學(xué)習(xí)進(jìn)行解決,即通過帶標(biāo)簽的圖像數(shù)據(jù)集來進(jìn)行訓(xùn)練和評(píng)估模型。訓(xùn)練階段,模型接收大量的貓狗圖像作為輸入,并對(duì)其進(jìn)行學(xué)習(xí),調(diào)整模型參數(shù)以最小化預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽之間的差異。評(píng)估階段,使用另外的圖像數(shù)據(jù)集對(duì)訓(xùn)練好的模型進(jìn)行測(cè)試和驗(yàn)證其分類準(zhǔn)確性。知識(shí)目標(biāo)KnowledgeObjectives理解并應(yīng)用PyTorch中DataSet類進(jìn)行數(shù)據(jù)增強(qiáng),以提高模型泛化能力學(xué)會(huì)使用torchstat工具包對(duì)模型的參數(shù)進(jìn)行統(tǒng)計(jì)分析,以監(jiān)控模型訓(xùn)練狀態(tài)掌握logging工具包的使用,實(shí)現(xiàn)訓(xùn)練過程的日志記錄與輸出,便于模型調(diào)試與分析理解回歸與分類任務(wù)的區(qū)別,并掌握分類任務(wù)中的關(guān)鍵算法學(xué)習(xí)和掌握Sigmoid與Softmax函數(shù)在不同分類任務(wù)中的應(yīng)用能力目標(biāo)AbilityGoals能夠利用網(wǎng)絡(luò)資源加載和處圖像數(shù)據(jù)集,進(jìn)行有效的數(shù)據(jù)預(yù)處理和增強(qiáng)。能夠獨(dú)立搭建并訓(xùn)練一個(gè)全連接神經(jīng)網(wǎng)絡(luò)模型,用于圖像分類任務(wù)。能夠運(yùn)用日志記錄和其他評(píng)估手段,對(duì)模型的性能進(jìn)行監(jiān)控和分析,提出改進(jìn)策略素養(yǎng)目標(biāo)ProfessionalAttainments培養(yǎng)項(xiàng)目化思維,養(yǎng)成項(xiàng)目開發(fā)的全局視角,合理規(guī)劃項(xiàng)目進(jìn)度增強(qiáng)自主學(xué)習(xí)能力,能夠獨(dú)立分析問題,尋找解決方案,并在項(xiàng)目中實(shí)踐提升自我學(xué)習(xí)意識(shí),通過本項(xiàng)目的學(xué)習(xí),激發(fā)對(duì)監(jiān)督學(xué)習(xí)數(shù)據(jù)集收集和構(gòu)建的興趣,主動(dòng)尋找和應(yīng)用更多的學(xué)習(xí)資源目錄任務(wù)1準(zhǔn)備貓狗數(shù)據(jù)集任務(wù)2設(shè)計(jì)圖像分類全連接網(wǎng)絡(luò)任務(wù)3訓(xùn)練圖像分類網(wǎng)絡(luò)任務(wù)4應(yīng)用分類網(wǎng)絡(luò)推理更多圖片任務(wù)5認(rèn)識(shí)深度學(xué)習(xí)的主要任務(wù)01任務(wù)1準(zhǔn)備貓狗數(shù)據(jù)集1.1數(shù)據(jù)集獲取Kaggle網(wǎng)站/competitions/dogs-vs-cats/data作者的百度網(wǎng)盤/s/1e0QIoA3nqoFj-HjNjQtkbg?pwd=18nf1.2數(shù)據(jù)整理及劃分對(duì)收集到的圖像進(jìn)行預(yù)處理:可以使用圖像編輯軟件進(jìn)行裁剪、縮放、旋轉(zhuǎn)、去除噪聲等預(yù)處理操作可參見OpenCV類的教材書籍一般將數(shù)據(jù)集分為訓(xùn)練集、驗(yàn)證集和測(cè)試集3類,根據(jù)數(shù)據(jù)樣本數(shù)量可以按照8:1:1、8:2:0或7:2:1等比例進(jìn)行劃分。訓(xùn)練集:用于訓(xùn)練模型驗(yàn)證集:用于在訓(xùn)練過程中判斷模型是否收斂測(cè)試集:用于評(píng)估模型的性能本項(xiàng)目,首先創(chuàng)建train、val和test文件夾,在對(duì)應(yīng)文件夾內(nèi)再創(chuàng)建cat、dog等具體類別,如圖所示。之后在對(duì)應(yīng)的類別文件夾內(nèi)放置相應(yīng)類別圖片,即可完成數(shù)據(jù)集的構(gòu)建1.3創(chuàng)建數(shù)據(jù)集類classDogCatDataset(Dataset):
def__init__(self,data_dir,transform=None):
“”“
分類任務(wù)的Dataset
:paramdata_dir:str,數(shù)據(jù)集所在路徑
:paramtransform:torch.transform,數(shù)據(jù)預(yù)處理
”“”
self.label_name={“cat”:0,“dog”:1}#需要根據(jù)實(shí)際訓(xùn)練任務(wù)修改
self.data_info=self.get_img_info(data_dir)#data_info存儲(chǔ)所有圖片路徑和標(biāo)簽,在DataLoader中通過index讀取樣本
self.transform=transform
def__getitem__(self,index):
path_img,label=self.data_info[index]
img=Image.open(path_img).convert(‘RGB’)#0~255
ifself.transformisnotNone:
img=self.transform(img)#在這里做transform,轉(zhuǎn)為tensor等等
returnimg,label
def__len__(self):
returnlen(self.data_info)
defget_img_info(self,data_dir):
data_info=list()
forroot,dirs,_inos.walk(data_dir):
#遍歷類別
forsub_dirindirs:
img_names=os.listdir(os.path.join(root,sub_dir))
img_names=list(filter(lambdax:x.endswith(‘.jpg’),img_names))
#遍歷圖片
foriinrange(len(img_names)):
img_name=img_names[i]
path_img=os.path.join(root,sub_dir,img_name)
label=self.label_name[sub_dir]
data_info.append((path_img,int(label)))
returndata_info項(xiàng)目組織結(jié)構(gòu)02任務(wù)2設(shè)計(jì)圖像分類網(wǎng)絡(luò)2分類MLPclassMLP(nn.Module):
def__init__(self,classes=2):#64x64x3
#使用super調(diào)用父類中的init函數(shù)對(duì)網(wǎng)絡(luò)進(jìn)行初始化
super(MLP,self).__init__()
#構(gòu)建網(wǎng)絡(luò)子模塊,存儲(chǔ)到MLP的module屬性中
self.fc1=nn.Linear(64*64*3,32*32*3)
self.fc2=nn.Linear(32*32*3,16*16*3)
self.fc3=nn.Linear(16*16*3,256)
self.fc4=nn.Linear(256,128)
self.fc5=nn.Linear(128,classes)
#按照每層網(wǎng)絡(luò)結(jié)構(gòu)寫處forward函數(shù),即如何進(jìn)行前向傳播
defforward(self,x):
x=x.view(x.size(0),-1)#重置為[batchsize,一維數(shù)組]的形狀
out=torch.relu(self.fc1(x))
out=torch.relu(self.fc2(out))
out=torch.relu(self.fc3(out))
out=torch.relu(self.fc4(out))
out=self.fc5(out)
returnout總參數(shù)個(gè)數(shù):40,341,890torchstat模塊統(tǒng)計(jì):項(xiàng)目組織結(jié)構(gòu)03任務(wù)3訓(xùn)練圖像分類網(wǎng)絡(luò)3.1訓(xùn)練日志importlogging
defget_logger(filename,verbosity=1,name=None):
level_dict={0:logging.DEBUG,1:logging.INFO,2:logging.WARNING}
formatter=logging.Formatter(
"[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s]%(message)s"
)
logger=logging.getLogger(name)
logger.setLevel(level_dict[verbosity])
fh=logging.FileHandler(filename,mode="a",encoding='utf-8')
fh.setFormatter(formatter)
logger.addHandler(fh)
sh=logging.StreamHandler()
sh.setFormatter(formatter)
logger.addHandler(sh)
returnlogger
if__name__=='__main__':
logger=get_logger('test.log')
("這是一條測(cè)試指令")項(xiàng)目組織結(jié)構(gòu)記錄訓(xùn)練過程,更好追溯問題3.2訓(xùn)練過程項(xiàng)目組織結(jié)構(gòu)#參數(shù)設(shè)置MAX_EPOCH=30BATCH_SIZE=128LR=0.01log_interval=10val_interval=1device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")訓(xùn)練初始化train_transform=transforms.Compose([transforms.Resize((64,64)),transforms.RandomCrop(64,padding=4),transforms.ToTensor(),transforms.Normalize(norm_mean,norm_std),])train_data=DogCatDataset(data_dir=train_dir,transform=train_transform)train_loader=DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True,num_workers=4)配置數(shù)據(jù)集net=MLP(classes=2)net.to(device)加載網(wǎng)絡(luò)模型criterion=nn.CrossEntropyLoss()#損失函數(shù)設(shè)置optimizer=optim.SGD(net.parameters(),lr=LR,momentum=0.9)#優(yōu)化器設(shè)置scheduler=torch.optim.lr_scheduler.StepLR(optimizer,step_size=100,gamma=0.1)#設(shè)置學(xué)習(xí)率下降策略
配置訓(xùn)練策略forepochinrange(MAX_EPOCH):...fori,datainenumerate(train_loader):
迭代訓(xùn)練3.2.1初始化參數(shù)初始化訓(xùn)練參數(shù),由于數(shù)據(jù)量超過1萬張圖片,一般需要三位數(shù)的訓(xùn)練輪次才能讓模型收斂,這里可以先預(yù)設(shè)一個(gè)小MAX_EPOCH值,便于觀察程序模塊是否配置正確:判斷是否安裝了英偉達(dá)GPU及其CUDA驅(qū)動(dòng):MAX_EPOCH=30
BATCH_SIZE=128
LR=0.01
log_interval=10
val_interval=1device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")3.2.2配置數(shù)據(jù)集split_dir=os.path.join("data","dogs-vs-cats")
train_dir=os.path.join(split_dir,"train")
valid_dir=os.path.join(split_dir,"val")
norm_mean=[0.485,0.456,0.406]
norm_std=[0.229,0.224,0.225]
train_transform=transforms.Compose([
transforms.Resize((64,64)),
transforms.RandomCrop(64,padding=4),
transforms.ToTensor(),
transforms.Normalize(norm_mean,norm_std),
])
valid_transform=transforms.Compose([
transforms.Resize((64,64)),
transforms.ToTensor(),
transforms.Normalize(norm_mean,norm_std),
])
#構(gòu)建MyDataset實(shí)例
train_data=DogCatDataset(data_dir=train_dir,transform=train_transform)
valid_data=DogCatDataset(data_dir=valid_dir,transform=valid_transform)
#構(gòu)建DataLoder
train_loader=DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True,num_workers=4)
valid_loader=DataLoader(dataset=valid_data,batch_size=BATCH_SIZE,shuffle=True)transforms.Compose:由Pytorch的torchvision庫提供,包括圖像縮放、裁剪、翻轉(zhuǎn)、對(duì)比度變換等多種類型,充分利用模型的4000萬個(gè)參數(shù)記住多樣的數(shù)據(jù)變化,提高模型的表達(dá)能力DogCatDataSet:定義數(shù)據(jù)集DataLoader:主要作用是一次加載一部分?jǐn)?shù)據(jù)到內(nèi)存,防止數(shù)據(jù)一次性加載內(nèi)存或顯存容量不足,參數(shù)shuffle=True的意思為打亂數(shù)據(jù)加載順序,shuffle的英文原意為洗牌3.2.3加載網(wǎng)絡(luò)模型net=MLP(classes=2)
net.to(device)#GPU3.2.4配置訓(xùn)練策略1.配置損失函數(shù)criterion=nn.CrossEntropyLoss()#選擇損失函數(shù)
3.2.4配置訓(xùn)練策略2.優(yōu)化器optimizer=optim.SGD(net.parameters(),lr=LR,momentum=0.9)#選擇優(yōu)化器
scheduler=torch.optim.lr_scheduler.StepLR(optimizer,step_size=100,gamma=0.1)#設(shè)置學(xué)習(xí)率下降策略在PyTorch中,優(yōu)化器(Optimizer)是用于更新神經(jīng)網(wǎng)絡(luò)參數(shù)的工具。它根據(jù)計(jì)算得到的損失函數(shù)的梯度來調(diào)整模型的參數(shù),以最小化損失函數(shù)并改善模型的性能。即優(yōu)化器是一種特定的機(jī)器學(xué)習(xí)算法,通常用于在訓(xùn)練深度學(xué)習(xí)模型時(shí)調(diào)整權(quán)重和偏差。是用于更新神經(jīng)網(wǎng)絡(luò)參數(shù)以最小化某個(gè)損失函數(shù)的方法。它通過不斷更新模型的參數(shù)來實(shí)現(xiàn)這一目的。
SGD(StochasticGradientDescent):Adam(AdaptiveMomentEstimation):通過維護(hù)模型的梯度和梯度平方的一階動(dòng)量和二階動(dòng)量,來調(diào)整模型的參數(shù)。Adam的優(yōu)點(diǎn)是計(jì)算效率高,收斂速度快,缺點(diǎn)是需要調(diào)整超參數(shù)SGD的基本思想是,通過梯度下降的方法,不斷調(diào)整模型的參數(shù),使模型的損失函數(shù)最小化。SGD的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、效率高,缺點(diǎn)是收斂速度慢、容易陷入局部最小值。RMSprop(RootMeanSquarePropagation):是一種改進(jìn)的隨機(jī)梯度下降優(yōu)化器,用于優(yōu)化模型的參數(shù)?;舅枷胧牵ㄟ^維護(hù)模型的梯度平方的指數(shù)加權(quán)平均,來調(diào)整模型的參數(shù)。RMSprop的優(yōu)點(diǎn)是收斂速度快,缺點(diǎn)是計(jì)算復(fù)雜度高,需要調(diào)整超參數(shù)3.2.5迭代訓(xùn)練數(shù)據(jù)模型損失函數(shù)優(yōu)化器損失函數(shù)Loss給到模型Autograd反向傳播計(jì)算梯度,并輸入到優(yōu)化器更新模型參數(shù)Dataloader按照BatchSize加載數(shù)據(jù)迭代訓(xùn)練過程04任務(wù)4應(yīng)用分類網(wǎng)絡(luò)推理4推理path_img="data/dogs-vs-cats/val/dog/dog.11250.jpg"
label_name={0:"cat",1:"dog"}
norm_mean=[0.485,0.456,0.406]
norm_std=[0.229,0.224,0.225]
valid_transform=transforms.Compose([
transforms.Resize((64,64)),
transforms.ToTensor(),
transforms.Normalize(norm_mean,norm_std),
])
device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")
img=Image.open(path_img).convert('RGB')#0~255
img=valid_transform(img)#在這里做transform,轉(zhuǎn)為tensor等等
model=torch.load('train_process/best.pth')
model.eval()
outputs=model(img.to(device).unsqueeze(0))
print(outputs)
_,predicted=torch.max(outputs.data,1)
confidence=torch.softmax(outputs,1).cpu().squeeze(0).detach().numpy()
print(confidence)
label=predicted.cpu().detach().numpy()[0]
print(label)
print(f'預(yù)測(cè)結(jié)果為{label_name[label]},置信度為{confidence[label]}’)項(xiàng)目組織結(jié)構(gòu)4推理置信度confidence=torch.softmax(outputs,1).cpu().squeeze(0).detach().numpy()神經(jīng)網(wǎng)絡(luò)outputs輸出結(jié)果不夠直觀,我們期望輸出結(jié)果為有多大概率為貓,以及有多大概率為狗
05任務(wù)5認(rèn)識(shí)深度學(xué)習(xí)的主要任務(wù)5深度學(xué)習(xí)的主要任務(wù)1.回歸(Regression)回歸任務(wù)的目標(biāo)是預(yù)測(cè)連續(xù)數(shù)值的輸出。深度學(xué)習(xí)在回歸問題中可以學(xué)習(xí)到數(shù)據(jù)之間的復(fù)雜關(guān)系。例如,預(yù)測(cè)房?jī)r(jià)、股票價(jià)格、氣溫等連續(xù)變量的值。在回歸任務(wù)中,我們可以使用不同的神經(jīng)網(wǎng)絡(luò)架構(gòu)(如多層感知器、卷積神經(jīng)網(wǎng)絡(luò))和損失函數(shù)(如均方誤差、平均絕對(duì)誤差)來訓(xùn)練模型。2.分類(Classification)分類任務(wù)的目標(biāo)是將輸入數(shù)據(jù)分為不同的類別。深度學(xué)習(xí)在分類問題中能夠有效地從大量的特征中進(jìn)行學(xué)習(xí),自動(dòng)提取數(shù)據(jù)中的有用信息,從而實(shí)現(xiàn)高準(zhǔn)確率的分類。例如,圖像分類、語音識(shí)別、文本分類等任務(wù)都屬于分類問題。在分類任務(wù)中,我們可以使用不同的神經(jīng)網(wǎng)絡(luò)架和損失函數(shù)來訓(xùn)練模型。5.1線性回歸線性回歸本質(zhì)就是對(duì)數(shù)據(jù)的線性擬合,項(xiàng)目2所述二維曲線擬合就是其中的一種應(yīng)用。我們給出了一個(gè)input輸入,要求預(yù)測(cè)另一個(gè)output輸出,這樣就構(gòu)成了最簡(jiǎn)單的單變量回歸模型。
5.1線性回歸例如經(jīng)典的波士頓房?jī)r(jià)預(yù)測(cè)案例,包括如下字段:CRIM:城市人均犯罪率ZN:住宅用地所占比例INDUS:城市中非商業(yè)用地所占尺寸CHAS:查爾斯河虛擬變量NOX:環(huán)保指數(shù)RM:每棟住宅的房間數(shù)AGE:1940年以前建成的自建單位的比例DIS:距離5個(gè)波士頓就業(yè)中心的加權(quán)距離RAD:距離高速公路的便利指數(shù)TAX:每一萬元的不動(dòng)產(chǎn)稅率PTRATIO:城市中教師學(xué)生比例B:城市中黑人比例LSTAT:城市中有多少百分比的房東屬于低收入階層PRICE:自住房?jī)r(jià)格的中位數(shù)/ml/machine-learning-databases/housing/housing.data可利用到目前未知的所學(xué)知識(shí)實(shí)現(xiàn)一個(gè)波士頓房?jī)r(jià)預(yù)測(cè)的項(xiàng)目5.2邏輯回歸或二分類線性回歸預(yù)測(cè)的是一個(gè)連續(xù)值,邏輯回歸給出的“是”和“否”的回答。“是”和“否”是一種概率問題,就是多大的可能性為“是”,多大的可能性為“否”。例:明天下雨的概率,10%下雨,90%不下雨。這種預(yù)測(cè)就稱為邏輯回歸。邏輯回歸只需要對(duì)我們的output輸出加上一個(gè)Sigmoid對(duì)數(shù)概率回歸函數(shù),就可以用來求其輸出的概率5.3多分類Sigmoid激勵(lì)函數(shù)解決的是二分類的問題,對(duì)于多個(gè)選項(xiàng)的問題,我們可以使用Softmax激勵(lì)函數(shù),它是Sigmoid在n個(gè)可能不同的值上的推廣。多分類數(shù)據(jù)集相對(duì)于貓狗大戰(zhàn)數(shù)據(jù)來講,數(shù)據(jù)規(guī)模和類別更多,其中ImageNet是最為知名的一個(gè)數(shù)據(jù)集。ImageNet包含超過1500萬張標(biāo)記高分辨率圖像的數(shù)據(jù)集,屬于大約22000個(gè)類別。ImageNet模型的排名見/sota/image-classification-on-imagenet06任務(wù)6完成作業(yè)作業(yè)總結(jié)貓狗分類數(shù)據(jù)集創(chuàng)建的方法,可以按照該數(shù)據(jù)集格式,自己創(chuàng)建各種分類數(shù)據(jù)集,例如杯子、圖書等。修改圖像分類網(wǎng)絡(luò)結(jié)構(gòu)中的激活函數(shù)和模型參數(shù),例如將輸入改為256×256×3,如果輸入修改后,還需要修改哪些參數(shù)?修改訓(xùn)練輪次,完成300輪訓(xùn)練,可以比較檢測(cè)精度是否提升。完成波士頓房?jī)r(jià)預(yù)測(cè)項(xiàng)目。PyTorch深度學(xué)習(xí)項(xiàng)目教程項(xiàng)目4提升貓狗圖像分類的準(zhǔn)確率CONVOLUTIONALNEURALNETWORK要點(diǎn):監(jiān)督學(xué)習(xí)、分類任務(wù)、多層感知機(jī)、數(shù)據(jù)增強(qiáng)講課人:0講課時(shí)間:2025年3月12日項(xiàng)目背景ProjectBackground問題:項(xiàng)目3完成貓狗圖像分類項(xiàng)目框架的搭建,但是其分類的準(zhǔn)確率僅有69%,一般在實(shí)際應(yīng)用場(chǎng)景中,準(zhǔn)確率需要達(dá)到95%以上。解決:為了提高圖像分類的準(zhǔn)確率,一種名為卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)的網(wǎng)絡(luò)結(jié)構(gòu)被提出來,通過在網(wǎng)絡(luò)中使用卷積層(ConvolutionalLayer)、池化層(PoolingLayer)和全連接層(FullyConnectedLayer)來自動(dòng)學(xué)習(xí)圖像中的空間層次特征。由于其準(zhǔn)確性和易用性,迅速成為深度學(xué)習(xí)中應(yīng)用廣泛的架構(gòu)之一。知識(shí)目標(biāo)KnowledgeObjectives深入理解卷積神經(jīng)網(wǎng)絡(luò)(CNN)的基本概念、結(jié)構(gòu)和原理學(xué)習(xí)卷積層、池化層和全連接層的功能,以及它們?cè)趫D像特征提取中的作用學(xué)習(xí)不同經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),如AlexNet、VGGNet、ResNet、MobileNet等,并理解它們的優(yōu)缺點(diǎn)及適用場(chǎng)景掌握卷積層尺寸(如濾波器大小、步長(zhǎng)、填充等)的計(jì)算方法及其對(duì)模型性能的影響能力目標(biāo)AbilityGoals能夠具體分析卷積網(wǎng)絡(luò)各層之間的關(guān)系,并理解整個(gè)網(wǎng)絡(luò)的訓(xùn)練和推理過程熟練運(yùn)用Dropout、MaxPool2d、BatchNormalization等模型優(yōu)化技術(shù)以提高網(wǎng)絡(luò)性能和防止過擬合掌握使用PyTorch等深度學(xué)習(xí)框架構(gòu)建和訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò),并應(yīng)用于圖像分類具備調(diào)整網(wǎng)絡(luò)結(jié)構(gòu)和超參數(shù)來優(yōu)化模型性能的能力素養(yǎng)目標(biāo)Pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省綿陽市三臺(tái)中學(xué)2024-2025學(xué)年高二(上)期末生物試卷(含解析)
- 溝槽開挖支護(hù)施工方案
- 橋架鋼結(jié)構(gòu)施工方案
- 導(dǎo)管室裝修施工方案
- 深圳燈光秀施工方案
- 反光涂料施工方案
- 防滑混凝土泳池施工方案
- 5以內(nèi)的3個(gè)數(shù)加減混合題
- 等效電路模型、單顆粒模型、均質(zhì)多孔模型、異構(gòu)模型等
- 地暖加壓泵換向閥工作原理
- 拉沙熱預(yù)防控制技術(shù)指南、拉沙熱診斷和治療方案
- 二手房買賣合同正式版空白
- 西方企業(yè)組織變革理論綜述
- 結(jié)構(gòu)力學(xué)中必須掌握的彎矩圖
- 氫化物(蒸氣)發(fā)生-原子熒光講義
- 國(guó)家二字碼大全--253個(gè)國(guó)家
- (完整版)螺旋鉆孔灌注樁施工工藝
- 公務(wù)接待制度公務(wù)接待審批單公務(wù)接待清單
- 港股通測(cè)試題附詳細(xì)解析答案
- GB31644-2018食品安全國(guó)家標(biāo)準(zhǔn)復(fù)合調(diào)味料
- 合同管理作業(yè)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論