![深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-模型評估及模型調(diào)優(yōu)_第1頁](http://file4.renrendoc.com/view8/M03/38/09/wKhkGWcA9SGAA0-_AADfuN2tx-E520.jpg)
![深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-模型評估及模型調(diào)優(yōu)_第2頁](http://file4.renrendoc.com/view8/M03/38/09/wKhkGWcA9SGAA0-_AADfuN2tx-E5202.jpg)
![深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-模型評估及模型調(diào)優(yōu)_第3頁](http://file4.renrendoc.com/view8/M03/38/09/wKhkGWcA9SGAA0-_AADfuN2tx-E5203.jpg)
![深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-模型評估及模型調(diào)優(yōu)_第4頁](http://file4.renrendoc.com/view8/M03/38/09/wKhkGWcA9SGAA0-_AADfuN2tx-E5204.jpg)
![深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-模型評估及模型調(diào)優(yōu)_第5頁](http://file4.renrendoc.com/view8/M03/38/09/wKhkGWcA9SGAA0-_AADfuN2tx-E5205.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
模型評估及模型調(diào)優(yōu)深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)知識(shí)要點(diǎn)5.1評估指標(biāo)5.1.1準(zhǔn)確率5.1.2查準(zhǔn)率5.1.3召回率5.1.4F1值5.1.5ROC與AUC5.2數(shù)據(jù)集處理5.2.1數(shù)據(jù)集劃分5.2.2數(shù)據(jù)增強(qiáng)5.3模型調(diào)優(yōu)5.3.1回調(diào)函數(shù)5.3.2超參數(shù)調(diào)整5.3.3模型結(jié)構(gòu)調(diào)整目錄5.1評估指標(biāo)當(dāng)訓(xùn)練好一個(gè)模型之后,需要對模型進(jìn)行評估,評估可以反映出模型的各種指標(biāo)優(yōu)劣。在了解評估指標(biāo)之前,必須先了解什么是混淆矩陣(CoufusionMatrix)。混淆矩陣是評估模型結(jié)果的指標(biāo),屬于模型評估的一部分。此外,混淆矩陣多用于判斷分類器(Classifier)的優(yōu)劣,適用于分類型的數(shù)據(jù)模型,如分類樹(ClassificationTree)、邏輯回歸(LogisticRegression)、線性判別分析(LinearDiscriminantAnalysis)等方法。5.1評估指標(biāo)所謂混淆矩陣就是根據(jù)分類時(shí)預(yù)測結(jié)果與實(shí)際情況的對比做出的表格,如表5-1所示。其中Positive代表正類、Negative代表負(fù)類、Predicted代表預(yù)測結(jié)果、Actual代表實(shí)際情況。ConfusionMatrixPredictedPositiveNegativeActualPositiveTPFNNegativeFPTN表5-1混淆矩陣表5-1中的指標(biāo)解釋如下。TP表示TruePositive,即真正:將正類預(yù)測為正類的數(shù)量。FP表示FalsePositive,即假正:將負(fù)類預(yù)測為正類的數(shù)量,可以稱為誤報(bào)率。TN表示TrueNegative,即真負(fù):將負(fù)類預(yù)測為負(fù)類的數(shù)量。FN表示FalseNegative,即假負(fù):將正類預(yù)測為負(fù)類的數(shù)量,可以稱為漏報(bào)率。5.1評估指標(biāo)5.1.1準(zhǔn)確率最簡單、最常使用的評估指標(biāo)就是準(zhǔn)確率(Accuracy),它可以從某種意義上判斷出一個(gè)模型是否有效。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,0,1]accuracy=0forindex,valueinenumerate(pred):ifvalue==true[index]:accuracy+=1print('accuarcy:%.2f%%'%(accuracy/len(true)*100))使用Python來計(jì)算準(zhǔn)確率的代碼如下。在正、負(fù)樣本不均衡的情況下,準(zhǔn)確率作為評估指標(biāo)是不合適的。5.1評估指標(biāo)5.1.2查準(zhǔn)率
查準(zhǔn)率(Precision)又叫精確率,它表示被正確檢索的樣本數(shù)與被檢索到的樣本總數(shù)之比,簡單地說查準(zhǔn)率是識(shí)別正確的結(jié)果在所識(shí)別出的結(jié)果中所占的比例。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1]precision=0forindex,valueinenumerate(pred):ifvalue==true[index]:precision+=1print('precision:%.2f%%'%(precision/len(pred)*100))使用Python計(jì)算查準(zhǔn)率的代碼如下。5.1評估指標(biāo)5.1.3召回率
召回率(Recall)又叫查全率,它表示被正確檢索的樣本數(shù)與應(yīng)當(dāng)被檢索到的樣本數(shù)之比。從概念上看,查準(zhǔn)率和召回率是一對相互矛盾的指標(biāo),一般而言,查準(zhǔn)率高時(shí),召回率往往偏低;召回率高時(shí),查準(zhǔn)率往往偏低。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#應(yīng)當(dāng)被檢索到的樣本數(shù)index_1_num=str(true).count("1")recall=0forindex,valueinenumerate(pred):使用Python計(jì)算召z回率的代碼如下。#被正確檢索的樣本數(shù)ifvalue==true[index]andvalue==1:recall+=1print('recall:%.2f%%'%(recall/index_1_num*100))5.1評估指標(biāo)5.1.3召回率
召回率(Recall)又叫查全率,它表示被正確檢索的樣本數(shù)與應(yīng)當(dāng)被檢索到的樣本數(shù)之比。從概念上看,查準(zhǔn)率和召回率是一對相互矛盾的指標(biāo),一般而言,查準(zhǔn)率高時(shí),召回率往往偏低;召回率高時(shí),查準(zhǔn)率往往偏低。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#應(yīng)當(dāng)被檢索到的樣本數(shù)index_1_num=str(true).count("1")recall=0forindex,valueinenumerate(pred):使用Python計(jì)算召z回率的代碼如下。#被正確檢索的樣本數(shù)ifvalue==true[index]andvalue==1:recall+=1print('recall:%.2f%%'%(recall/index_1_num*100))5.1評估指標(biāo)5.1.3召回率
召回率(Recall)又叫查全率,它表示被正確檢索的樣本數(shù)與應(yīng)當(dāng)被檢索到的樣本數(shù)之比。從概念上看,查準(zhǔn)率和召回率是一對相互矛盾的指標(biāo),一般而言,查準(zhǔn)率高時(shí),召回率往往偏低;召回率高時(shí),查準(zhǔn)率往往偏低。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#應(yīng)當(dāng)被檢索到的樣本數(shù)index_1_num=str(true).count("1")recall=0forindex,valueinenumerate(pred):使用Python計(jì)算召z回率的代碼如下。#被正確檢索的樣本數(shù)ifvalue==true[index]andvalue==1:recall+=1print('recall:%.2f%%'%(recall/index_1_num*100))5.1評估指標(biāo)5.1.4F1值
F1值(F1Score)是統(tǒng)計(jì)學(xué)中用來衡量二分類模型精度的一種指標(biāo)。它同時(shí)兼顧了分類模型的查準(zhǔn)率和召回率。F1值可以看作模型查準(zhǔn)率和召回率的一種調(diào)和平均,它的最大值是1,最小值是0。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#應(yīng)當(dāng)被檢索到的樣本數(shù)index_1_num=str(true).count("1")recall=0precision=0forindex,valueinenumerate(pred):使用Python計(jì)算F1值的代碼如下:ifvalue==true[index]andvalue==1:recall+=1ifvalue==true[index]:precision+=1precision=precision/len(pred)*100recall=recall/index_1_num*100print('f1:%.2f%%'%((2*precision*recall)/(precision+recall)))5.1評估指標(biāo)5.1.5ROC與AUC
受試者工作特征曲線(ReceiverOperatingCharacteristicCurve,ROC)源于軍事領(lǐng)域,而后在醫(yī)學(xué)領(lǐng)域應(yīng)用甚廣,其名稱也正是來自醫(yī)學(xué)領(lǐng)域。
ROC的x軸表示假陽性率(FalsePositiveRate,F(xiàn)PR),y軸表示真陽性率(TruePositiveRate,TPR),也就是召回率。ROC越陡,表示模型效果越好。
曲線下面積(AreaUnderCurve,AUC)表示ROC與坐標(biāo)軸圍成的面積,顯然這個(gè)面積的數(shù)值不會(huì)大于1。又由于ROC一般都處于y=x這條直線的上方,因此AUC的取值范圍為0.5~1。AUC越大表示模型效果越好。5.1評估指標(biāo)#導(dǎo)入要用的庫fromsklearn.metricsimportroc_curvefromsklearn.metricsimportroc_auc_scoreasAUCimportmatplot.pyplotasplttrue=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#利用roc_curve函數(shù)獲得的FPR和recall都是一系列值FPR,recall,thresholds=roc_curve(true,pred)#計(jì)算AUCarea=AUC(test_prob["1"],test_prob["0"])使用Python繪制ROC和AUC的代碼如下。#畫圖plt.figure()plt.plot(FPR,recall,label='ROCcurve(Auc=%0.2f)'%area)plt.xlabel('FalsePositiveRate')plt.ylabel('TruePositiveRate')plt.legend(loc="lowerright")plt.show()5.2數(shù)據(jù)集處理5.2.1數(shù)據(jù)集劃分
對于需要解決的問題的樣本數(shù)據(jù),在建立模型的過程中,數(shù)據(jù)一般會(huì)被劃分為以下幾個(gè)部分。訓(xùn)練集(TrainSet):用訓(xùn)練集對算法或模型進(jìn)行訓(xùn)練。驗(yàn)證集(ValidationSet):又稱簡單交叉驗(yàn)證集(Hold-outCrossValidationSet),利用驗(yàn)證集進(jìn)行交叉驗(yàn)證,即評估幾種算法或模型中哪一個(gè)最好,從而選擇出最好的模型。?測試集(TestSet):最后利用測試集對模型進(jìn)行測試,獲取模型運(yùn)行的無偏估計(jì)(對學(xué)習(xí)方法進(jìn)行評估)。在小數(shù)據(jù)量的時(shí)代,如100、1000、10000的數(shù)據(jù)量,可以將數(shù)據(jù)集按照以下比例進(jìn)行劃分。
無驗(yàn)證集的情況:70%/30%。?有驗(yàn)證集的情況:60%/20%/20%。5.2數(shù)據(jù)集處理
測試集的主要目的是評估模型的效果,如在單個(gè)分類器中,在百萬級別的數(shù)據(jù)中選擇其中1000條數(shù)據(jù)足以評估單個(gè)模型的效果。數(shù)據(jù)量較大的情況可以按照以下比例進(jìn)行劃分。00萬數(shù)據(jù)量:98%/1%/1%。超百萬數(shù)據(jù)量:99.5%/0.25%/0.25%(或者99.5%/0.4%/0.1%)。接下來,使用程序進(jìn)行數(shù)據(jù)集的劃分。假設(shè)某一文件存放的數(shù)據(jù)如圖5-1所示,表明了圖片路徑與類別。圖片名稱中包含了圖片類別(1與0)。圖5-1數(shù)據(jù)展示5.2數(shù)據(jù)集處理
使用Python對數(shù)據(jù)集進(jìn)行劃分,代碼如下。importrandom#分為訓(xùn)練集與測試集split=0.8withopen('train.txt')asf:txt_data=f.readlines()#隨機(jī)打亂random.shuffle(txt_data)train_len=int(len(txt_data)*split)#劃分?jǐn)?shù)據(jù)集train_txt=txt_data[:train_len]test_txt=txt_data[train_len:]print(train_txt)print(test_txt)
然后,以8∶2的比例劃分訓(xùn)練集以及測試集,這里只是提供了一種參考的寫法,還可以通過修改split參數(shù)進(jìn)行其他比例的劃分,或者增加新的參數(shù)劃分為訓(xùn)練集、測試集、驗(yàn)證集等。5.2數(shù)據(jù)集處理5.2.2數(shù)據(jù)增強(qiáng)
3只小狗在我們看來是同一只小狗,但是由于小狗的位置被平移了,神經(jīng)網(wǎng)絡(luò)認(rèn)為這是不同的小狗。
在訓(xùn)練的時(shí)候,經(jīng)常會(huì)遇到數(shù)據(jù)不足的情況。例如,在一個(gè)任務(wù)中,數(shù)據(jù)集只包含幾百張圖片,而通過這幾百張圖片訓(xùn)練出來的模型很容易造成過擬合。然而神經(jīng)網(wǎng)絡(luò)內(nèi)部的參數(shù)是巨大的,大量的參數(shù)要求人們提供更多的數(shù)據(jù)以達(dá)到更好的預(yù)測結(jié)果。5.2數(shù)據(jù)集處理
可以很容易地聯(lián)想到擴(kuò)充數(shù)據(jù)最簡單的方法,就是通過平移、旋轉(zhuǎn)、鏡像等多種方式,對已有的圖片進(jìn)行數(shù)據(jù)擴(kuò)充,也就是本小節(jié)要說到的數(shù)據(jù)增強(qiáng)。
一個(gè)神經(jīng)網(wǎng)絡(luò)如果能夠?qū)⒁粋€(gè)放在不同地方、不同光線、不同背景中的物體識(shí)別成功,就稱這個(gè)神經(jīng)網(wǎng)絡(luò)具有不變性。這種不變性具體來說就是對物體的位移、視角、光線、大小、角度、亮度等一種或多種變換的不變性。而為了完善這種不變性,數(shù)據(jù)中存在這種圖片變換就顯得尤為重要。所以,數(shù)據(jù)增強(qiáng)并不只是在數(shù)據(jù)量少的情況下有用,在數(shù)據(jù)量較多的情況下也可以使模型得到更好的效果。5.2數(shù)據(jù)集處理
兩種不同品牌的鼠標(biāo)預(yù)測圖片一般來說,深度學(xué)習(xí)算法會(huì)去尋找能夠區(qū)分兩個(gè)類別的最明顯的特征。在數(shù)據(jù)集里兩個(gè)品牌的鼠標(biāo)的頭部朝向就是最明顯的特征。所以,應(yīng)該怎么去避免類似的事情發(fā)生呢?這就需要減少數(shù)據(jù)集中不相關(guān)的特征。對于上述的鼠標(biāo)分類數(shù)據(jù)集來說,一個(gè)簡單的方案就是增加多種頭部朝向的的圖片。然后重新訓(xùn)練模型,這樣會(huì)得到性能更好的模型。5.2數(shù)據(jù)集處理使用Python實(shí)現(xiàn)圖片翻轉(zhuǎn)的代碼如下。01OPTION圖片翻轉(zhuǎn)importcv2path=r'cat.jpg'img=cv2.imread(path)#水平翻轉(zhuǎn)img_hor=cv2.flip(img,1)#垂直翻轉(zhuǎn)img_ver=cv2.flip(img,0)#顯示圖片cv2.imshow('img',img)cv2.imshow('img_hor',img_hor)cv2.imshow('img_ver',img_ver)cv2.waitKey(0)cv2.destroyWindow()程序運(yùn)行結(jié)果如圖所示,從左到右分別是原圖、水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)的結(jié)果。5.2數(shù)據(jù)集處理使用Python實(shí)現(xiàn)圖片旋轉(zhuǎn)的代碼如下。02OPTION圖片旋轉(zhuǎn)importcv2#圖片旋轉(zhuǎn)defrotation(img,angle):h,w=img.shape[:2]#得到中心點(diǎn)center=(w//2,h//2)#獲得圍繞中心點(diǎn)旋轉(zhuǎn)某個(gè)角度的矩陣M=cv2.getRotationMatrix2D(center,angle,1.0)#旋轉(zhuǎn)圖片rotated=cv2.warpAffine(img,M,(w,h))returnrotatedpath=r'D:\GPU_SY\Opencv\opencv_image\cat.jpg'img=cv2.imread(path)#顯示圖片cv2.imshow('img',img)cv2.imshow('rotation_90_img',rotation_90_img)cv2.imshow('rotation_45_img',rotation_45_img)cv2.waitKey(0)cv2.destroyWindow()原圖、旋轉(zhuǎn)90°、旋轉(zhuǎn)45°的結(jié)果5.2數(shù)據(jù)集處理在一般的神經(jīng)網(wǎng)絡(luò)模型中,都會(huì)對輸入的圖片尺寸進(jìn)行預(yù)設(shè),如ImageNet的224×224、YOLOv3的416×416等。由于自然界中的圖片并不都是這種比例的,因此需要對圖片進(jìn)行縮放。03OPTION等比縮放fromPILimportImageimportnumpyasnpdefletterbox_image(image,size):#獲得圖片寬、高iw,ih=image.size#獲得要縮放的圖片尺寸w,h=size#得到小的邊長的比值scale=min(w/iw,h/ih)#得到新的邊長
使用Python實(shí)現(xiàn)等比縮放的代碼如下。nw=int(iw*scale)nh=int(ih*scale)#縮放圖片image=image.resize((nw,nh),Image.BICUBIC)#新建一張“畫布”,以RGB顏色(128,128,128)填充new_image=Image.new('RGB',size,(128,128,128))#將縮放后的圖片放到“畫布”中,并居中new_image.paste(image,((w-nw)//2,(h-nh)//2))returnnp.array(new_image)
5.2數(shù)據(jù)集處理
path=r'D:\GPU_SY\Opencv\opencv_image\cat.jpg'img=cv2.imread(path)let_img=letterbox_image(Image.fromarray(img),(224,224))resize_img=cv2.resize(img,(224,224))#顯示圖片cv2.imshow('img',img)cv2.imshow('resize_img',resize_img)cv2.imshow('let_img',let_img)cv2.waitKey(0)cv2.destroyWindow()等比縮放5.2數(shù)據(jù)集處理位移只涉及沿x軸或y軸方向(或兩者)移動(dòng)圖片。在Python中可以引入隨機(jī)數(shù),并且通過這個(gè)隨機(jī)數(shù)將使用了等比縮放的圖片放置到“畫布”的隨機(jī)位置上,形成位移。使用Python實(shí)現(xiàn)圖片位移的代碼如下。04OPTION位移defrand(a=0,b=1):returnnp.random.rand()*(b-a)+adefletterbox_image(image,size):#獲得圖片寬、高iw,ih=image.size#獲得要縮放的圖片尺寸w,h=size#得到小的邊長的比值scale=min(w/iw,h/ih)#將比值進(jìn)行隨機(jī)縮小scale=scale*rand(.25,1)
nw=int(iw*scale)nh=int(ih*scale)image=image.resize((nw,nh),Image.BICUBIC)#將圖片放到“畫布”的隨機(jī)位置上dx=int(rand(0,w-nw))dy=int(rand(0,h-nh))new_image=Image.new('RGB',(w,h),(128,128,128))new_image.paste(image,(dx,dy))returnnp.array(new_image)5.2數(shù)據(jù)集處理顏色變換類的數(shù)據(jù)增強(qiáng)有很多種,如噪聲、模糊、顏色擾動(dòng)、填充、擦除等。所謂顏色擾動(dòng),就是在某一顏色空間內(nèi)通過增加或減少某些顏色分量來進(jìn)行數(shù)據(jù)增強(qiáng)。使用Python實(shí)現(xiàn)顏色增強(qiáng)的代碼如下。05OPTION位移defhsv_(image,hue=.1,sat=1.5,val=1.5):hue=rand(-hue,hue)sat=rand(1,sat)ifrand()<.5else1/rand(1,sat)val=rand(1,val)ifrand()<.5else1/rand(1,val)#將顏色空間轉(zhuǎn)換到HSVx=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)/255.#使用HSV顏色空間進(jìn)行顏色增強(qiáng)x[...,0]+=huex[...,0][x[...,0]>1]-=1x[...,0][x[...,0]<0]+=1x[...,1]*=satx[...,2]*=val5.2數(shù)據(jù)集處理
x[x>1]=1x[x<0]=0#轉(zhuǎn)換成原本的顏色空間image_data=np.array(x*255.,dtype='uint8')image_data=cv2.cvtColor(image_data,cv2.COLOR_HSV2BGR)returnimage_datapath=r'D:\GPU_SY\Opencv\opencv_image\cat.jpg'img=cv2.imread(path)hsv_img=hsv_(img)#顯示圖片cv2.imshow('img',img)cv2.imshow('hsv_img',hsv_img)cv2.waitKey(0)cv2.destroyWindow()圖片顏色增強(qiáng)5.2數(shù)據(jù)集處理使用Python實(shí)現(xiàn)多種組合數(shù)據(jù)增強(qiáng)的代碼如下。06OPTION使用多種組合進(jìn)行圖片數(shù)據(jù)增強(qiáng)nh=int(ih*scale)image=Image.fromarray(image)image=image.resize((nw,nh),Image.BICUBIC)#隨機(jī)位移dx=int(rand(0,w-nw))dy=int(rand(0,h-nh))new_image=Image.new('RGB',(w,h),(128,128,128))new_image.paste(image,(dx,dy))image=new_image#隨機(jī)翻轉(zhuǎn)flip=rand()<.5ifflip:image=image.transpose(Image.FLIP_LEFT_RIGHT)#隨機(jī)HSV增強(qiáng)hue=rand(-hue,hue)sat=rand(1,sat)ifrand()<.5else1/rand(1,sat)val=rand(1,val)ifrand()<.5else1/rand(1,val)frommatplotlib.colorsimportrgb_to_hsvdefget_random_data(image,input_shape,hue=.1,sat=1.5,val=1.5):#獲得圖片寬、高ih,iw=image.shape[:2]#獲得要縮放的圖片尺寸w,h=input_shape#得到小的邊長的比值scale=min(w/iw,h/ih)#將比值進(jìn)行隨機(jī)縮小scale=scale*rand(.25,1)nw=int(iw*scale)5.2數(shù)據(jù)集處理path=r'D:\GPU_SY\Opencv\opencv_image\cat.jpg'img=cv2.imread(path)random_img=get_random_data(img,(224,224))#顯示圖片cv2.imshow('img',img)cv2.imshow('rotation_45_img',random_img)cv2.waitKey(0)cv2.destroyWindow()x=rgb_to_hsv(np.array(image)/255.)x[...,0]+=huex[...,0][x[...,0]>1]-=1x[...,0][x[...,0]<0]+=1x[...,1]*=satx[...,2]*=valx[x>1]=1x[x<0]=0#轉(zhuǎn)換成原本的顏色空間image_data=np.array(x*255.,dtype='uint8')image_data=cv2.cvtColor(image_data,cv2.COLOR_HSV2BGR)returnimage_data通過引入的多個(gè)隨機(jī)數(shù),可以使圖片完成平移、色彩變換、縮放等操作,并且這些操作都是隨機(jī)的,大大增加了可用的數(shù)據(jù)量。5.2數(shù)據(jù)集處理
數(shù)據(jù)增強(qiáng)在很大程度上解決了數(shù)據(jù)不足的問題,把數(shù)據(jù)送入模型訓(xùn)練之前進(jìn)行增強(qiáng)。但是這里有兩種做法:一種做法是事先執(zhí)行所有的轉(zhuǎn)換,這實(shí)質(zhì)上會(huì)增加數(shù)據(jù)集的大小;另一種做法是在把數(shù)據(jù)送入模型之前,小批量地執(zhí)行這些轉(zhuǎn)換。第一種做法叫作線下增強(qiáng),這種做法適用于較小的數(shù)據(jù)集。線下增強(qiáng)后會(huì)增加一定倍數(shù)的數(shù)據(jù),這個(gè)倍數(shù)取決于轉(zhuǎn)換的倍數(shù)。第二種做法叫作線上增強(qiáng),這種做法適用于較大的數(shù)據(jù)集。因?yàn)橛?jì)算機(jī)可能無法承受爆炸性增加的數(shù)據(jù),所以在訓(xùn)練的同時(shí)使用CPU加載數(shù)據(jù)并進(jìn)行數(shù)據(jù)增強(qiáng)是一種較好的做法。5.3模型調(diào)優(yōu)
模型調(diào)優(yōu)歸根結(jié)底還是解決欠擬合(Underfitting)和過擬合(Overfitting)的問題。當(dāng)涉及機(jī)器學(xué)習(xí)算法時(shí),往往會(huì)面臨過擬合和欠擬合的問題。欠擬合意味著對算法簡化過多,以至于很難映射到數(shù)據(jù)上;過擬合則意味著算法過于復(fù)雜,它完美地適應(yīng)了訓(xùn)練數(shù)據(jù),但是很難普及。欠擬合、擬合、過擬合的效果5.3模型調(diào)優(yōu)什么因素會(huì)導(dǎo)致過擬合和欠擬合的情況發(fā)生?首先是數(shù)據(jù)的分布是否足夠均勻。還有一個(gè)因素是模型是否復(fù)雜度過高,把學(xué)習(xí)進(jìn)行地太過徹底,將樣本數(shù)據(jù)的所有特征幾乎都學(xué)習(xí)進(jìn)去了。這時(shí)模型學(xué)到了數(shù)據(jù)中過多的局部特征,噪聲帶來的過多的假特征造成模型的“泛化性”和識(shí)別準(zhǔn)確率幾乎達(dá)到最低點(diǎn),于是用訓(xùn)練好的模型預(yù)測新的樣本的時(shí)候會(huì)發(fā)現(xiàn)模型效果很差。解決過擬合要從以下兩個(gè)方面入手。首先是限制模型的學(xué)習(xí),使模型在學(xué)習(xí)特征時(shí)忽略部分特征,這樣就可以降低模型學(xué)到局部特征和錯(cuò)誤特征的概率,使得識(shí)別準(zhǔn)確率得到優(yōu)化;其次是在選擇數(shù)據(jù)的時(shí)候要盡可能全面,并且符合實(shí)際情況。5.3模型調(diào)優(yōu)通常根據(jù)不同的訓(xùn)練階段,可分為3種調(diào)優(yōu)方法。
開始訓(xùn)練前:可以預(yù)先分析數(shù)據(jù)集的特征,選擇合適的函數(shù)以及優(yōu)化器,適當(dāng)?shù)剡M(jìn)行數(shù)據(jù)增強(qiáng)等。
開始訓(xùn)練:在這個(gè)階段,也有很多調(diào)優(yōu)方法。例如,動(dòng)態(tài)調(diào)整學(xué)習(xí)率、自動(dòng)保存最優(yōu)模型以及提前停止訓(xùn)練等。訓(xùn)練結(jié)束后:通過對模型的評估,了解此時(shí)模型處于什么狀態(tài),可以調(diào)整模型結(jié)構(gòu)或者調(diào)整訓(xùn)練參數(shù)等。
1
2
35.3模型調(diào)優(yōu)5.3.1回調(diào)函數(shù)
由于在訓(xùn)練的過程中,無法對一些參數(shù)進(jìn)行修改,因此一些深度學(xué)習(xí)框架往往會(huì)留出一些回調(diào)函數(shù)來對訓(xùn)練過程中的參數(shù)進(jìn)行調(diào)整。下面將使用tf.keras中的回調(diào)函數(shù)解決訓(xùn)練過程中的模型保存、學(xué)習(xí)率調(diào)整和終止訓(xùn)練的問題。importtensorflowfilepath='model.h5'tensorflow.keras.callbacks.ModelCheckpoint(filepath,monitor='val_loss',verbose=0,save_best_only=False,save_weights_only=False,mode='auto',period=1)01OPTION自動(dòng)保存模型使用Python實(shí)現(xiàn)自動(dòng)保存模型的代碼如下。5.3模型調(diào)優(yōu)表5-2ModelCheckpoint函數(shù)的參數(shù)及其說明參數(shù)說明filepath模型保存的路徑monitor需要監(jiān)視的值verbose是否顯示信息save_best_only只保存監(jiān)視值最好的模型,默認(rèn)為Falsesave_weights_only是否只保存權(quán)重(不保存結(jié)構(gòu))mode評判最佳模型的標(biāo)準(zhǔn),如min、maxperiod每幾個(gè)周期保存一次,如果設(shè)置保存最優(yōu)模型則該參數(shù)不起作用,因?yàn)槊總€(gè)周期結(jié)束都會(huì)保存5.3模型調(diào)優(yōu)tensorflow.keras.callbacks.ReduceLROnPlateau(monitor='val_loss',factor=0.1,patience=10,verbose=0,mode='auto',epsilon=0.0001,cooldown=0,min_lr=0)02OPTION學(xué)習(xí)率動(dòng)態(tài)調(diào)整使用Python實(shí)現(xiàn)學(xué)習(xí)率動(dòng)態(tài)調(diào)整的代碼如下。參數(shù)說明monitor需要監(jiān)視的值factor學(xué)習(xí)率(1r)衰減因子,新學(xué)習(xí)率newlr=lr*factorpatience當(dāng)過去patience個(gè)周期,被監(jiān)視的值還沒往更好的方向走時(shí)(一般來說是變小),則觸發(fā)學(xué)習(xí)率衰減verbose是否顯示信息mode評判最佳模型的標(biāo)準(zhǔn),如min、maxepsilon閾值,用來確定是否進(jìn)入檢測值的“平原區(qū)”cooldown學(xué)習(xí)率下降后,會(huì)經(jīng)過cooldown個(gè)訓(xùn)練輪數(shù)才重新進(jìn)行正常操作min_lr學(xué)習(xí)率的下限表5-3
ReduceLROnPlateau函數(shù)的參數(shù)及其說明5.3模型調(diào)優(yōu)tensorflow.keras.callbacks.EarlyStopping(monitor='val_loss',patience=0,verbose=0,mode='auto')03OPTION自動(dòng)終止訓(xùn)練使用Python實(shí)現(xiàn)自動(dòng)終止訓(xùn)練的代碼如下。表5-4EarlyStopping函數(shù)的參數(shù)及其說明參數(shù)說明monitor需要監(jiān)視的值patience當(dāng)發(fā)現(xiàn)監(jiān)視值相比上一個(gè)訓(xùn)練輪數(shù)沒有下降時(shí),經(jīng)過patience個(gè)訓(xùn)練輪數(shù)后停止訓(xùn)練verbose是否顯示信息mode評判標(biāo)準(zhǔn),如min、max5.3模型調(diào)優(yōu)fromtensorflow.kerasimportcallbackssave=callbacks.ModelCheckpoint('logs/epoch{epoch:03d}-val_loss{val_loss:.3f}.h5',monitor='val_loss',save_best_only=True,period=1)low_lr=callbacks.ReduceLROnPlateau(monitor='val_loss',factor=0.2,patience=5,min_lr=1e-6,verbose=1)eary_stop=callbacks.EarlyStopping(monitor='val_loss',patience=15,verbose=1,mode='auto')model.fit(x,y,batch_size=64,epochs=500,callbacks=[save,low_lr,eary_stop])使用Python組合回調(diào)函數(shù)并進(jìn)行訓(xùn)練的代碼如下。5.3模型調(diào)優(yōu)5.3.2超參數(shù)調(diào)整
人工智能和機(jī)器學(xué)習(xí)領(lǐng)域的知名學(xué)者吳恩達(dá)很形象地使用動(dòng)物和食物來命名訓(xùn)練一個(gè)模型的兩種方法:熊貓法與魚子醬法。01OPTION熊貓法先初始化一組超參數(shù),然后每訓(xùn)練一段時(shí)間(如一天,表示為D1)就需要查看進(jìn)展,觀察其是否按照預(yù)想的方向發(fā)展,再進(jìn)行一定的微調(diào),接著繼續(xù)訓(xùn)練,持續(xù)觀察。如果發(fā)現(xiàn)偏離了方向,就需要立即對超參數(shù)進(jìn)行調(diào)整。就這樣,持續(xù)定期觀察并進(jìn)行調(diào)整,直到最后達(dá)到訓(xùn)練目標(biāo)。5.3模型調(diào)優(yōu)02OPTION魚子醬法如果計(jì)算資源足夠豐富,可以同時(shí)訓(xùn)練多個(gè)模型,就可以用魚子醬法——使用多種超參數(shù)組合的模型進(jìn)行訓(xùn)練,在訓(xùn)練結(jié)束后通過評估指標(biāo)判斷哪種模型效果最好。(2)迭代次數(shù)迭代次數(shù)也叫訓(xùn)練輪數(shù),模型收斂即可停止迭代。一般可采用驗(yàn)證集作為停止迭代的條件。如果連續(xù)幾輪模型損失都沒有相應(yīng)減少,則停止迭代。5.3模型調(diào)優(yōu)
超參數(shù)是控制模型結(jié)構(gòu)、功能、效率等的“調(diào)節(jié)旋鈕”。通過“調(diào)節(jié)旋鈕”,可以控制神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練的基本方向。一般而言,常用的超參數(shù)有以下幾種。(1)學(xué)習(xí)率學(xué)習(xí)率是最影響性能的超參數(shù)之一,如果只能調(diào)整一個(gè)超參數(shù),那么最好的選擇就是它。相對于其他超參數(shù),學(xué)習(xí)率以一種更加復(fù)雜的方式控制著模型的有效容量。模型的有效容量是指模型擬合各種函數(shù)的能力。當(dāng)學(xué)習(xí)率最優(yōu)時(shí),模型的有效容量最大。12(3)批大小批大小也叫batch_size,對于小數(shù)據(jù)量的模型,可以進(jìn)行全量訓(xùn)練,這樣能更準(zhǔn)確地朝著極值所在的方向更新。但是對于大數(shù)據(jù)量模型,進(jìn)行全量訓(xùn)練將導(dǎo)致內(nèi)存溢出,因此需要選擇一個(gè)較小的批大小。35.3模型調(diào)優(yōu)5.1.4F1值
F1值(F1Score)是統(tǒng)計(jì)學(xué)中用來衡量二分類模型精度的一種指標(biāo)。它同時(shí)兼顧了分類模型的查準(zhǔn)率和召回率。F1值可以看作模型查準(zhǔn)率和召回率的一種調(diào)和平均,它的最大值是1,最小值是0。true=[0,1,0,1,0,1,0,1,1,1]pred=[0,1,0,1,0,0,0,1,1,1]#應(yīng)當(dāng)被檢索到的樣本數(shù)index_1_num=str(true).count("1")recall=0precision=0forindex,valueinenumerate(pred):使用Python計(jì)算F1值的代碼如下:ifvalue==true[index]andvalue==1:recall+=1ifvalue==true[index]:precision+=1precision=precision/len(pred)*100recall=recall/index_1_num*100print('f1:%.2f%%'%((2*precision*recall)/(precision+recall)))5.3模型調(diào)優(yōu)5.3.3模型結(jié)構(gòu)調(diào)整
為了演示微調(diào)模型結(jié)構(gòu),本小節(jié)重新搭建了一個(gè)簡單的MNIST數(shù)據(jù)集分類的模型,具體代碼如下所示。importnumpyasnpimportmatplotlib.pyplotaspltfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense,Activationfromtensorflow.keras.optimizersimportSGDfromtensorflow.kerasimportutilsfromtensorflow.keras.datasetsimportmnistimportmatplotlib.pyplotasplt#加載數(shù)據(jù)集,并劃分為訓(xùn)練集和測試集兩個(gè)部分(x_train,y_train),(x_test,y_test)=mnist.load_data()plt.imshow(x_train[0])print(x_train[0])#歸一化y_train=utils.to_categorical(y_train)y_test=utils.to_categorical(y_test)x_train=x_train.reshape(-1,784)/255.x_test=x_test.reshape(-1,784)/255.#模型結(jié)構(gòu)model=Sequential([Dense(units=256,input_dim=784,activation='relu'),Dense(units=128,activation='relu'),Dense(units=10,activation='softmax')])5.3模型調(diào)優(yōu)sgd=SGD(lr=0.2)pile(optimizer=sgd,loss='mse',metrics=['acc'])model.fit(x_train,y_train,batch_size=32,epochs=10)#測試loss,acc=model.evaluate(x_test,y_test)print(loss,acc)
程序運(yùn)行結(jié)果如圖所示,這時(shí)候的訓(xùn)練準(zhǔn)確率是97.04%,測試準(zhǔn)確率是96.55%。3層全連接層運(yùn)行結(jié)果5.3模型調(diào)優(yōu)
由于模型結(jié)構(gòu)比較簡單,因此想要提升準(zhǔn)確率,直接的辦法是提升模型的復(fù)雜度。接下來修改模型結(jié)構(gòu),新增幾層全連接層,代碼如下。model=Sequential([Dense(units=256,input_dim=784,activation='relu'),Dense(units=192,activation='relu'),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代網(wǎng)絡(luò)教育技術(shù)的優(yōu)勢與挑戰(zhàn)
- 環(huán)境保護(hù)技術(shù)的創(chuàng)新及其商業(yè)模式研究
- 深化綠色能源技術(shù)教育的重要性
- 國慶節(jié)洋酒活動(dòng)方案設(shè)計(jì)
- 充電樁設(shè)備安裝施工方案
- 15 可親可敬的家鄉(xiāng)人1(說課稿)2024-2025學(xué)年統(tǒng)編版道德與法治二年級上冊
- many、much、a lot of(說課稿)-2023-2024學(xué)年譯林版(三起)英語六年級下冊
- 11屹立在世界的東方 自力更生 揚(yáng)眉吐氣 說課稿-2023-2024學(xué)年道德與法治五年級下冊統(tǒng)編版
- 2024-2025學(xué)年高中歷史 專題六 穆罕默德 阿里改革 一 亟待拯救的文明古國(1)教學(xué)說課稿 人民版選修1001
- 2023九年級數(shù)學(xué)上冊 第二十一章 一元二次方程21.3 實(shí)際問題與一元二次方程第3課時(shí) 實(shí)際問題與一元二次方程(3)說課稿(新版)新人教版
- (高清版)DZT 0073-2016 電阻率剖面法技術(shù)規(guī)程
- 完整2024年開工第一課課件
- 貨運(yùn)車輛駕駛員安全培訓(xùn)內(nèi)容資料完整
- 高一學(xué)期述職報(bào)告
- 風(fēng)神汽車4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
- 人教版四年級上冊豎式計(jì)算200題及答案
- 建設(shè)工程工作總結(jié)報(bào)告
- 脾破裂術(shù)后健康宣教課件
- 三廢環(huán)保管理培訓(xùn)
- 藏族唐卡藝術(shù)特色分析
評論
0/150
提交評論