深度學(xué)習(xí) 課件 第8章 深度學(xué)習(xí)框架_第1頁
深度學(xué)習(xí) 課件 第8章 深度學(xué)習(xí)框架_第2頁
深度學(xué)習(xí) 課件 第8章 深度學(xué)習(xí)框架_第3頁
深度學(xué)習(xí) 課件 第8章 深度學(xué)習(xí)框架_第4頁
深度學(xué)習(xí) 課件 第8章 深度學(xué)習(xí)框架_第5頁
已閱讀5頁,還剩93頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章深度學(xué)習(xí)框架深度學(xué)習(xí)深度學(xué)習(xí)工具概覽1TensorFlow2PyTorch3飛槳4目錄Contents2本章人物5中英文術(shù)語對照6深度學(xué)習(xí)框架概述13深度學(xué)習(xí)框架4深度學(xué)習(xí)框架對照5深度學(xué)習(xí)框架發(fā)布時間發(fā)布者支持語言主要特點官方網(wǎng)址TensorFlow2015年GooglePython/C++/Java/Go高度的靈活性、可移植性、多語言支持、豐富的算法庫和完善的文檔/Caffe2013年UCBerkeleyPython/C++/MATLAB高效、靈活、可擴展、大量文檔和教程/CNTK2016年MicrosoftPython/C++/BrainScript跨平臺、支持分布式訓(xùn)練/zh-cn/cognitive-toolkit/已停止主要更新MXNet2017年DMLCPython/C++/MATLAB/Julia/Go/R/Scala可擴展、靈活、多語言支持、支持物聯(lián)網(wǎng)和邊緣設(shè)備PyTorch2017年FacebookC/Lua/Python易用、靈活、部署簡單、支持分布式訓(xùn)練、強大的生態(tài)系統(tǒng)、支持移動端/Theano2016年蒙特利爾大學(xué)Python自動微分、GPU加速、易于編寫/project/Theano/飛槳2016年百度Python同時提供動態(tài)圖和靜態(tài)圖、兼顧靈活性和效率、精選應(yīng)用效果最佳算法模型/昇思2019年華為Python可滿足終端、邊緣計算、云等全場景AI計算需求

TensorFlow26Tensorflow的起源2015年11月6日,Google公司宣布推出全新的深度學(xué)習(xí)開源工具Tensorflow。Tensorflow最初由GoogleBrain團(tuán)隊開發(fā),基于Google開發(fā)的深度學(xué)習(xí)基礎(chǔ)架構(gòu)DistBelief構(gòu)建起來的。官網(wǎng):/Github:/tensorflow/tensorflow7Tensorflow的組成8TensorFlow:一個采用計算圖的形式描述數(shù)值計算的編程框架。節(jié)點:計算圖中每一個節(jié)點表示一次數(shù)學(xué)計算。邊:計算圖中的每一條邊表示計算之間的依賴關(guān)系。張量(Tensor):計算圖的基本數(shù)據(jù)結(jié)構(gòu),可以理解為多維數(shù)據(jù)。流(Flow):張量之間通過計算互相轉(zhuǎn)化的過程。Tensorflow中的張量9是一個物理量,對高維(維數(shù)≥2)的物理量進(jìn)行“量綱分析”的一種工具。簡單的可以理解為:一維數(shù)組稱為矢量二維數(shù)組為二階張量三維數(shù)組為三階張量…Tensorflow中的計算圖10計算圖:用“節(jié)點”(Nodes)和“邊”(Edges)的有向圖來描述數(shù)學(xué)計算的圖。節(jié)點:表示施加的數(shù)學(xué)操作,但也可以表示數(shù)據(jù)輸入(feedin)的起點/輸出(pushout)的終點,或者是讀取/寫入持久變量(persistentvariable)的終點。邊:表示“節(jié)點”之間的輸入/輸出關(guān)系。“邊”可以運輸“大小可動態(tài)調(diào)整”的“張量”。Tensorflow中的計算圖11節(jié)點類型Operation:有一個或者兩個輸入節(jié)點的節(jié)點,執(zhí)行某個操作。Constant:沒有輸入節(jié)點的節(jié)點,執(zhí)行過程中節(jié)點的值不變。Variable:沒有輸入節(jié)點的節(jié)點,執(zhí)行過程中節(jié)點中的值會變。Placeholder:沒有輸入節(jié)點的節(jié)點,執(zhí)行過程中等待外部輸入。Tensorflow中的計算圖12Tensorflow架構(gòu)13前端提供多語言編程環(huán)境,提供統(tǒng)一的編程模型來構(gòu)造計算圖。通過Session的形式,連接TensorFlow后端的「運行時」系統(tǒng),啟動計算圖的執(zhí)行過程。后端提供運行時環(huán)境,負(fù)責(zé)執(zhí)行計算圖。內(nèi)核計算操作,支持常量、變量、矩陣、卷積、激活函數(shù)的操作。網(wǎng)絡(luò)層設(shè)備,RPC和RDMA。設(shè)備層,CPU和GPU。Tensorflow架構(gòu)14Tensorflow的使用15使用張量(Tensor)

