先提一個小問題:
“你是通過什麼瞭解這個世界的?”
當一輛汽車從你身邊疾馳而過,你是通過哪些信息知道那是一輛汽車?
“它的材質,速度,發動機的聲響,還是什麼?”
你可能說不清所以然,但是當你看到下圖時,你會第一時間反應出來,“噢,車! ”
為什麼你能猜對它?
“輪廓”!
——對,我給你看了它的輪廓。
再給你一些七七八八、大小不一的圖片,你總能猜對一些。
你是怎樣做到的?
很簡單
你讀了一張圖片 → 找到了圖片的特徵 → 進而對圖片做出了分類
如果是一張黑白圖片,我們看到的,是這個樣子的:
而在計算機的眼裡,它看到的,是這個樣子的:
好沒有情趣……
這些數字是哪裡來的?
因為圖片是由一個又一個的像素點構成。(當你將圖片無限放大,你能看到那些像素點)
而每一個像素點,都是由一個0~255的數字組成。
所以,在計算機“看”來,一張圖片,就是一個又一個的數字。
所以,我們第一步的工作,是將左上圖的那隻小狗,轉換成右上圖的那一行行數字。
幸運的是,目前在python中,很多第三方庫,諸如PIL/Matplotlib等,都可以實現這種轉換,我們需要了解的是,後面的所有運算過程,都是基於右上圖 來完成的,至於具體的轉換過程,不需要我們費心來做。
在文章開篇的例子中,我們知道,在識別一輛汽車的時候,可以將它的輪廓提取出來,從而判斷出那是一輛車。
同樣的,CNNs在識別圖片時,也需要提取圖像的特徵。
在CNNs中,完成這一工作的小夥叫“卷積”。(希望你不要糾結這個極具個性的名字,懂得它的原理就OK)
“卷積”在每次工作時,手裡都會握著幾把“過濾器”。
過濾器的作用是:尋找圖片的特徵。
仍以小狗為例,過濾器會在圖片上從頭到尾“滑過”一遍
每滑到一個地方,就將該地方的圖像特徵提取出來。
那它是怎樣提取的呢?
別忘了,在計算機的眼裡,世界是這個樣子的:
(為了簡化問題,這裡將像素值僅用0和1表示)
假設過濾器是這個樣子的:
當橘色的過濾器在綠色矩形框中,緩慢滑過時,
我們用橘色過濾器中的每一個值,與綠色矩形框中的對應值相乘、再相加
有點兒拗口,直接看圖:
結果“4”,就是我們從第一個橘色方框中,提取出的特徵。
如果我們每次將橘色過濾器,向右、向下移動1格,則提取出的特徵為:
你可能會問:
我知道綠色矩陣代表一張圖片,是計算機“眼中”圖片的樣子。
但是,
經過橘色過濾器提取特徵後,得到的粉色矩陣,那是什麼?
我們從人類的視角,再重新審視一遍。
這次,我們回到之前的例子中。
仍以這張萌狗為例,它經過“過濾器”提取特徵後,得到的是一張……哦,好吧……看起來有點兒模糊的圖。
雖然圖片模糊了,但是圖片中的主要特徵,已經被過濾器全部提取出來,單憑這麼一張模糊的圖,作為人類的我們,足以對它做出判斷了。(誰敢說它是一隻貓?!)
下面,我們再換幾個過濾器試試。
這些就是經過過濾器提取後,得到的不同“特徵圖片”。
由此我們可以看出,採用不同的“過濾器”,能夠提取出不同的圖片特徵。
你可能又會問:
那過濾器裡的數值,該如何確定呢?
4種過濾器-效果.png (116.6 KB)
4種過濾器.png (21.42 KB)
dog-黑白.jpg (41.25 KB)
更多資料獲取請私信我
閱讀更多 js龍紋 的文章