版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
智能計(jì)算系統(tǒng)
第四章編程框架使用中國(guó)科學(xué)院計(jì)算技術(shù)研究所李威副研究員liwei2017@DrivingExample2編程框架Bang輸入輸出建模實(shí)現(xiàn)運(yùn)行第四章將學(xué)習(xí)到實(shí)現(xiàn)深度學(xué)習(xí)算法所使用的編程框架的簡(jiǎn)單用法3編程框架概述PyTorch概述
PyTorch編程模型及基本用法基于PyTorch的模型推理實(shí)現(xiàn)基于PyTorch的模型訓(xùn)練實(shí)現(xiàn)驅(qū)動(dòng)范例提綱為什么需要編程框架?4深度學(xué)習(xí)算法得到廣泛關(guān)注,越來越多的公司、程序員需要使用深度學(xué)習(xí)算法為什么需要編程框架?5算法理論復(fù)雜代碼實(shí)現(xiàn)工作量大有必要將算法中的常用操作封裝成組件提供給程序員,以提高深度學(xué)習(xí)算法開發(fā)效率為什么需要編程框架?6深度學(xué)習(xí)算法具有多層結(jié)構(gòu),每層的運(yùn)算由一些基本操作構(gòu)成這些基本操作中存在大量共性運(yùn)算,如卷積、池化、激活等。將這些共性運(yùn)算操作封裝起來,可以提高編程實(shí)現(xiàn)效率面向這些封裝起來的操作,硬件程序員可以基于硬件特征,有針對(duì)性的進(jìn)行充分優(yōu)化,使其能充分發(fā)揮硬件的效率定義7隨著深度學(xué)習(xí)研究的深入,深度學(xué)習(xí)算法變得愈加復(fù)雜,研究人員需要花更多的時(shí)間和精力在算法的實(shí)現(xiàn)上深度學(xué)習(xí)編程框架:將深度學(xué)習(xí)算法中的基本操作封裝成一系列組件,這一系列深度學(xué)習(xí)組件,即構(gòu)成一套深度學(xué)習(xí)框架編程框架能夠幫助算法開發(fā)人員更簡(jiǎn)單的實(shí)現(xiàn)已有算法,或設(shè)計(jì)新的算法。也有助于硬件程序員更有針對(duì)性的對(duì)關(guān)鍵操作進(jìn)行優(yōu)化,使其能充分發(fā)揮硬件效率國(guó)內(nèi)外主流編程框架8序號(hào)框架名稱發(fā)布者首次發(fā)布時(shí)間logo1PyTorchFacebook(Meta)20172TensorFlowGoogle20153KerasGoogle20154CaffeBVLC20135PaddlePaddle百度20186Mindspore華為20199編程框架概述PyTorch概述
PyTorch編程模型及基本用法基于PyTorch的模型推理實(shí)現(xiàn)基于PyTorch的模型訓(xùn)練實(shí)現(xiàn)驅(qū)動(dòng)范例提綱Drivingexample-VGG1910神經(jīng)網(wǎng)絡(luò)PyTorch實(shí)現(xiàn)在計(jì)算設(shè)備運(yùn)行__dlp_entry__voidProposal(...){...__nram__halfscores[…];__nramset_half(scores,…);...__bang_maxpool(…);…}編程語言實(shí)現(xiàn)算子,集成到編程框架中PyTorch起源-TorchTorch是瑞士亞普研究所(IDIAP)在2002年發(fā)布的一款機(jī)器學(xué)習(xí)框架,采用LuaJIT腳本編程語言為接口,內(nèi)核采用C/C++來實(shí)現(xiàn)11核心是易于使用的神經(jīng)網(wǎng)絡(luò)和優(yōu)化庫,同時(shí)在實(shí)現(xiàn)復(fù)雜的神經(jīng)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)方面具有最大的靈活性在GPU上具有較高的性能作者:RonanCollobert,SamyBengio,JohnnyMariéthozPyTorch簡(jiǎn)介PyTorch=Py+Torch2017年FacebookAIResearch開源PyTorch是一個(gè)基于Torch的Python開源機(jī)器學(xué)習(xí)庫,用于自然語言處理等應(yīng)用程序,具有強(qiáng)大的GPU加速的張量計(jì)算(如Numpy)能力產(chǎn)生背景:編程語言提供了面向深度學(xué)習(xí)的高效編程庫(NumPy、Eigen、Torch等)Python開源生態(tài)蓬勃發(fā)展12設(shè)計(jì)原則基于Python把研究人員放在首位易用高性能內(nèi)部實(shí)現(xiàn)簡(jiǎn)單,節(jié)省學(xué)習(xí)時(shí)間13EMNLP、ACL、ICLR三家頂會(huì)的PyTorch的占比已經(jīng)超過80%,這一占比數(shù)字在其他會(huì)議中也都保持在70%之上14發(fā)展歷程15時(shí)間版本號(hào)更新內(nèi)容2017.10.1第一個(gè)發(fā)布版本2017.80.2支持高階導(dǎo)數(shù)、分布式計(jì)算、張量廣播等功能2018.40.4支持Windows操作系統(tǒng),將張量和變量合并為張量2018.111.0對(duì)不同后端的分布式計(jì)算有了完善的支持,加強(qiáng)了對(duì)C++前端的支持;發(fā)布PyTorchHub,為用戶提供一系列預(yù)訓(xùn)練模型2019.51.1支持TensorBoard對(duì)張量的可視化2019.101.3增加了對(duì)移動(dòng)端的處理,增加了對(duì)模型量化功能的支持2022.111.13BetterTransformer的穩(wěn)定版2023.32.0目前的最新版,增加了編譯模式學(xué)習(xí)資料一些有趣的應(yīng)用/ritchieng/the-incredible-pytorch斯坦福課程關(guān)于Pytorch的介紹/blog/pytorch/官方github/pytorch1617編程框架概述PyTorch概述
PyTorch編程模型及基本用法基于PyTorch的模型推理實(shí)現(xiàn)基于PyTorch的模型訓(xùn)練實(shí)現(xiàn)驅(qū)動(dòng)范例提綱1、NumPy基礎(chǔ)Python語言提供的高性能編程庫,提供大量庫函數(shù)和操作提供針對(duì)高維數(shù)組的批量化處理能夠高效處理機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺、基于數(shù)組的數(shù)學(xué)任務(wù)NumPy中最重要的數(shù)組類為ndarray,也叫array18創(chuàng)建ndarray的方法19importnumpyasnpmy_data1=np.array([1,2])my_data2=np.array([[1.0,2.0],[3.0,4.0],[5.0,6.0]],np.float32)my_data3=np.arange(3)#[0,1,2]my_data4=np.zeros((3,2))#創(chuàng)建3行2列,元素值全為0的數(shù)組my_data5=np.ones((3,2))#創(chuàng)建3行2列,元素值全為1的數(shù)組my_data6=np.random.random((3,2))#創(chuàng)建3行2列,元素值為0到1之間隨機(jī)值的數(shù)組my_data7=np.full((3,2),7)#創(chuàng)建3行2列,元素值全為7的數(shù)組my_data8=np.eye(3,3)my_data9=np.empty((3,2))#創(chuàng)建3行2列,元素值為隨機(jī)值的數(shù)組np.array(object,dtype)object:數(shù)組dtype:可選,數(shù)組元素的數(shù)據(jù)類型20my_data1=np.array([0,1,2])my_data2=np.array([[0,1],[2,3],[4,5]])my_data3=np.array([[[0,0,0,0],[1,1,1,1],[2,2,2,2]],[[3,3,3,3],[4,4,4,4],[5,5,5,5]]])012012345001122001122334455334455my_data1my_data2my_data3np.arange(start,stop,step,dtype)返回一個(gè)具有n個(gè)元素的行向量,向量中的元素值為[start,(start+step),(start+2*step),…,(start+(n-1)*step)]start:可選,表示起始數(shù)值,默認(rèn)為0stop:終止數(shù)值(不含)step:可選,表示步長(zhǎng),默認(rèn)為1,如果有step則必須給出start21my_data1=np.arange(3,dtype=32)#輸出[0,1,2]my_data2=np.arange(3,9,3)#輸出[3,6]my_data3=np.arange(3,10,3)#輸出[3,6,9]np.eye(N,M,k)返回一個(gè)N*M的二維數(shù)組,對(duì)角線元素為1,其余元素均為0M:可選,表示數(shù)組的列數(shù),沒有就默認(rèn)為Nk:可選,為0表示主對(duì)角線,為負(fù)表示對(duì)角線左移,為正表示對(duì)角線右移22my_data1=np.eye(3)my_data2=np.eye(3,2)my_data3=np.eye(3,5,k=1)[[1,0,0][0,1,0][0,0,1]][[1,0][0,1][0,0]][[0,1,0,0,0][0,0,1,0,0][0,0,0,1,0]]my_data1my_data2my_data3np.eye(num_class)[label_array]在深度學(xué)習(xí)算法處理中,對(duì)標(biāo)簽數(shù)組label_array進(jìn)行one-hot編碼,返回編碼后得到的ndarraynum_class:標(biāo)簽類別數(shù)量23my_data4=np.eye(3)[[0,1,0,2]][[1,0,0][0,1,0][1,0,0][0,0,1]]my_data4ndarray的屬性序號(hào)屬性說明1ndarray.ndim數(shù)組維度(axis)2ndarray.shape數(shù)組在每個(gè)維度上的尺寸3ndarray.size數(shù)組中的元素個(gè)數(shù),等于shape中各元素的乘積4ndarray.dtype數(shù)組元素的數(shù)據(jù)類型(默認(rèn)為float64)5ndarray.itemsize數(shù)組中每個(gè)元素的字節(jié)數(shù)242511111111111111111111111111110123ndimshape()(3)(2,3)(2,3,4)表示數(shù)組中每一個(gè)維度(axis)的尺寸ndarray的形狀屬性(shape)標(biāo)量向量矩陣三維數(shù)組對(duì)應(yīng)數(shù)據(jù)形式111111形狀操作np.reshape(a,newshape)將原始數(shù)組按照newshape重塑并返回?cái)?shù)組元素?cái)?shù)量不變,數(shù)組元素?cái)?shù)據(jù)不變26my_data1=np.arange(4).reshape((2,2))my_data2=np.reshape(my_data1,(4,1))[[0,1][2,3]][[0][1][2][3]]my_data1my_data2np.resize(a,new_shape)按照new_shape對(duì)數(shù)組a重塑,如果new_shape中元素?cái)?shù)量大于原數(shù)組,則從原數(shù)組第一個(gè)元素開始復(fù)制數(shù)據(jù)補(bǔ)充到新數(shù)組中。a.resize(new_shape)是對(duì)多出的數(shù)組元素位置補(bǔ)027my_data1=np.arange(4)my_data2=np.resize(my_data1,(3,2))my_data1.resize(3,2)[[0,1][2,3][0,1]][[0,1][2,3][0,0]]my_data2my_data1索引索引序號(hào)從0開始,若為負(fù)則表示從數(shù)組末尾開始向前計(jì)數(shù)索引28my_data1=np.arange(8)my_data2=my_data1[np.array([2,-2])]my_data3=my_data1.reshape((4,2))my_data4=my_data3[2,1][0,1,2,3,4,5,6,7]my_data1[2,6]my_data2[[0,1][2,3][4,5][6,7]]my_data35my_data4數(shù)學(xué)函數(shù)序號(hào)函數(shù)描述1sincostan正弦函數(shù)余弦函數(shù)正切函數(shù)2arcsinarccosarctan反正弦函數(shù)反余弦函數(shù)反正切函數(shù)3roundfloorceil四舍五入向下取整向上取整4sumdiff指定軸上元素和指定軸上相鄰元素的差5explog指數(shù)函數(shù)對(duì)數(shù)函數(shù)29序號(hào)函數(shù)描述6addsubtractmultiplydivide加法函數(shù)減法函數(shù)乘法函數(shù)除法函數(shù)7realimag取復(fù)數(shù)的實(shí)部取復(fù)數(shù)的虛部8sqrtsquare平方根函數(shù)平方函數(shù)9maximumminimum取最大值函數(shù)取最小值函數(shù)10clip將數(shù)組元素值截取到一定范圍內(nèi)NumPy特點(diǎn)總結(jié)優(yōu)點(diǎn)易用:直接對(duì)數(shù)組進(jìn)行操作,并提供多種常用內(nèi)嵌API供用戶直接調(diào)用高性能:大部分NumPy代碼是基于C語言實(shí)現(xiàn)的,相比Python代碼有更高的實(shí)現(xiàn)性能局限性原生的NumPy只能在CPU上實(shí)現(xiàn)為了在GPU上高效運(yùn)行Python計(jì)算庫,出現(xiàn)了CuPy、Numba、PyCUDA、PyTorch等30312、張量(tensor)張量是計(jì)算圖上的數(shù)據(jù)載體,用張量統(tǒng)一表示所有的數(shù)據(jù),張量在計(jì)算圖的節(jié)點(diǎn)之間傳遞張量對(duì)應(yīng)了神經(jīng)網(wǎng)絡(luò)中在各個(gè)節(jié)點(diǎn)之間傳遞、流動(dòng)的數(shù)據(jù)張量可以看做是n維的數(shù)組,數(shù)組的維數(shù)即為張量的階數(shù)與NumPy中的ndarray不同,PyTorch中的張量可以運(yùn)行在GPU或深度學(xué)習(xí)處理器上,因此具有較高的性能階數(shù)對(duì)應(yīng)數(shù)據(jù)形式0標(biāo)量1向量2矩陣nn維數(shù)組32tensor的創(chuàng)建直接創(chuàng)建從其他張量創(chuàng)建my_data1=torch.tensor([0.0,1.0,2.0,3.0],requires_grad=True)#使用requires_grad參數(shù)來表示 #該張量是否需要計(jì)算梯度my_data2=torch.ones(3,2)#創(chuàng)建3行2列,元素值全為1的張量my_data3=torch.zeros(3,2)#創(chuàng)建3行2列,元素值全為0的張量my_data4=torch.rand(3,2)#創(chuàng)建3行2列的張量,元素值為[0,1)區(qū)間隨機(jī)值my_data5=torch.rand_like(my_data1)#創(chuàng)建與my_data1有相同shape的張量,元素值為[0,1)區(qū)間隨機(jī)值my_data6=torch.zeros_like(my_data1)#創(chuàng)建與my_data1的shape相同,元素值全為0的張量my_data7=torch.ones_like(my_data1)#創(chuàng)建與my_data1的shape相同,元素值全為1的張量33Tensor與NumPy數(shù)組的互相轉(zhuǎn)換從NumPy生成tensor從tensor到NumPy使用from_numpy()和numpy()函數(shù)產(chǎn)生的tensor和NumPy數(shù)組共享內(nèi)存,對(duì)其中一個(gè)的更改也會(huì)使另一個(gè)隨著改變my_data1=np.array([0,1,2,3])my_data2=torch.from_numpy(my_data1)my_data3=torch.zeros(2,2)my_data4=my_data3.numpy()34用于創(chuàng)建張量的常用操作(torch.)操作含義from_numpyzeros/oneseye將NumPy數(shù)組轉(zhuǎn)換為張量創(chuàng)建元素值全為0/1的張量創(chuàng)建對(duì)角元素為1,其余元素為0的張量(用法同NumPy)cat/concatsplitstacktake連接多個(gè)張量切分張量沿新維度連接多個(gè)張量從輸入張量中取出指定元素組成新張量normalrandrandn返回由正態(tài)分布隨機(jī)數(shù)組成的張量返回[0,1)區(qū)間均勻分布隨機(jī)數(shù)組成的張量返回由標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)組成的張量35張量的常用屬性屬性名含義dtypetensor存儲(chǔ)的數(shù)據(jù)類型shapetensor各階的長(zhǎng)度(同NumPy中ndarray的shape屬性)device存儲(chǔ)tensor的設(shè)備對(duì)象grad默認(rèn)為None,當(dāng)調(diào)用backward()進(jìn)行反向傳播后為該tensor的梯度值36張量的數(shù)據(jù)類型(dtype)PyTorch數(shù)據(jù)類型說明torch.float16/torch.halftorch.float32/torch.floattorch.float64/torch.double16位浮點(diǎn)32位浮點(diǎn)64位浮點(diǎn)torch.uint88位無符號(hào)整型816/torch.short32/64/torch.long8位整型16位整型32位整型64位整型torch.bool布爾型torch.bfloat16BrainFloat16示例:my_data1=torch.zeros([2,2],dtype=8)深度學(xué)習(xí)為什么不需要全部float32深度學(xué)習(xí)算法特性37t-SNE可視化深度學(xué)習(xí)數(shù)據(jù)這是一個(gè)典型的手寫體識(shí)別任務(wù)的網(wǎng)絡(luò)特征(神經(jīng)元)二維可視化圖不同類別(顏色)的數(shù)據(jù)間距“大間距
”意味著容忍非精確計(jì)算低位寬從原理上看對(duì)于深度學(xué)習(xí)任務(wù)是可行的數(shù)據(jù)位寬與算法精度不同數(shù)據(jù)對(duì)位寬的需求是不同的38每層數(shù)據(jù)都有其保持網(wǎng)絡(luò)收斂的最低位寬需求,每層數(shù)據(jù)的位寬需求與數(shù)據(jù)分布之間存在關(guān)系訓(xùn)練時(shí)不需要高位寬CNN網(wǎng)絡(luò),分類、檢測(cè)、分割任務(wù)下的低位寬訓(xùn)練神經(jīng)元和權(quán)值自適應(yīng)8bit,梯度8-16bit——精度無損3940張量的device屬性torch.device指定tensor所在的設(shè)備名、設(shè)備序號(hào)用’cuda:n’表示第n個(gè)GPU設(shè)備,用’dlp:n’表示第n個(gè)深度學(xué)習(xí)處理器#在GPU上創(chuàng)建一個(gè)張量my_data1=torch.tensor([0,1,2,3],device=torch.device(‘cuda:1’))my_data2=torch.tensor([0,1,2,3],device=torch.device(‘cuda’,1))my_data3=torch.tensor([0,1,2,3],device=‘cuda:1’)#設(shè)置默認(rèn)的device類型my_device=‘cuda’iftorch.cuda.is_available()else‘cpu’my_data4=torch.tensor([0,1,2,3],device=my_device)張量屬性的轉(zhuǎn)換tensor.to():進(jìn)行張量的數(shù)據(jù)類型或設(shè)備類型轉(zhuǎn)換將GPU上的張量轉(zhuǎn)換成NumPy數(shù)組,需要先將張量轉(zhuǎn)換到CPU上,再轉(zhuǎn)換成NumPy41#張量設(shè)備類型轉(zhuǎn)換my_data1=torch.tensor([0,1,2,3])my_data1=my_data1.to(‘cuda’)#張量數(shù)據(jù)類型轉(zhuǎn)換my_data1=my_data1.to(torch.double)my_data2=torch.tensor([0,1,2,3],device=‘cuda:1’)my_data3=my_data2.cpu().numpy()張量屬性的轉(zhuǎn)換tensor.reshape(*shape):進(jìn)行張量的形狀屬性轉(zhuǎn)換單個(gè)維度上的shape值可以為-1,表示該維度上的shape值需要根據(jù)其他維度的shape來推算42my_data1=torch.tensor([0,1,2,3])my_data2=my_data1.reshape(2,2)my_data3=torch.arange(6)my_data4=my_data3.reshape(-1,2)#形狀轉(zhuǎn)換為(3,2)張量屬性的轉(zhuǎn)換張量從CPU轉(zhuǎn)換到DLP上轉(zhuǎn)換到DLP的兩種方式:a.dlp()a.to(torch.device(‘dlp’))43importtorchimporttorch_dlpa=torch.randn(8192,8192,dtype=torch.float)b=torch.randn(8192,8192,dtype=torch.float)#在CPU上計(jì)算c=torch.matmul(a,b)#在DLP上計(jì)算device=torch.device(‘dlp’)a_dlp=a.to(device)b_dlp=b.to(device)c_dlp=torch.matmul(a_dlp,b_dlp)張量的復(fù)制tensor.clone():對(duì)張量進(jìn)行復(fù)制,返回一個(gè)完全相同的tensor,新張量會(huì)保存在新的內(nèi)存中,且仍然留在計(jì)算圖中44my_data1=torch.tensor([0,1,2,3])my_data2=my_data1.clone()張量的數(shù)據(jù)格式(datalayout)張量數(shù)據(jù)可以有多種數(shù)據(jù)格式,代表了多維數(shù)組以何種線性存儲(chǔ)方式在存儲(chǔ)空間中存儲(chǔ)PyTorch、GPU中采用NCHW,TensorFlow、CPU中采用NHWCN:一批次的數(shù)據(jù)個(gè)數(shù)(batchsize)C:通道數(shù)(channel)H:高度(height)W:寬度(width)一張RGB彩色圖像包含3個(gè)原色(紅色、綠色、藍(lán)色)通道,對(duì)應(yīng)的張量表示中,N=1,C=3用于訓(xùn)練或推理任務(wù)的多張RGB圖像,N=batchsize,C=345張量的數(shù)據(jù)格式(datalayout)以N=2,C=3,H=2,W=2的數(shù)據(jù)為例46080910
11040506
07000102
03HCWn=0202122
23161718
19121314
15n=1HCW數(shù)據(jù)在計(jì)算設(shè)備中按照1維來存儲(chǔ)NCHW:按照W->H->C->N的順序存儲(chǔ)NHWC:按照C->W->H->N的順序存儲(chǔ)000102030405060708091011121314151617181920212223000408010509020610030711121620131721141822151923張量的索引PyTorch的索引方法基本與NumPy相同47my_data1=torch.tensor([0,1,2,3])my_data1[1]=7my_data1[-2]=8#負(fù)號(hào)表示從后往前查找my_data1=[0,7,8,3]my_data2=torch.arange(0,6).reshape([2,3])print(my_data2[1,1])#(4)print(my_data2[0])#([0,1,2])print(my_data2[:,0])#([0,3])張量的切片用[start:end:step]形式來表示切片,其含義為:從start開始,以step為步長(zhǎng)開始讀取張量,到end終止(不包含end)start、end、step均可以缺省,start缺省為0,end缺省為該維度最后一個(gè)元素,step缺省為1start可以為負(fù)數(shù),step不能為負(fù)數(shù)48張量的切片索引49importtorch#my_data1包含2張圖片,每張圖片為3通道,每通道為2*2my_data1=torch.arange(0,24).view([2,3,2,2])#讀取其中一個(gè)像素點(diǎn)print(my_data1[1,1,1,1])#(19)#讀取兩張圖片中通道數(shù)為0、1,高度方向序號(hào)為1的像素print(my_data1[:,0:2,1,:])#讀取第一張圖片,通道為1、2,高度方向序號(hào)為0、1,寬#度方向序號(hào)為0的像素print(my_data1[0,-2:,0:,0])080910
11040506
07000102
03HCWn=0202122
23161718
19121314
15n=1HCW張量的維度壓縮、擴(kuò)展50torch.squeeze(input):將張量中所有值為1的維度移除torch.unsqueeze(input,dim):在第dim維插入值為1的維度my_data1=torch.zeros(3,1,2,1,5)my_data2=torch.squeeze(my_data1)#形狀變?yōu)椋?,2,5)my_data3=torch.squeeze(my_data1,0)#形狀變?yōu)椋?,1,2,1,5)my_data4=torch.squeeze(my_data1,1)#形狀變?yōu)椋?,2,1,5)my_data1=torch.tensor([1,2,3,4])my_data2=torch.unsqueeze(my_data1,0)#得到新張量([[1,2,3,4]])my_data3=torch.unsqueeze(my_data1,1)#得到新張量([[1],#[2],#[3],#[4]])張量的自動(dòng)求導(dǎo)支持PyTorch支持自動(dòng)求導(dǎo),用戶定義好操作的前向計(jì)算和反向梯度計(jì)算規(guī)則,PyTorch能夠在訓(xùn)練時(shí)自動(dòng)調(diào)用計(jì)算圖算子,完成整個(gè)網(wǎng)絡(luò)的自動(dòng)求導(dǎo)使用requires_grad參數(shù)來設(shè)置張量是否需要自動(dòng)求導(dǎo),默認(rèn)為false對(duì)于一個(gè)計(jì)算操作來說,如果所有輸入中有一個(gè)輸入需要求導(dǎo),則輸出就需要求導(dǎo);如果所有輸入都不需要求導(dǎo),則輸出也不需要求導(dǎo)51my_data1=torch.tensor([0.0,1.0,2.0,3.0],requires_grad=True)#使用requires_grad參數(shù)來表示 #該張量是否需要自動(dòng)求導(dǎo),默 #認(rèn)為False523、操作(operation)PyTorch基于張量開展各種類型的計(jì)算操作。每個(gè)操作接收若干個(gè)張量作為輸入,操作完成后更新原張量或生成新張量作為輸出計(jì)算操作是使用PyTorch實(shí)現(xiàn)模型訓(xùn)練和推理的基礎(chǔ)importtorchmy_data1=torch.tensor([-1.3,2.8,3.5,-4.2,-5.6,6.99])my_data2=torch.mul(my_data1,100)53定義計(jì)算操作的方法可以采用torch.operation、tensor.operation、tensor.operation_等形式來實(shí)現(xiàn)張量的計(jì)算操作my_data1=torch.tensor([-1.3,2.8,3.5,-4.2,-5.6,6.99])my_data2=torch.add(my_data1,100)my_data3=my_data1.add(100)my_data4=my_data1.add_(100)54原位(in-place)操作指在存儲(chǔ)原張量的內(nèi)存上直接計(jì)算更新張量值,而不是先復(fù)制張量再計(jì)算更新。其標(biāo)志是在原操作語句后添加“_”與Python語言中的+=、*=類似計(jì)算操作對(duì)應(yīng)的原位操作計(jì)算操作對(duì)應(yīng)的原位操作tensor.addtensor.add_tensor.clamptensor.clamp_tensor.abstensor.abs_tensor.cliptensor.clip_tensor.addcmultensor.addcmul_tensor.eqtensor.eq_tensor.arcsintensor.arcsin_tensor.exptensor.exp_tensor.bitwise_nottensor.bitwise_not_tensor.logical_ortensor.logical_or_tensor.bitwise_xortensor.bitwise_xor_tensor.normtensor.norm_tensor.ceiltensor.ceil_tensor.sigmoidtensor.sigmoid_55原位(in-place)操作原位操作能夠節(jié)省內(nèi)存占用,在進(jìn)行深度學(xué)習(xí)算法推理時(shí),使用原位操作能夠有效減少模型占用的內(nèi)存原位操作會(huì)覆蓋原張量,如果在模型訓(xùn)練時(shí)使用原位操作來更新張量梯度,則每次迭代計(jì)算所得梯度值將被覆蓋,從而破壞模型的訓(xùn)練過程對(duì)于多個(gè)張量同時(shí)引用一個(gè)張量的情況,對(duì)該張量進(jìn)行原位操作會(huì)影響其他張量的操作56操作的廣播(broadcasting)機(jī)制對(duì)于參與計(jì)算操作的多個(gè)張量,如果張量維度不匹配,可以使用PyTorch的廣播機(jī)制對(duì)不匹配的張量維度進(jìn)行擴(kuò)展,最終將這些張量均擴(kuò)展為維度相同能夠進(jìn)行廣播機(jī)制的條件:每個(gè)張量都有至少1個(gè)維度從張量末尾的維度開始對(duì)齊擴(kuò)展,在對(duì)齊后的同一維度中,僅下列情況之一才允許進(jìn)行廣播操作:1)維度尺寸相同;2)維度尺寸不同但其中一個(gè)維度尺寸為1;3)其中一個(gè)張量沒有該維度my_data1=torch.tensor([-1.3,2.8,3.5,-4.2,-5.6,6.99])my_data2=torch.add(my_data1,100)Shape不同的張量仍然可以計(jì)算57my_data1=torch.ones(2,3)my_data2=torch.ones(2,2)my_data3=torch.add(my_data1,my_data2)不可廣播my_data1=torch.ones(2,3,3)my_data2=torch.tensor([[[1],[2],[3]], [[4],[5],[6]]])my_data3=torch.add(my_data1,my_data2)可以廣播my_data1=torch.ones(2,3,3)my_data2=torch.tensor([[1],[2],[3]])my_data3=torch.add(my_data1,my_data2)可以廣播58my_data1=torch.ones(2,3,3)my_data2=torch.tensor([[[1],[2],[3]], [[4],[5],[6]]])my_data3=torch.add(my_data1,my_data2)可以廣播對(duì)于維度數(shù)量相同的張量,比較每個(gè)維度對(duì)應(yīng)的維度尺寸,若維度尺寸不同但其中一個(gè)維度尺寸為1,則將其維度尺寸擴(kuò)展為另一張量的維度尺寸111111111111111111(2,3,3)123456(2,3,1)111111111111111111(2,3,3)123123456456(2,3,3)12345659對(duì)于維度數(shù)量不同的張量,首先從張量末尾的維度開始對(duì)齊擴(kuò)展,對(duì)缺少的維度尺寸補(bǔ)1,再沿每個(gè)維度方向進(jìn)行尺寸對(duì)比及擴(kuò)展my_data1=torch.ones(2,3,3)my_data2=torch.tensor([[1],[2],[3]])my_data3=torch.add(my_data1,my_data2)可以廣播111111111111111111(2,3,3)123(3,1)111111111111111111(2,3,3)111111111111111111(2,3,3)(2,3,3)123123123123123123123(1,3,1)60原位操作的廣播如果是執(zhí)行原位操作的張量需要維度擴(kuò)展或改變,則編譯報(bào)錯(cuò)如果作為原位操作參數(shù)的張量需要維度擴(kuò)展或改變,則仍可通過廣播機(jī)制完成張量操作my_data1=torch.ones(2,3,1)my_data2=torch.ones(2,3,3)my_data3=my_data1.add_(my_data2)編譯報(bào)錯(cuò)my_data1=torch.ones(2,3,3)my_data2=torch.ones(2,1,1)my_data3=my_data1.add_(my_data2)可以廣播61常用計(jì)算操作(torch./tensor.)函數(shù)名稱功能new_tensornew_zeros/new_ones返回一個(gè)新張量返回尺寸與原張量相同,元素值全為0/1的新張量grad訓(xùn)練時(shí)得到的張量梯度add/subtract/multiply/divide加/減/乘/除計(jì)算bitwise_and/bitwise_or/bitwise_not按位與/或/非操作sin/cos/tanh正弦/余弦/正切計(jì)算where(condition,x,y)按條件輸出不同張量to張量數(shù)據(jù)類型、設(shè)備類型轉(zhuǎn)換sort按指定維度將張量元素升序/降序排列round/ceil/floor四舍五入/向上取整/向下取整操作transpose轉(zhuǎn)置計(jì)算624、計(jì)算圖編程框架中使用有向圖來描述計(jì)算過程。有向圖中包含一組節(jié)點(diǎn)和邊支持通過多種高級(jí)語言來構(gòu)建計(jì)算圖(C++/Python)計(jì)算圖對(duì)應(yīng)了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)示例:y=w*xmatmulwxy63節(jié)點(diǎn)和邊節(jié)點(diǎn)一般用來表示各類操作,包括數(shù)學(xué)運(yùn)算、變量讀寫、數(shù)據(jù)填充等,也可以表示輸入數(shù)據(jù)、模型參數(shù)、輸出數(shù)據(jù)邊表示“節(jié)點(diǎn)”之間的輸入輸出關(guān)系。分為兩類:一類是傳遞具體數(shù)據(jù)的邊。傳遞的數(shù)據(jù)即為張量(tensor)。一類是表示節(jié)點(diǎn)之間控制依賴關(guān)系的邊。這類邊不傳遞數(shù)據(jù),只表示節(jié)點(diǎn)執(zhí)行的順序:必須前序節(jié)點(diǎn)計(jì)算完成,后序節(jié)點(diǎn)才開始計(jì)算。節(jié)點(diǎn)邊matmulwxy靜態(tài)圖vs.動(dòng)態(tài)圖靜態(tài)圖先定義整張圖,再運(yùn)行可以對(duì)圖進(jìn)行全局優(yōu)化,獲得更快的運(yùn)算速度調(diào)試不方便動(dòng)態(tài)圖即時(shí)運(yùn)行,網(wǎng)絡(luò)模型可在運(yùn)行時(shí)修改代碼編寫靈活,可立即獲得執(zhí)行結(jié)果,調(diào)試方便優(yōu)化不方便64靜態(tài)圖vs.動(dòng)態(tài)圖65TensorFlow1.x:靜態(tài)圖PyTorch:動(dòng)態(tài)圖x=tf.placeholder(tf.float32,shape=(1,2))y=tf.placeholder(tf.float32)w=tf.variable(tf.random_normal((2,1)))y_pred=tf.matmul(x,w)loss=y_pred-ygrad_w=tf.gradients(loss,w)update_w=w.assign(w-alpha*grad_w)withtf.Session()assess:sess.run(tf.global_variables_initializer())foriinrange(300):sess.run([loss,update_w],feed_dict={x:valuex,y:valuey})x=torch.randn(1,2)y=torch.randn(1,1)w=torch.randn(2,1,requires_grad=True)foriinrange(300):y_pred=x.mm(w)loss=y_pred-yloss.backward()#loss.backward()#再次執(zhí)行將報(bào)錯(cuò)1、構(gòu)建靜態(tài)圖2、每一次iteration中重復(fù)執(zhí)行同樣的圖1、每一次iteration中構(gòu)建并執(zhí)行新圖2、在反向傳播結(jié)束之后,整個(gè)計(jì)算圖就在內(nèi)存中被釋放了現(xiàn)有編程框架中采用的圖模式靜態(tài)圖動(dòng)態(tài)圖PyTorch√√TensorFlow√√Caffe2√PaddlePaddle√√MindSpore√√6667編程框架概述PyTorch概述
PyTorch編程模型及基本用法基于PyTorch的模型推理實(shí)現(xiàn)基于PyTorch的模型訓(xùn)練實(shí)現(xiàn)驅(qū)動(dòng)范例提綱68訓(xùn)練預(yù)測(cè)新數(shù)據(jù)模型參數(shù)預(yù)測(cè)值訓(xùn)練數(shù)據(jù)深度學(xué)習(xí)方法加載訓(xùn)練數(shù)據(jù)集構(gòu)建模型定義損失函數(shù)梯度計(jì)算與優(yōu)化保存模型訓(xùn)練模型構(gòu)建神經(jīng)網(wǎng)絡(luò)實(shí)例化神經(jīng)網(wǎng)絡(luò)調(diào)試讀取輸入圖像神經(jīng)網(wǎng)絡(luò)模型優(yōu)化691、讀取輸入圖像可以利用PIL、OpenCV、torchvision.io等來讀取輸入圖像PIL(PythonImagingLibrary):Python自帶的圖像處理庫支持圖像存儲(chǔ),顯示和處理,能夠處理幾乎所有的圖片存儲(chǔ)模式,包括28個(gè)與圖片處理相關(guān)的模塊或類讀入的數(shù)據(jù)格式為PIL.JpegImagePlugin.JpegImageFile讀入的圖像格式為(W,H,C)70PIL庫中的Image類操作說明open(filename)加載圖像文件mode圖像的色彩模式,包括L(灰度圖像)、RGB(彩色圖像)等size二元組,表示圖像的寬度和高度,單位是像素save(filename,format)保存圖像convert(mode)將圖像轉(zhuǎn)換為新的模式resize(size)將圖像大小調(diào)整為sizefromPILimportImageimage=Image.open(image_name)71PIL與張量的格式轉(zhuǎn)換使用torchvision包中自帶的transforms模塊完成PIL與張量數(shù)據(jù)的格式轉(zhuǎn)換torchvision.transforms模塊包含了圖像轉(zhuǎn)換函數(shù),這些函數(shù)可以作用于PIL對(duì)象和Tensor對(duì)象transforms.Compose():將多個(gè)transforms操作組合在一起importtorchvision.transformsastransformstransforms.Compose([transforms.CenterCrop(5),#裁剪圖像transforms.ToTensor()])72常用transforms操作操作說明Compose將多個(gè)transforms組合在一起ToPILImage將數(shù)據(jù)格式為(C,H,W)的張量、或(H,W,C)的NumPy數(shù)組轉(zhuǎn)換成PIL圖像ToTensor將數(shù)值范圍在[0,255]區(qū)間的PIL格式的圖像、或數(shù)據(jù)格式為(H,W,C)的NumPy數(shù)組轉(zhuǎn)換成(C,H,W)、torch.float類型的張量,數(shù)值范圍為[0.0,1.0]Normalize對(duì)輸入數(shù)據(jù)歸一化Resize對(duì)輸入圖像調(diào)整大小73輸入圖像以PIL形式讀入,返回張量importtorchfromPILimportImageimporttorchvision.transformsastransformsloader=transforms.Compose([transforms.ToTensor()])defimage_loader(image_name):image=Image.open(image_name).convert(‘RGB’)image=loader(image).unsqueeze(0)returnimage.to(device,torch.float)74輸入張量轉(zhuǎn)換成PIL圖像importtorchfromPILimportImageimporttorchvision.transformsastransformsunloader=transforms.ToPILImage()defimage_unloader(tensor):image=tensor.cpu().clone()image=image.squeeze(0)image=unloader(image)returnimage75使用OpenCV方法讀入圖像OpenCV(OpenSourceComputerVisionLibrary)是一個(gè)開源計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫具有C++、Python、Java、MATLAB接口,支持Windows,Linux,Android以及Mac操作系統(tǒng)76使用OpenCV方法讀入圖像importcv2image=cv2.imread(image_name)resize_image=cv2.resize(image,(224,224))resize_image=cv2.cvtColor(resize_image,cv2.COLOR_BGR2RGB)imread(filename):加載圖像文件讀入的數(shù)據(jù)為numpy.ndarray格式,讀入的數(shù)據(jù)類型為uint8,取值范圍為0-255OpenCV中表示彩色圖像使用的是BGR格式,而不是RGB格式,因此,當(dāng)OpenCV配合其他工具包使用時(shí),需要進(jìn)行格式轉(zhuǎn)換77使用torchvision.io包讀入圖像fromtorchvision.ioimportread_imageimporttorchvision.transformsastransforms#讀入圖像img=read_image('example.jpg')#將讀入的張量轉(zhuǎn)換為PIL圖像my_img=transforms.ToPILImage()(img)torchvision.io包提供了對(duì)圖像、視頻文件的讀寫操作torchvision.io.read_image(path,mode):讀入JPEG或PNG格式的圖像,并保存為3維RGB或灰度張量,返回輸出張量outputtensor[channel,height,width],數(shù)據(jù)格式uint8,值范圍[0,255]torchvision.io.read_video(filename):從文件中讀入視頻,返回視頻及音頻幀78加載圖像loader=transforms.Compose([transforms.Resize(imsize),transforms.ToTensor()])#轉(zhuǎn)換為torchtensordefimage_loader(image_name):#圖像加載函數(shù)image=Image.open(image_name)image=loader(image).unsqueeze(0)returnimage.to(device,torch.float)my_img=image_loader('sytle.jpg')79顯示讀入圖像matplotlib.pyplot是matplotlib的一個(gè)基于狀態(tài)的接口。提供了一種類似MATLAB的隱式繪圖方式,主要用于交互式繪圖和簡(jiǎn)單的編程繪圖生成importnumpyasnpimportmatplotlib.pyplotaspltx=np.array([1,2])y=np.cos(x)plt.plot(x,y)80常用繪圖操作操作說明ion()打開交互模式ioff()關(guān)閉交互模式imshow(image)在屏幕上顯示圖像title(imagetitle)為圖像設(shè)置標(biāo)題pause(interval)啟動(dòng)持續(xù)interval秒的GUI事件循環(huán)。如果有活動(dòng)的圖形,它將在執(zhí)行該命令前更新和顯示,并且在該命令執(zhí)行期間運(yùn)行GUI事件循環(huán)(如果有)plot()繪制線圖figure()創(chuàng)建一個(gè)圖形對(duì)象的函數(shù),用于后續(xù)的繪圖操作show()顯示所有打開的圖形812、構(gòu)建神經(jīng)網(wǎng)絡(luò)可以自定義神經(jīng)網(wǎng)絡(luò)模型,也可以直接調(diào)用PyTorch框架中提供的模型自定義模型PyTorch提供torch.nn、torch.nn.Module、torch.nn.functional等模塊,用于自定義神經(jīng)網(wǎng)絡(luò)模型直接調(diào)用預(yù)訓(xùn)練模型PyTorch提供torchvision.models,包含了用于處理不同任務(wù)的各種模型,如圖像分類、語義分割、目標(biāo)檢測(cè)、關(guān)鍵點(diǎn)檢測(cè)等82torch.nn.ModulePyTorch使用模塊(module)來表示神經(jīng)網(wǎng)絡(luò)torch.nn.Module是用于封裝PyTorch模型及組件的基類,自定義模型需繼承該基類包含了__init__以及forward方法等__init__方法定義了Module的內(nèi)部狀態(tài),自定義模型時(shí)需調(diào)用該方法進(jìn)行模型的初始化forward定義了每次調(diào)用需執(zhí)行的計(jì)算操作,自定義的子類會(huì)將其覆蓋83自定義網(wǎng)絡(luò)模型的方法需要繼承torch.nn.Module類首先通過__init__方法初始化整個(gè)模型,定義模型結(jié)構(gòu)及待學(xué)習(xí)的參數(shù),再使用forward方法定義模型的前向計(jì)算過程PyTorch支持模型的自動(dòng)梯度計(jì)算,因此在forward()中無需定義反向計(jì)算過程importtorch.nnasnnimporttorch.nn.functionalasFclassmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()#獲取當(dāng)前類的父類(即nn.Module),并調(diào)用父類的構(gòu)造函數(shù)self.conv=nn.Conv2d(3,64,kernel_size=3,stride=1)defforward(self,x):returnF.relu(self.conv(x))84parameter與buffer模塊類(module)中包含兩種不同狀態(tài)的參數(shù):parameters:可學(xué)習(xí)的參數(shù),即反向傳播時(shí)可以被優(yōu)化器更新的參數(shù)buffers:不可學(xué)習(xí)的參數(shù),即反向傳播時(shí)不可以被優(yōu)化器更新的參數(shù)Parameter被保存在state_dict之中Buffer分成兩種:persistent和non-persistent。前者保存在state_dict中,而后者不包含在state_dict中保存模型時(shí)保存的是包含在state_dict中的參數(shù)(parameter、persistentbuffer)對(duì)注冊(cè)過的parameter和buffer,在執(zhí)行module.to(device)操作時(shí),可以自動(dòng)進(jìn)行設(shè)備移動(dòng)85torch.nn.Module的常用屬性或方法(1/2)屬性或方法說明parameters()返回包含了模塊中所有parameter的迭代器(iterator)buffers()返回包含了模塊中所有buffer的迭代器state_dict()返回引用了模塊中所有狀態(tài)的字典,包含了parameter和persistentbuffer參數(shù)register_parameter(name,param)在模塊中注冊(cè)一個(gè)parameter。parameter保存在state_dict中register_buffer(name,tensor,persistent=True)在模塊中注冊(cè)一個(gè)buffer。persistent為True的buffer保存在state_dict中add_module(name,module)將名為name的子模塊module添加到當(dāng)前模塊中,子模塊通常為torch.nn.Conv2d、torch.nn.ReLU等86torch.nn.Module的常用屬性或方法(2/2)屬性或說明requires_grad_(requires_grad=True)原位設(shè)置parameter的requires_grad屬性。當(dāng)需要對(duì)模型進(jìn)行精調(diào),或僅對(duì)模型的一部分進(jìn)行訓(xùn)練時(shí),可以使用該方法將不需要變化的部分模塊凍結(jié)to(device)/to(dtype)/to(tensor)轉(zhuǎn)換為指定的設(shè)備/數(shù)據(jù)類型/張量type(dst_type)將所有parameter和buffer原位轉(zhuǎn)換為dst_typezero_grad()將所有parameter的梯度設(shè)置為0train()設(shè)置模塊為訓(xùn)練模式eval()設(shè)置模塊為評(píng)估模式87創(chuàng)建parameter的兩種方法(1/2)在定義module時(shí)將成員變量(如self.weight)通過nn.Parameter()創(chuàng)建,得到的參數(shù)會(huì)自動(dòng)注冊(cè)為parametersimporttorch.nnasnnclassmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()self.weight=nn.Parameter(torch.randn(2,2))#torch.nn.Parameter繼承自 #torch.tensor,定義了模塊中 #的可學(xué)習(xí)參數(shù)defforward(self,x):returnx.mm(self.weight)88創(chuàng)建parameter的兩種方法(2/2)直接通過nn.Parameter()創(chuàng)建普通Parameter對(duì)象,得到的parameter對(duì)象再通過register_parameter()注冊(cè)classmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()weight=nn.Parameter(torch.randn(2,2))self.register_parameter('weight',weight)defforward(self,x):returnx.mm(self.weight)89創(chuàng)建buffer的方法創(chuàng)建張量,得到的張量對(duì)象再通過register_buffer()注冊(cè)classmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()my_buffer=torch.ones(2,2)self.register_buffer(‘my_buffer’,my_buffer)defforward(self,x):returnx.mm(self.my_buffer)90torch.nn中的計(jì)算功能在torch.nn中定義了一些計(jì)算功能類,如卷積層、池化層、線性層、歸一化層以及非線性激活等操作計(jì)算類型計(jì)算操作卷積層nn.Conv1d,nn.Conv2d,nn.Conv3d池化層nn.MaxPool1d,nn.MaxPool2d,nn.MaxPool3d,nn.AvgPool1d,nn.AvgPool2d,nn.AvgPool3d非線性激活nn.ELU,nn.ReLU,nn.SELU,nn.Sigmoid,nn.Tanh歸一化層nn.BatchNorm1d,nn.BatchNorm2d,nn.BatchNorm3d,nn.InstanceNorm1d,nn.InstanceNorm2d,nn.InstanceNorm3d,循環(huán)神經(jīng)網(wǎng)絡(luò)層nn.RNN,nn.LSTM,nn.GRU線性層nn.Linear損失函數(shù)nn.L1Loss,nn.MSELoss,nn.CrossEntropyLoss91torch.nn.functional包含多種計(jì)算函數(shù),可以通過接口直接調(diào)用可以在自定義模型的forward方法中直接調(diào)用常用的函數(shù)包括功能類型函數(shù)卷積conv1d、conv2d、conv3d、conv_transpose1d、conv_transpose2d、conv_transpose3d池化avg_pool1d、avg_pool2d、avg_pool3d、max_pool1d、max_pool2d、max_pool3d激活threshold、relu、elu、softmax、tanh、batch_norm損失函數(shù)cross_entropy、mse_loss92torch.nn.functional和torch.nn計(jì)算操作的比較torch.nn.xx是一個(gè)類,通常在模塊的__init__方法中通過對(duì)其進(jìn)行實(shí)例化來定義模塊的成員變量,并在forward方法中進(jìn)行模型中可學(xué)習(xí)參數(shù)的更新torch.nn.functional.xx是一個(gè)函數(shù),通常用于forward方法中,函數(shù)中傳遞的參數(shù)需要在__init__方法中創(chuàng)建并初始化以Conv2d為例說明二者的區(qū)別torch.nn.Conv2d是一個(gè)類
torch.nn.functional.conv2d是一個(gè)函數(shù)classtorch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True,padding_mode=‘zeros’,device=None,dtype=None)torch.nn.functional.conv2d(input,weight,bias=None,stride=1,padding=0,dilation=1,groups=1)93用法區(qū)別-torch.nnimporttorch.nnasnnclassmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()#實(shí)例化nn.Conv2dself.conv=nn.Conv2d(3,64,kernel_size=3)defforward(self,x):returnself.conv(x)94用法區(qū)別-torch.nn.functionalimporttorch.nnasnnimporttorch.nn.functionalasFclassmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()self.weight=nn.Parameter(torch.randn(3,1))self.bias=nn.Parameter(torch.randn(1))defforward(self,x):#F.conv2d函數(shù)傳遞的參數(shù)需要在__init__方法中創(chuàng)建并初始化returnF.conv2d(x,self.weight,self.bias)95torch.nn.Sequential一種序列容器,繼承自Module類,將一系列計(jì)算操作封裝成一個(gè)序列在__init__()方法中按照順序定義所包含的所有操作,封裝到nn.Sequential中在forward()方法中接收輸入并傳遞給序列中的第一個(gè)操作,按順序?qū)⑶耙粋€(gè)操作的輸出傳遞給下一個(gè)操作的輸入,最終返回最后一個(gè)操作的輸出importtorch.nnasnnclassmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()self.features=nn.Sequential(nn.Conv2d(3,64,kernel_size=3),nn.ReLU())defforward(self,x):returnself.features(x)96利用torch.nn.Sequential構(gòu)建自定義模塊可以利用torch.nn.Sequential,通過數(shù)組切片索引的方式,構(gòu)建自定義計(jì)算模塊classmyModule(nn.Module):def__init__(self):super(myModule,self).__init__()self.layers=nn.Sequential(nn.Conv2d(3,64,kernel_size=3),nn.ReLU(),nn.Conv2d(64,192,kernel_size=3),nn.ReLU())defforward(self,x):returnself.layers(x)model=myModule()conv1=nn.Sequential(*model.layers[:1])#conv1=convconv2=nn.Sequential(*model.layers[:3])#conv2=conv+relu+conv直接調(diào)用預(yù)訓(xùn)練模型基于某一種網(wǎng)絡(luò)結(jié)構(gòu),首先在一個(gè)初始任務(wù)場(chǎng)景、初始數(shù)據(jù)集上訓(xùn)練好一個(gè)模型,然后再應(yīng)用到目標(biāo)任務(wù)上,針對(duì)目標(biāo)任務(wù)的特征、數(shù)據(jù)集,對(duì)訓(xùn)練好的模型進(jìn)行精調(diào)(fine-tune),最終滿足目標(biāo)任務(wù)的需求在應(yīng)用到目標(biāo)任務(wù)時(shí),不需要從零開始訓(xùn)練模型,只需要調(diào)用已有的預(yù)訓(xùn)練模型參數(shù),進(jìn)行簡(jiǎn)單的微調(diào),能夠節(jié)省大量的計(jì)算資源和計(jì)算時(shí)間9798torchvision.modelsPyTorch的torchvision包中提供了torchvision.models子包,其中包含了大量的預(yù)訓(xùn)練模型,可用于圖像分類、語音分割、目標(biāo)檢測(cè)、視頻分類、關(guān)鍵點(diǎn)檢測(cè)等任務(wù)對(duì)每一種網(wǎng)絡(luò)模型,提供多種精度的權(quán)重支持,使用時(shí)可根據(jù)實(shí)際需求來加載合適的權(quán)重importtorchvision.modelsasmodels#僅加載網(wǎng)絡(luò)結(jié)構(gòu),不需要加載預(yù)訓(xùn)練模型參數(shù)my_model1=models.vgg19()#加載網(wǎng)絡(luò)結(jié)構(gòu),同時(shí)加載一種權(quán)重my_model2=models.vgg19(weights=VGG19_Weights.IMAGENET1K_V1)#加載網(wǎng)絡(luò)結(jié)構(gòu),同時(shí)加載當(dāng)前最優(yōu)權(quán)重my_model2=models.vgg19(weights
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 展會(huì)宣傳推廣合同(2篇)
- 小賣鋪?zhàn)赓U合同(2篇)
- 2025年度建筑密封硅酮膠招標(biāo)采購合同3篇
- 二零二五年度智慧城市物聯(lián)網(wǎng)設(shè)備采購合同2篇
- 二零二五版果園果樹種植技術(shù)指導(dǎo)與承包合同3篇
- 2024版短期貸款合同范例3篇
- 二零二五年度消防工程監(jiān)理合同2篇
- 二零二五年度建筑工程項(xiàng)目招投標(biāo)與合同履約擔(dān)保服務(wù)合同3篇
- 二零二五版股權(quán)代持糾紛調(diào)解與風(fēng)險(xiǎn)防范合同5篇
- 二零二五年度不動(dòng)產(chǎn)權(quán)屬轉(zhuǎn)移擔(dān)保合同3篇
- 無人機(jī)航拍技術(shù)教案(完整版)
- 人教PEP版(2024)三年級(jí)上冊(cè)英語Unit 4《Plants around us》單元作業(yè)設(shè)計(jì)
- 《保密法》培訓(xùn)課件
- 醫(yī)院項(xiàng)目竣工驗(yàn)收和工程收尾階段的管理措施專項(xiàng)方案
- 2024年涉密人員考試試題庫保密基本知識(shí)試題附答案(考試直接用)
- 2024年桂林中考物理試卷
- DL∕T 5362-2018 水工瀝青混凝土試驗(yàn)規(guī)程
- (正式版)JC∕T 60023-2024 石膏條板應(yīng)用技術(shù)規(guī)程
- DL-T5054-2016火力發(fā)電廠汽水管道設(shè)計(jì)規(guī)范
- (權(quán)變)領(lǐng)導(dǎo)行為理論
- 家用電器可靠性與壽命預(yù)測(cè)研究
評(píng)論
0/150
提交評(píng)論