表示數(shù)據(jù)。通過變量(Variable)輸入訓(xùn)練數(shù)據(jù),維護(hù)狀態(tài)。使用計算圖(Computationalgraph)來表示計算任務(wù)。在會話(Session)的上下文(Context)

中執(zhí)行計算圖。編程示例1:創(chuàng)建計算圖16編程示例1:創(chuàng)建計算圖17i編程示例2:一元線性回歸18編程示例2:一元線性回歸19編程示例2:一元線性回歸20TensorBoard可視化編程示例3:CNN進(jìn)行CIFAR10分類21import

cifar10import

cifar10_inputimport

tensorflowastfimport

numpyasnpimport

time#定義訓(xùn)練超參數(shù):#定義batch_size,訓(xùn)練輪數(shù)max_steps,以及下載CIFAR-10數(shù)據(jù)的默認(rèn)路徑max_steps=

3000batch_size=

128data_dir=

'E:\\tmp\cifar10_data\cifar-10-batches-bin'#定義初始化weight的函數(shù),定義的同時,對weight加一個L2loss,放在集合'losses'中def

variable_with_weight_loss(shape,stddev,w1):

var=

tf.Variable(tf.truncated_normal(shape,stddev=stddev))

if

w1is

not

None:

weight_loss=

tf.multiply(tf.nn.l2_loss(var),w1,name='weight_loss')

tf.add_to_collection('losses',weight_loss)

return

var編程示例3:CNN進(jìn)行CIFAR10分類22#使用cifar10包中的maybe_download_and_extract()函數(shù)下載數(shù)據(jù)集,并解壓、展開到其默認(rèn)位置cifar10.maybe_download_and_extract()

#在使用cifar10_input類中的distorted_inputs函數(shù)產(chǎn)生訓(xùn)練需要使用的數(shù)據(jù)。需要注意的是,返回#的是已經(jīng)封裝好的tensor,且對數(shù)據(jù)進(jìn)行了DataAugmentation(水平翻轉(zhuǎn)、隨機剪切、設(shè)置隨機亮度#和對比度、對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化)images_train,labels_train=

cifar10_input.distorted_inputs(data_dir=data_dir,batch_size=batch_size)

#再使用cifar10_input.inputs函數(shù)生成測試數(shù)據(jù),這里不需要進(jìn)行太多處理images_test,labels_test=

cifar10_input.inputs(eval_data=True,

data_dir=data_dir,

batch_size=batch_size)#創(chuàng)建數(shù)據(jù)的placeholder#首先定義圖片輸入?yún)?shù),batch_size前面已經(jīng)定義,圖片尺寸大小為24×24,通道數(shù)為3image_holder=

tf.placeholder(tf.float32,[batch_size,24,24,3])#接著創(chuàng)建圖片分類的目標(biāo)標(biāo)簽label_holder=

tf.placeholder(32,[batch_size])編程示例3:CNN進(jìn)行CIFAR10分類23#構(gòu)造網(wǎng)絡(luò)結(jié)構(gòu)#創(chuàng)建第一個卷積層,卷積核大小為5×5,輸入通道為3,輸出通道為64#設(shè)置標(biāo)準(zhǔn)差stddev的值,w1=0表示不進(jìn)行L2正則化weight1=

variable_with_weight_loss(shape=[5,5,3,64],stddev=5e-2,w1=0.0)#使用卷積操作對圖像進(jìn)行卷積運算:strides(步長)包含四個參數(shù):[batch滑動步長,水平滑動#步長,垂直滑動步長,通道滑動步長],padding方式采用SAME卷積kernel1=

