▌一、前言
閱讀本文的基礎(chǔ):我會(huì)認(rèn)為你對(duì)BP神經(jīng)網(wǎng)絡(luò)有充分的了解,熟讀過(guò)我上一篇文章,本文會(huì)大量引用上一篇文章的知識(shí)以及代碼。上一篇筆記的傳送門:《AI從入門到放棄:BP神經(jīng)網(wǎng)絡(luò)算法推導(dǎo)及代碼實(shí)現(xiàn)筆記》
▌二、用MLP做圖像分類識(shí)別?
在沒(méi)有CNN以及更先進(jìn)的神經(jīng)網(wǎng)絡(luò)的時(shí)代,樸素的想法是用多層感知機(jī)(MLP)做圖片分類的識(shí)別,沒(méi)毛病。作為上篇筆記學(xué)習(xí)的延續(xù),以及下一篇CNN的藥引,使用MLP來(lái)做圖片分類識(shí)別,實(shí)在是個(gè)不錯(cuò)的過(guò)度例子。通過(guò)這個(gè)例子,從思路上引出一系列的問(wèn)題,我不賣關(guān)子,自問(wèn)自答吧,即:MLP能做圖片分類識(shí)別嗎?--> 答案是是可以的,上一篇我們是擬合非線性分類函數(shù),這里是擬合圖像特征,數(shù)學(xué)本質(zhì)沒(méi)區(qū)別。
MLP做這個(gè)事情效果如何?--> 個(gè)人認(rèn)知內(nèi),只能說(shuō)一般一般。MLP在這一領(lǐng)域效果一般,是有什么缺陷嗎? --> 缺陷是有的,下文會(huì)詳細(xì)說(shuō)。有更好的解決方案嗎? --> 那也是必須有的,地球人火星人喵星人都知道有CNN等等更先進(jìn)的東東;但是在沒(méi)有這些東西存在的時(shí)代,你發(fā)明出來(lái)了,那才真是666。
▌三、先上車
1. 數(shù)據(jù)源
數(shù)據(jù)源當(dāng)然是圖片,但是是經(jīng)過(guò)數(shù)據(jù)化處理的圖片,使用的是h5文件。h5文件簡(jiǎn)單說(shuō)就是把數(shù)據(jù)按索引固化起來(lái),挺簡(jiǎn)單的不多說(shuō),度度一下:
h5py入門講解:
https://blog.csdn.net/csdn15698845876/article/details/73278120
我們有3個(gè)h5文件,存著不重復(fù)的圖片數(shù)據(jù),分別是:
train_catvnoncat.h5 (用來(lái)訓(xùn)練模型用的,一共有209張,其中有貓也有不是貓的圖片,尺寸64*64像素)
test_catvnoncat.h5 (用來(lái)測(cè)試模型準(zhǔn)確度的,一共有50張圖片,,其中有貓也有不是貓的圖片,尺寸64*64像素)
my_cat_misu.h5 (用來(lái)玩的,我家貓主子的1張照騙,尺寸64*64像素)
2. 數(shù)據(jù)結(jié)構(gòu)
拿train_catvnoncat.h5舉例,這個(gè)文件有2個(gè)索引:
train_set_x:這是一個(gè)數(shù)組,因?yàn)槭?09張圖片,所以數(shù)組長(zhǎng)度是209。數(shù)組中的元素是一個(gè) 64*64*3 的矩陣。64*64是圖片像素尺寸,3是什么鬼?別忘了這是彩色圖片,3就是代表RGB這3個(gè)顏色通道的值。
train_set_y:圖片標(biāo)簽數(shù)組,長(zhǎng)度也是209,是209張圖片的標(biāo)簽(label),對(duì)應(yīng)數(shù)組下標(biāo)的值是1時(shí),代表這張圖片是喵星人,0則代表不是。
同理,test_catvnoncat.h5 中有 test_set_x 和 test_set_y;my_cat_misu.h5 中有 mycat_set_x 和 mycat_set_y
3. 告訴你怎么制作圖片的h5文件,以后做cnn等模型訓(xùn)練時(shí),非常有用
以我主子為例子:
原圖:
自己處理成64*64的圖片,當(dāng)然你也可以寫代碼做圖片處理,我懶,交給你實(shí)現(xiàn)了:
python代碼,用到h5py庫(kù):
defsave_imgs_to_h5file(h5_fname,x_label,y_label,img_paths_list,img_label_list):#構(gòu)造n張圖片的隨機(jī)矩陣data_imgs=np.random.rand(len(img_paths_list),64,64,3).astype('int')label_imgs=np.random.rand(len(img_paths_list),1).astype('int')#plt.imread可以把圖片以多維數(shù)組形式讀出來(lái),然后我們存成n*n*3的矩陣foriinrange(len(img_paths_list)):data_imgs[i]=np.array(plt.imread(img_paths_list[i]))label_imgs[i]=np.array(img_label_list[i])#創(chuàng)建h5文件,按照指定的索引label存到文件中,完事了f=h5py.File(h5_fname,'w')f.create_dataset(x_label,data=data_imgs)f.create_dataset(y_label,data=label_imgs)f.close()returndata_imgs,label_imgs#用法#圖片label為1代表這是一張喵星人的圖片,0代表不是save_imgs_to_h5file('datasets/my_cat_misu.h5','mycat_set_x','mycat_set_y',['misu.jpg'],[1])
4. 看看我的數(shù)據(jù)源的樣子
用來(lái)訓(xùn)練的圖片集合,209張:
用來(lái)校驗(yàn)?zāi)P蜏?zhǔn)確度的圖片集合, 50張
用來(lái)玩的,主子照騙,1張:
▌四. 開(kāi)車了
1. 如何設(shè)計(jì)模型:
輸入層:我們的圖片是64*64的像素尺寸,那么算上RGB三個(gè)通道的數(shù)據(jù),我們把三維矩陣?yán)擅鏃l 64*64*3 = 12288。 也就是我們輸入層的數(shù)據(jù)長(zhǎng)度是12288。
隱藏層:使用多層隱藏層,可以自行多嘗試一下不同的結(jié)構(gòu)。這里我使用3個(gè)隱藏層,隱藏層神經(jīng)元個(gè)數(shù)分別是20,7,5
輸出層:我們的目標(biāo)就是判斷某張圖片是否是貓而已,所以輸出層1個(gè)神經(jīng)元,輸出概率大于0.5認(rèn)為是貓,小于等于0.5認(rèn)為不是。
【插播】:有人會(huì)想,第一層隱藏層的神經(jīng)元和輸入層數(shù)量一致是不是會(huì)好點(diǎn)?理論上是會(huì)好點(diǎn),但是這涉及到MLP的一個(gè)缺陷,因?yàn)槿B接情況下,這樣做,第一層的權(quán)重w參數(shù)就有1228的平方個(gè),約為1.5個(gè)億。如果圖片更大呢?參數(shù)會(huì)成指數(shù)級(jí)膨脹,后果盡情想象。
2. 如何訓(xùn)練模型
還用說(shuō),把209張圖片的數(shù)據(jù)扔到神經(jīng)網(wǎng)絡(luò),完成一次迭代,然后訓(xùn)練1萬(wàn)次,可自行嘗試迭不同代次數(shù)觀察效果。
3. 如何衡量模型的準(zhǔn)確度
大神吳恩達(dá)(Andrew Ng)提到的方法之一,就是劃分不同集合,一部分用來(lái)訓(xùn)練,一部分用來(lái)驗(yàn)證模型效果,這樣可以達(dá)到衡量你所訓(xùn)練的模型的效果如何。所以我們訓(xùn)練使用209張圖片,最終使用50張測(cè)試模型效果。
為了好玩,可以自己用不同圖片通過(guò)模型去做分類識(shí)別。
▌五. 老規(guī)矩,甩代碼
還是說(shuō)明一下代碼流程吧:
代碼使用到的 NeuralNetwork 是我上一篇筆記的代碼,實(shí)現(xiàn)了BP神經(jīng)網(wǎng)絡(luò),import進(jìn)來(lái)直接用即可。
代碼做的事情就是:
從h5文件加載圖片數(shù)據(jù)
把原始圖片顯示出來(lái),同時(shí)也保存成圖片文件
訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型
驗(yàn)證模型準(zhǔn)確度
把識(shí)別結(jié)果標(biāo)注到原始圖片上,同時(shí)也保存成圖片文件
▌六.結(jié)論
1. 神經(jīng)網(wǎng)絡(luò)模型的輸出結(jié)果,標(biāo)注到了圖片上并展示出來(lái),規(guī)則是:
結(jié)果展示說(shuō)明:
【識(shí)別正確】:原圖是貓,識(shí)別為貓 --> 原圖顯示原圖不是貓,識(shí)別為不是貓 --> 降低顯示亮度【識(shí)別錯(cuò)誤】:原圖是貓,但是識(shí)別為不是貓 --> 標(biāo)紅顯示原圖不是貓, 但是識(shí)別成貓 --> 標(biāo)紅顯示
圖片標(biāo)題會(huì)顯示Accuracy(準(zhǔn)確度),準(zhǔn)確度的計(jì)算公式是: 識(shí)別正確圖片數(shù)/圖片總數(shù)。
2. 模型訓(xùn)練完成后,把訓(xùn)練用的209張圖片用訓(xùn)練好的模型識(shí)別一遍,觀察結(jié)果:可以看到,迭代1w次的模型,識(shí)別訓(xùn)練圖集,準(zhǔn)確度是 100% 的:
3. 模型訓(xùn)練完成后,使用測(cè)試圖集用訓(xùn)練好的模型識(shí)別一遍,觀察結(jié)果:可以看到,迭代1w次的模型,識(shí)別訓(xùn)練圖集,準(zhǔn)確度只有 78%:
4. 看看模型能不能認(rèn)出我主子是喵星人,看樣子,它是認(rèn)出來(lái)了:
▌七.對(duì)結(jié)果進(jìn)一步分析,引出一系列問(wèn)題
拋出一個(gè)問(wèn)題:為什么用測(cè)試圖集驗(yàn)證模型,識(shí)別率只有78%?在我嘗試過(guò)改變神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì),參數(shù)調(diào)參后,仍然無(wú)法提高識(shí)別率,為什么呢?
不算徹底的解答:
也許是我水平有限,調(diào)參姿勢(shì)不對(duì)?姿勢(shì)帥并不是萬(wàn)能的,我們應(yīng)該從更深層次的原理進(jìn)行分析。
有人說(shuō),你訓(xùn)練數(shù)據(jù)少了,好像有那么些道理。其實(shí)是可以給模型輸入更多圖片的特征是個(gè)不錯(cuò)的辦法,比如旋轉(zhuǎn)一下,圖片內(nèi)容放大縮小,挪挪位置等。但是Andrew Ng也說(shuō)過(guò),過(guò)分追求訓(xùn)練數(shù)據(jù)收集是一條不歸路。
在同等訓(xùn)練數(shù)據(jù)集下,有更好的辦法嗎?由此引出下一個(gè)問(wèn)題。
刨根問(wèn)底:想要知道為什么MLP識(shí)別度難以做到很高,撇開(kāi)網(wǎng)絡(luò)結(jié)構(gòu),調(diào)參,訓(xùn)練數(shù)據(jù)先不談。我們應(yīng)該從MLP身上找找茬。搞清楚我們目標(biāo),是提高對(duì)圖片進(jìn)行分類識(shí)別,那么在使用MLP實(shí)現(xiàn)這個(gè)目標(biāo)時(shí),它自身是否有缺陷,導(dǎo)致實(shí)現(xiàn)這個(gè)目標(biāo)遇到了困難。那么解決了這些困難,就找到了解決問(wèn)題的方法。
MLP在做圖片分類識(shí)別的缺陷:神經(jīng)元是全連接的方式構(gòu)成的神經(jīng)網(wǎng)絡(luò),全連接情況下,假設(shè)圖片是1k*1k像素大小,那么隱藏層個(gè)數(shù)和輸入層尺寸一致時(shí),不考慮RGB顏色通道,單通道下,權(quán)重w參數(shù)個(gè)數(shù)會(huì)是:(沒(méi)數(shù)錯(cuò)0的話)
如果圖片再大點(diǎn),參數(shù)膨脹到不可想象,直接導(dǎo)致的負(fù)面效果是:
參數(shù)過(guò)多,計(jì)算量龐大
全連接情況下,過(guò)深的網(wǎng)絡(luò)容易導(dǎo)致梯度消失,模型難以訓(xùn)練
MLP全連接的情況下,無(wú)法做到圖片的形變識(shí)別。怎么理解這個(gè)詞呢,拿手寫數(shù)字舉個(gè)例子,比如寫8,每個(gè)人書(shū)寫習(xí)慣不一樣,有的人寫的很正,但有的人寫歪了點(diǎn),上半部分小,下半部分大,等等。這時(shí)候,MLP的缺點(diǎn)就顯現(xiàn)出來(lái)了,同一張圖片,旋轉(zhuǎn),或者稍微平移形變一下,它無(wú)法識(shí)別。你可以通過(guò)增加更多特征給模型,但這不是本質(zhì)上的解決該問(wèn)題的方法,而是對(duì)訓(xùn)練的優(yōu)化手段。
▌八. 總結(jié)要解決的問(wèn)題,離下一個(gè)坑就不遠(yuǎn)了
上面已經(jīng)列舉了要解決的幾個(gè)問(wèn)題,這里總結(jié)一下:
我們要解決參數(shù)膨脹帶來(lái)的計(jì)算量龐大的問(wèn)題。
優(yōu)化參數(shù)量之后,如何在同等訓(xùn)練數(shù)據(jù)集不變的情況下,如何提取更多特征。
在輸入有一定的旋轉(zhuǎn)平移伸縮時(shí),仍能正確識(shí)別。
能解決以上問(wèn)題的眾所周知,就是CNN以及眾多更先進(jìn)的神經(jīng)網(wǎng)絡(luò)模型了。本文作為一篇引子文章,也是CNN的導(dǎo)火索。代碼在你手中,把第一層隱藏層設(shè)計(jì)成和輸入層一樣大,即 layers_dims = [12288, 12288, 20, 7, 5, 1]。還只是64*64的小圖片而已,那龜速,我和我的小破筆記本都不能忍啊。這也是為什么大神們發(fā)明CNN的原因之一吧!
AI從入門到放棄,這也只是滄海一粟,你怕了嗎?
-
圖像識(shí)別
+關(guān)注
關(guān)注
9文章
526瀏覽量
38900 -
cnn
+關(guān)注
關(guān)注
3文章
354瀏覽量
22633
原文標(biāo)題:AI從入門到放棄2:CNN的導(dǎo)火索,用MLP做圖像分類識(shí)別?
文章出處:【微信號(hào):CAAI-1981,微信公眾號(hào):中國(guó)人工智能學(xué)會(huì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【Pocket-RIO試用】LabVIEW FPGA開(kāi)發(fā)從入門到放棄
微軟HoloLens正研發(fā)AI芯片 可識(shí)別語(yǔ)音和圖像
【HarmonyOS HiSpark AI Camera】基于圖像的手語(yǔ)識(shí)別機(jī)器人系統(tǒng)
【HarmonyOS HiSpark AI Camera】圖像采集識(shí)別
云從科技周曦:我為什么放棄了語(yǔ)音識(shí)別,轉(zhuǎn)做人臉識(shí)別?精選資料推薦
STM32RTC實(shí)時(shí)時(shí)鐘實(shí)驗(yàn)講解,從入門到放棄 精選資料分享
STM32串口實(shí)驗(yàn),從入門到放棄 精選資料分享
基于MLP的快速醫(yī)學(xué)圖像分割網(wǎng)絡(luò)UNeXt相關(guān)資料分享
【KV260視覺(jué)入門套件試用體驗(yàn)】六、VITis AI車牌檢測(cè)&車牌識(shí)別
LabVIEW從入門到精通之模擬量輸入(AI)程序設(shè)計(jì)
用MLP做圖像分類識(shí)別?
STM32 IIC實(shí)驗(yàn)講解,從入門到放棄。

模擬矩陣在圖像識(shí)別中的應(yīng)用

評(píng)論