tf.nn.conv2d(image_holder,weight1,strides=[1,1,1,1],padding='SAME’)#創(chuàng)建一個包含偏置項的參數(shù)bias1=

tf.Variable(tf.constant(0.0,shape=[64]))#將偏置項添加到卷積的結(jié)果上,并使用ReLU函數(shù)進(jìn)行激活conv1=

tf.nn.relu(tf.nn.bias_add(kernel1,bias1))編程示例3:CNN進(jìn)行CIFAR10分類24#使用最大池化操作對卷積的結(jié)果進(jìn)行下采樣,池化核大小為3×3,步長為2pool1=

tf.nn.max_pool(conv1,ksize=[1,3,3,1],strides=[1,2,2,1],

padding='SAME')#局部響應(yīng)歸一化(LocalResponseNormalization,LRN)主要是對池化輸出進(jìn)行歸一化處理,#對ReLU會比較有用,但不適合Sigmoid激活函數(shù),也可采用批歸一化等歸一化方法norm1=

tf.nn.lrn(pool1,4,bias=1.0,alpha=0.001

/

9.0,beta=0.75)編程示例3:CNN進(jìn)行CIFAR10分類25data_format:表示輸入的格式,有兩種:“NHWC”和“NCHW”,默認(rèn)為“NHWC”。input:輸入是一個4維格式的(圖像)數(shù)據(jù),數(shù)據(jù)的shape由data_format決定:當(dāng)data_format為“NHWC”時,輸入數(shù)據(jù)的shape表示為[batch,in_height,in_width,in_channels],分別表示訓(xùn)練時一個batch的圖片數(shù)量、圖片高度、圖片寬度、圖像通道數(shù)。當(dāng)data_format為“NCHW”時,輸入數(shù)據(jù)的shape表示為[batch,in_channels,in_height,in_width]。filter:卷積核是一個4維格式的數(shù)據(jù),shape表示為:[height,width,in_channels,out_channels],分別表示卷積核的高、寬、深度(與輸入的in_channels應(yīng)相同)、輸出featuremap的個數(shù)(即卷積核的個數(shù))。tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None)編程示例3:CNN進(jìn)行CIFAR10分類26strides:表示步長,是一個長度為4的一維列表,每個元素跟data_format互相對應(yīng),表示在data_format每一維上的移動步長。當(dāng)輸入的默認(rèn)格式為“NHWC”時,則strides=[batch,in_height,in_width,in_channels]。其中batch和in_channels要求為1,即只能在一個樣本的一個通道上的特征圖上進(jìn)行移動,in_height,in_width表示卷積核在特征圖的高度和寬度上移動的步長,即strideheight

和stridewidth。padding:表示填充方式:“SAME”表示當(dāng)stride為1時,輸入和輸出的維度相同;“VALID”表示采用不填充的方式。編程示例3:CNN進(jìn)行CIFAR10分類27tf.nn.max_pool(value,ksize,strides,padding,data_format=’NHWC’,name=None)value:表示池化的輸入,是一個4維格式的數(shù)據(jù),數(shù)據(jù)的shape由data_format決定,默認(rèn)情況下shape為[batch,height,width,channels]。ksize:表示池化窗口的大小,是一個長度為4的一維列表,一般為[1,height,width,1],其他參數(shù)與tf.nn.cov2d中的參數(shù)相同。編程示例3:CNN進(jìn)行CIFAR10分類28#創(chuàng)建第二個卷積層,卷積核大小為5×5,輸入通道為64,輸出通道為64weight2=

variable_with_weight_loss(shape=[5,5,64,64],stddev=5e-2,w1=0.0)#使用卷積操作對歸一化結(jié)果進(jìn)行卷積運算kernel2=

tf.nn.conv2d(norm1,weight2,strides=[1,1,1,1],padding='SAME’)#創(chuàng)建一個包含偏置項的參數(shù)bias2=

tf.Variable(tf.constant(0.1,shape=[64]))#將偏置項添加到卷積的結(jié)果上,并使用ReLU激活函數(shù)conv2=

tf.nn.relu(tf.nn.bias_add(kernel2,bias2))#對卷積結(jié)果進(jìn)行局部響應(yīng)歸一化norm2=

tf.nn.lrn(conv2,4,bias=1.0,alpha=0.001

/

9.0,beta=0.75)#使用最大池化對歸一化結(jié)果進(jìn)行下采樣pool2=

tf.nn.max_pool(norm2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='SAME')

編程示例3:CNN進(jìn)行CIFAR10分類29#構(gòu)造一個全連接層,對池化結(jié)果進(jìn)行扁平化,數(shù)據(jù)長度變?yōu)?84reshape=

tf.reshape(pool2,[batch_size,-1])#獲取扁平化后的數(shù)據(jù)長度dim=

reshape.get_shape()[1].value#對權(quán)重進(jìn)行初始化,全連接層的節(jié)點數(shù)為384,設(shè)置標(biāo)準(zhǔn)差stddev的值,進(jìn)行L2正則化weight3=

variable_with_weight_loss(shape=[dim,384],stddev=0.04,w1=0.004)#創(chuàng)建一個包含偏置項的參數(shù)bias3=

tf.Variable(tf.constant(0.1,shape=[384]))#對扁平化后的數(shù)據(jù)進(jìn)行矩陣乘法運算,并添加偏置項,然后應(yīng)用ReLU激活函數(shù)local3=

tf.nn.relu(tf.matmul(reshape,weight3)+

bias3)

編程示例3:CNN進(jìn)行CIFAR10分類30

編程示例3:CNN進(jìn)行CIFAR10分類31#定義lossdef

loss(logits,labels):

#將標(biāo)簽轉(zhuǎn)換成int64類型

labels=

tf.cast(labels,64)

#使用交叉熵?fù)p失函數(shù)進(jìn)行損失計算

cross_entropy=

tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels=labels,name='cross_entropy_per_example')

#計算平均交叉熵?fù)p失cross_entropy_mean=

tf.reduce_mean(cross_entropy,name='cross_entropy')

#將交叉熵?fù)p失添加到損失集合中

tf.add_to_collection('losses',cross_entropy_mean)

#計算總損失,將損失集合中的所有損失相加

return

tf.add_n(tf.get_collection('losses'),name='total_loss’)#獲取最終的lossloss=

loss(logits,label_holder)編程示例3:CNN進(jìn)行CIFAR10分類32#使用Adam優(yōu)化器train_op=

tf.train.AdamOptimizer(1e-3).minimize(loss)

#使用tf.nn.in_top_k函數(shù)求輸出結(jié)果中topk的準(zhǔn)確率,默認(rèn)使用top1,#也就是輸出分?jǐn)?shù)最高的那一類的準(zhǔn)確率top_k_op=

tf.nn.in_top_k(logits,label_holder,1)

#使用tf.InteractiveSession創(chuàng)建默認(rèn)的session,接著初始化全部模型#參數(shù)sess=

tf.InteractiveSession()tf.global_variables_initializer().run()

編程示例3:CNN進(jìn)行CIFAR10分類33#正式開始訓(xùn)練,在每個訓(xùn)練步中循環(huán)for

stepin

range(max_steps):

start_time=

time.time()

#獲取圖像和標(biāo)簽批次數(shù)據(jù)

image_batch,label_batch=

sess.run([images_train,labels_train])

#運行訓(xùn)練操作和損失計算_,loss_value=

sess.run([train_op,loss],feed_dict={image_holder:image_batch,label_holder:label_batch})

#計算時間間隔

duration=

time.time()-

start_time

編程示例3:CNN進(jìn)行CIFAR10分類34

#每隔十步打印一個訓(xùn)練結(jié)果

if

step%

10

==

0:

example_per_sec

=

batch_size

/

duration

sec_per_batch

=

float(duration)

format_str

=

'step%d,loss=%.2f,%.1fexamples/sec,%.3fsec/batch'

print(format_str

%

(step,loss_value,example_per_sec,sec_per_batch))編程示例3:CNN進(jìn)行CIFAR10分類35#定義測試樣本和迭代次數(shù)num_examples=

10000import

mathnum_iter=

int(math.ceil(num_examples/

batch_size))true_count=

0total_sample_count=

num_iter*

batch_sizestep=

0編程示例3:CNN進(jìn)行CIFAR10分類36#在測試集上進(jìn)行預(yù)測while

step<num_iter:

image_batch,label_batch

=

sess.run([images_test,labels_test])

#運行預(yù)測操作,計算正確預(yù)測的數(shù)量

predictions=

sess.run([top_k_op],feed_dict={image_holder:image_batch,label_holder:label_holder})

true_count

+=

np.sum(predictions)

step+=

1#計算和打印預(yù)測精度precision=

true_count

/

total_sample_countprint('precision@1=%.3f'%precision)PyTorch337Pytorch的起源382017年1月,F(xiàn)acebook人工智能研究院(FAIR)團(tuán)隊在Github上開源了PyTorch,并迅速占據(jù)Github熱度榜榜首。PyTorch的歷史可以追溯到2002年就誕生的Torch。Torch使用了一種不是很大眾的語言Lua作為接口。2017年,Torch的幕后團(tuán)隊對Tensor之上的所有模塊進(jìn)行了重構(gòu),推出了PyTorch。

PyTorch的設(shè)計思路是線性、直觀且易于使用的。當(dāng)你的代碼出現(xiàn)Bug的時候,會有提示以幫助解決問題。PyTorch的代碼相對于Tensorflow而言,更加簡潔直觀。同時對于Tensorflow高度工業(yè)化的很難看懂的底層代碼,PyTorch的源代碼就要友好得多,更容易看懂,更加吸引初學(xué)者學(xué)習(xí)。39PyTorch設(shè)計理念動態(tài)計算圖40TensorFlow1.0屬于命令式的編程語言,而且是靜態(tài)的,首先必須構(gòu)建一個神經(jīng)網(wǎng)絡(luò),然后一次又一次使用同樣的結(jié)構(gòu),如果想要改變網(wǎng)絡(luò)的結(jié)構(gòu),就必須從頭開始。當(dāng)然TensorFlow2.0已經(jīng)支持動態(tài)計算圖了。PyTorch支持動態(tài)計算圖,它過一種反向自動求導(dǎo)的技術(shù),可以零延遲地任意改變神經(jīng)網(wǎng)絡(luò)的行為,能夠為新想法的實現(xiàn)獲得最高的速度和最佳的靈活性。

什么是PyTorch41PyTorch是一個基于Python的科學(xué)計算包NumPy的替代品,可以利用GPU的性能進(jìn)行科學(xué)計算深度學(xué)習(xí)研發(fā)平臺,擁有足夠的靈活性和速度PyTorch的兩個高級功能具有強大的GPU加速的張量計算包含自動求導(dǎo)的深度神經(jīng)網(wǎng)絡(luò)什么是PyTorch42PyTorch的優(yōu)點支持GPU靈活,支持動態(tài)神經(jīng)網(wǎng)絡(luò)底層代碼易于理解自定義擴展PyTorch中的張量43PyTorch中的Tensors類似于NumPy中的ndarrays,同時Tensors可以使用GPU進(jìn)行計算。PyTorch中的操作例如,加法操作的幾種實現(xiàn):44PyTorch中的操作任何使張量會發(fā)生變化的操作都有一個后綴‘_’。例如:x.t_(),將會改變x;45改變大?。喝绻阆敫淖円粋€tensor的大小或者形狀,你可以使用torch.view。PyTorch中的操作如果你有一個元素tensor,使用.item()來獲得這個value。46自動微分autograd包是PyTorch中所有神經(jīng)網(wǎng)絡(luò)的核心,該autograd軟件包為Tensors上的所有操作提供自動微分。它是一個由運行定義的框架,這意味著可以以代碼運行方式定義你的后向傳播,并且每次迭代都可以不同。47自動微分torch.Tensor是包的核心類。如果將其屬性.requires_grad設(shè)置為True,則會開始跟蹤針對tensor的所有操作。完成計算后,可以調(diào)用.backward()來自動計算所有梯度。該張量的梯度將累積到.grad屬性中。要停止tensor歷史記錄的跟蹤,您可以調(diào)用.detach(),它將其與計算歷史記錄分離,并防止將來的計算被跟蹤。48自動微分要停止跟蹤歷史記錄(和使用內(nèi)存),還可以將代碼塊使用withtorch.no_grad():包裝起來。在評估模型時,這特別有用,因為模型在訓(xùn)練階段具有requires_grad=True的可訓(xùn)練參數(shù)有利于調(diào)參,但在評估階段我們不需要梯度。49自動微分還有一個類對于autograd實現(xiàn)非常重要:Function。Tensor和Function互相連接并構(gòu)建一個非循環(huán)圖,它保存整個完整的計算過程的歷史信息。每個張量都有一個.grad_fn屬性保存著張量的Function引用,(如果用戶自己創(chuàng)建張量,則grad_fn是None)。50自動微分如果計算導(dǎo)數(shù),可以調(diào)用Tensor.backward()。如果Tensor是標(biāo)量(即它包含一個元素數(shù)據(jù)),則不需要調(diào)用backward()。如果Tensor有更多元素,是一個張量,則需要指定一個gradient參數(shù)來指定張量的形狀。51神經(jīng)網(wǎng)絡(luò)定義神經(jīng)網(wǎng)絡(luò)可以通過torch.nn包來構(gòu)建。神經(jīng)網(wǎng)絡(luò)基于自動梯度(autograd)來定義一些模型。一個nn.Module包括層和一個方法forward(input),它會返回輸出(output)。52神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程一個典型的神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程:定義一個包含可訓(xùn)練參數(shù)的神經(jīng)網(wǎng)絡(luò);迭代整個輸入;通過神經(jīng)網(wǎng)絡(luò)處理輸入;計算損失(loss);反向傳播梯度到神經(jīng)網(wǎng)絡(luò)的參數(shù);更新網(wǎng)絡(luò)的參數(shù),典型的用一個簡單的更新方法:weight=weight-learning_rate*gradient。53神經(jīng)網(wǎng)絡(luò)示例例如LeNet-554神經(jīng)網(wǎng)絡(luò)示例1.定義一個神經(jīng)網(wǎng)絡(luò)55Output:神經(jīng)網(wǎng)絡(luò)示例2.處理輸入以及調(diào)用反向傳播嘗試隨機生成一個32x32的輸入,期望的輸入維度是32x32。56#均方損失函數(shù)神經(jīng)網(wǎng)絡(luò)示例跟隨損失到反向傳播路徑,可以使用它的.grad_fn屬性,將會看到一個這樣的計算圖:input->conv2d->relu->maxpool2d->conv2d->relu->maxpool2d->view->linear->relu->linear->relu->linear->MSELoss->loss57神經(jīng)網(wǎng)絡(luò)示例當(dāng)我們調(diào)用loss.backward(),整個圖都會微分,而且所有的在圖中的requires_grad=True的張量將會讓他們的grad張量累計梯度。為了實現(xiàn)反向傳播損失,所有需要做的事情僅僅是使用

loss.backward()。需要清空現(xiàn)存的梯度,要不然都將會和現(xiàn)存的梯度累計到一起。58優(yōu)化器torch.optim是實現(xiàn)各種優(yōu)化算法的軟件包,支持最常用的方法,如SGD,Nesterov-SGD,Adam,RMSProp等。用torch.optim構(gòu)造一個優(yōu)化器對象,該對象將保持當(dāng)前狀態(tài)并根據(jù)所計算的梯度更新參數(shù)。59示例1:LeNet-5網(wǎng)絡(luò)手寫數(shù)字識別60導(dǎo)入相關(guān)包及數(shù)據(jù)包示例1:LeNet-5網(wǎng)絡(luò)手寫數(shù)字識別61建立LeNet-5網(wǎng)絡(luò)模型示例1:LeNet-5網(wǎng)絡(luò)手寫數(shù)字識別62數(shù)據(jù)獲取、損失定義、優(yōu)化器定義示例1:LeNet-5網(wǎng)絡(luò)手寫數(shù)字識別63模型訓(xùn)練并保存示例2:CNN進(jìn)行CIFAR10分類64importtorchimportnumpyasnpfrommatplotlibimportpyplotaspltfromtorch.utils.dataimportDataLoaderfromtorchvisionimporttransformsfromtorchvisionimportdatasetsimporttorch.nn.functionalasF示例2:CNN進(jìn)行CIFAR10分類65#定義超參數(shù):#數(shù)據(jù)批量大小batch_size、學(xué)習(xí)率learning_rate、動量法優(yōu)化器參數(shù)momentum、#訓(xùn)練輪數(shù)EPOCHbatch_size=64learning_rate=0.01momentum=0.5EPOCH=10

示例2:CNN進(jìn)行CIFAR10分類66#數(shù)據(jù)集預(yù)處理:調(diào)整圖片大小,轉(zhuǎn)換為張量數(shù)據(jù)形式,即從(H,W,C)到#(C,H,W),再對張量數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理(均值為0,標(biāo)準(zhǔn)差為0),使其更好#地響應(yīng)激活函數(shù),提升學(xué)習(xí)效果transform=transforms.Compose([

transforms.Resize(32),transforms.ToTensor(),

transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])示例2:CNN進(jìn)行CIFAR10分類67#加載數(shù)據(jù)集:按照PyTorch的格式要求,在指定存儲路徑和數(shù)據(jù)集預(yù)處理方法#的情況下,從torchvision包中加載預(yù)設(shè)好的CIFAR10圖像分類數(shù)據(jù)集,分為訓(xùn)#練集和測試集train_dataset=torchvision.datasets.CIFAR10(root=PATH,train=True,transform=transform,download=True)train_loader=DataLoader(dataset=train_dataset,batch_size=BATCH_SIZE,shuffle=True)test_dataset=torchvision.datasets.CIFAR10(root=PATH,train=False,transform=transform,download=True)test_loader=DataLoader(dataset=test_dataset,batch_size=BATCH_SIZE,shuffle=False)#定義類別classes=['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']示例2:CNN進(jìn)行CIFAR10分類68

示例2:CNN進(jìn)行CIFAR10分類69classCNN(nn.Module):def__init__(self):super(CNN,self).__init__()self.conv1=nn.Conv2d(3,6,5)

self.pool=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(6,16,5)self.fc1=nn.Linear(16*5*5,120)self.fc2=nn.Linear(120,84)self.fc3=nn.Linear(84,10)示例2:CNN進(jìn)行CIFAR10分類70#定義模型前向計算函數(shù):原始輸入依次經(jīng)過兩個卷積層和池化層,在展平#后送入全連接層,得到最終輸出,其中所有的卷積層輸出結(jié)果和全連接層#輸出結(jié)果都使用ReLU激活函數(shù)進(jìn)行處理

def

forward(self,x):x=self.pool(F.relu(self.conv1(x)))x=self.pool(F.relu(self.conv2(x)))x=x.view(-1,16*5*5)x=F.relu(self.fc1(x))x=F.relu(self.fc2(x))x=self.fc3(x)

returnx示例2:CNN進(jìn)行CIFAR10分類71#實例化模型model=Net()#構(gòu)造損失函數(shù)和優(yōu)化器,損失函數(shù)采用交叉熵?fù)p失函數(shù),優(yōu)化器采用隨機梯#度下降法criterion=torch.nn.CrossEntropyLoss()optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate,momentum=momentum)#定義模型訓(xùn)練函數(shù):按照超參數(shù)預(yù)設(shè)的訓(xùn)練輪次和加載好的訓(xùn)練集和測試集#進(jìn)行模型訓(xùn)練,用模型對訓(xùn)練集的每批次數(shù)據(jù)進(jìn)行訓(xùn)練,根據(jù)模型輸出結(jié)果#計算損失值,再調(diào)用.backward()方法實現(xiàn)反向傳播,在此基礎(chǔ)上調(diào)用優(yōu)化器#的.step()方法對模型進(jìn)行優(yōu)化。訓(xùn)練過程中,記錄每一訓(xùn)練輪次的模型準(zhǔn)確率#并輸出,以便觀察模型的訓(xùn)練過程示例2:CNN進(jìn)行CIFAR10分類72deftrain(epoch):running_loss=0.0running_total=0running_correct=0

for

batch_idx,datainenumerate(train_loader,0):inputs,target=data#將模型的參數(shù)梯度初始化為0,保證每批次數(shù)據(jù)計算得到的梯度相互獨立optimizer.zero_grad()outputs=model(inputs)loss=criterion(outputs,target)loss.backward()optimizer.step()示例2:CNN進(jìn)行CIFAR10分類73#保存該批次數(shù)據(jù)的損失值和預(yù)測結(jié)果,用于統(tǒng)計訓(xùn)練集上的模型準(zhǔn)確率running_loss+=loss.item()_,predicted=torch.max(outputs.data,dim=1)running_total+=inputs.shape[0]running_correct+=(predicted==target).sum().item()#打印損失和準(zhǔn)確率

ifi%200==199:print('[%d,%5d]:loss:%.3f,acc:%.2f%%'%(epoch+1,batch_idx+1,running_loss/300,100*running_correct/running_total))running_loss=0.0running_total=0running_correct=0示例2:CNN進(jìn)行CIFAR10分類74#模型測試函數(shù):將訓(xùn)練后的模型在測試集上進(jìn)行測試,得到測試準(zhǔn)確率deftest():correct=0total=0withtorch.no_grad():

fordataintest_loader:images,labels=dataoutputs=model(images)_,predicted=torch.max(outputs.data,dim=1)total+=labels.size(0)correct+=(predicted==labels).sum().item()acc=correct/totalprint('[%d/%d]:Accuracyontestset:%.1f%%'%(epoch+1,EPOCH,100*acc))

returnacc示例2:CNN進(jìn)行CIFAR10分類75#執(zhí)行訓(xùn)練與測試if

__name__=='__main__':acc_list_test=[]

for

epochinrange(EPOCH):train(epoch)acc_test=test()acc_list_test.append(acc_test)

#繪制模型準(zhǔn)確率變化曲線plt.plot(acc_list_test)plt.xlabel('Epoch')plt.ylabel(‘AccuracyonTestSet’)Plt.showPaddlePaddle(飛槳)47677飛槳的發(fā)展歷程飛槳前身是2013年百度自主研發(fā)的深度學(xué)習(xí)平臺,一直為百度內(nèi)部工程師使用。2016年9月1日百度世界大會上,時任百度首席科學(xué)家的AndrewNg(吳恩達(dá))宣布將百度深度學(xué)習(xí)平臺對外開放,命名PaddlePaddle。2019年,啟用中文名“飛漿”飛槳是百度公司開發(fā)的開源深度學(xué)習(xí)框架,其英文名為PaddlePaddle。V0.11V0.12V0.13V0.14V0.15V1.0V2.6FluidV2官方網(wǎng)址:/Github主頁:/PaddlePaddle/Paddle/V0.10V1.1V1.2V1.3…飛槳的主要特點與優(yōu)勢78飛槳的底層代碼使用C++編寫,同時支持CPU與GPU。接口支持Python語言,使用方便、開發(fā)便捷。支持Docker部署與原生包部署,提供了搭建私有云的全套解決方案。通信方面也進(jìn)行了很多優(yōu)化。使得高吞吐與高性能的深度學(xué)習(xí)模型開發(fā)成為可能。飛槳的主要功能79飛槳最顯著的優(yōu)勢之一在于它同時擁有面向稠密參數(shù)和稀疏參數(shù)場景的超大規(guī)模深度學(xué)習(xí)模型的并行訓(xùn)練能力,支持多平臺、多操作系統(tǒng)。飛槳同時為用戶提供了動態(tài)圖和靜態(tài)圖兩種機制。靜態(tài)圖是先定義模型結(jié)構(gòu)再運行,運行速度快,顯存占用低;動態(tài)圖則使得所有操作可以即時得到執(zhí)行結(jié)果,更方便模型的調(diào)試。飛槳的裝飾器@paddle.jit.to_static支持動態(tài)圖向靜態(tài)圖的轉(zhuǎn)換,使得測試完成的動態(tài)圖模型可以快速上線部署。飛槳的主要功能80與PyTorch類似,飛槳使用張量(Tensor)表示神經(jīng)網(wǎng)絡(luò)中傳遞的數(shù)據(jù),通過paddle.autograd實現(xiàn)自動微分機制,張量的反向傳播和保存通過該模塊下的.backward()方法和.saved_tensors_hooks()方法來實現(xiàn)。paddle.nn模塊中包含了飛槳支持的所有神經(jīng)網(wǎng)絡(luò)層和相關(guān)函數(shù)的API,神經(jīng)網(wǎng)絡(luò)創(chuàng)建時使用paddle.nn模塊中的API進(jìn)行組網(wǎng)。對于定義好的模型,可以通過sublayers()查看其包含的所有層,也可以通過add_sublayers()向模型中添加新的層。同時,飛槳也支持開發(fā)者自定義損失函數(shù)、評估指標(biāo)和回調(diào)函數(shù),滿足開發(fā)者的定制化需求。飛槳的主要功能81為了加快模型訓(xùn)練速度,飛槳采用了一種稱為自動混合精度(AutomaticMixedPrecision,AMP)訓(xùn)練的機制,可以在模型訓(xùn)練過程中自動為算子選擇合適的數(shù)據(jù)計算精度。使用paddle.amp.auto_cast和paddle.amp.GradScaler,即可在原始訓(xùn)練代碼的基礎(chǔ)上快速開啟自動混合精度訓(xùn)練,使得在復(fù)雜模型的測試和開發(fā)過程中減少資源消耗。此外,飛槳也提供了低開銷性能分析器filer,可以收集和導(dǎo)出性能數(shù)據(jù),幫助開發(fā)者定位性能瓶頸點。飛槳的主要功能82除了支持深度學(xué)習(xí)模型開發(fā)之外,飛槳官網(wǎng)還為用戶提供了七十多種經(jīng)過真實業(yè)務(wù)場景驗證的、應(yīng)用效果較好的官方算法模型,涵蓋了計算機視覺、自然語言處理、推薦系統(tǒng)等領(lǐng)域。同時,飛槳還提供了大量的開源工具集和數(shù)據(jù)集,讓開發(fā)者能夠更快了解和掌握深度學(xué)習(xí)領(lǐng)域的最新發(fā)展情況。飛槳的模型庫圖像分類目標(biāo)檢測計算機視覺圖像分類模型庫主要應(yīng)用于安防領(lǐng)域的人臉識別和智能視頻分析等,交通領(lǐng)域的交通場景識別等。飛槳提供了常用模型:AlexNet、VGG、GoogleNet、ResNet等,方便用戶使用。目標(biāo)檢測的目標(biāo)是是給定一張圖像或是一個視頻幀,讓計算機找出其中所有目標(biāo)的位置,并給出每個目標(biāo)的具體類別。飛槳提供了Faster-RCNN、MobileNet-SSD、PyramidBox等模型,滿足不同場景需求。83飛槳的模型庫自然語言處理詞向量問答系統(tǒng)

閱讀理解-DuReader模型

機器翻譯-Transformer模型

情感分析-Senta模型

語言模型LSTM、GRU等應(yīng)用場景:語音助手、智能搜索、智能客服、智能機器人應(yīng)用場景:機器翻譯應(yīng)用場景:輿情分析、熱點話題分析

語義匹配-DAM模型應(yīng)用場景:問答系統(tǒng)、對話系統(tǒng)、智能客服等84導(dǎo)入必要的包paddle

飛槳核心庫paddle.nn.functional

以函數(shù)方式實現(xiàn)組網(wǎng),需手動傳入?yún)?shù)paddle.vision.transforms

圖像處理函數(shù)集Compose

將一系列圖像處理函數(shù)串行執(zhí)行Normalize

將圖像歸一化示例:CIFAR-10圖像分類importpaddleimportpaddle.nn.functionalasFfrompaddle.vision.transformsimportCompose,Normalize訓(xùn)練數(shù)據(jù)集準(zhǔn)備示例:CIFAR-10圖像分類#定義超參數(shù):#數(shù)據(jù)批量大小BATCH_SIZE、訓(xùn)練輪數(shù)EPOCH_NUM和學(xué)習(xí)率LEARNING_RATEBATCH_SIZE=128EPOCH_NUM=1000LEARNING_RATE=0.001#加載數(shù)據(jù)集,對數(shù)據(jù)進(jìn)行預(yù)處理,配置運行模式和批大小transform=Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])train_dataset=paddle.vision.datasets.Cifar10(mode='train',transform=transform)test_dataset=paddle.vision.datasets.Cifar10(mode='test',transform=transform)train_loader=paddle.io.DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True)test_loader=paddle.io.DataLoader(test_dataset,places=paddle.CPUPlace(),batch_size=BATCH_SIZE)定義CNN模型示例:CIFAR-10圖像分類

示例:CIFAR-10圖像分類#定義模型前向計算函數(shù):原始輸入依次經(jīng)過兩個卷積層和池化層,在扁平化后送入全連接層,#得到最終輸出

defforward(self,x):x=self.conv1(x)x=F.relu(x)x=self.max_pool1(x)x=self.conv2(x)x=F.relu(x)x=self.max_pool2(x)x=paddle.flatten(x,start_axis=1,stop_axis=-1)x=self.linear1(x)x=F.relu(x)x=self.linear2(

溫馨提示

  • 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

提交評論