天天看點

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

文章目錄

  • 原理部分
  • LeNet5
  • 資料與實驗可視化
  • 比對結果分析
  • 個人資料比對
  • 代碼節選

原理部分

卷積神經網絡參考:https://my.oschina.net/u/876354/blog/1620906

LeNet神經網絡參考:https://my.oschina.net/u/876354/blog/1632862

1、局部感覺

人類對外界的認知一般是從局部到全局、從片面到全面,類似的,在機器識别圖像時也沒有必要把整張圖像按像素全部都連接配接到神經網絡中,在圖像中也是局部周邊的像素聯系比較緊密,而距離較遠的像素則相關性較弱,是以可以采用局部連接配接的模式(将圖像分塊連接配接,這樣能大大減少模型的參數),如下圖所示:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

2、參數(權值)共享

每張自然圖像(人物、山水、建築等)都有其固有特性,也就是說,圖像其中一部分的統計特性與其它部分是接近的。這也意味着這一部分學習的特征也能用在另一部分上,能使用同樣的學習特征。是以,在局部連接配接中隐藏層的每一個神經元連接配接的局部圖像的權值參數(例如5×5),将這些權值參數共享給其它剩下的神經元使用,那麼此時不管隐藏層有多少個神經元,需要訓練的參數就是這個局部圖像的權限參數(例如5×5),也就是卷積核的大小,這樣大大減少了訓練參數。如下圖

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

3、池化

随着模型網絡不斷加深,卷積核越來越多,要訓練的參數還是很多,而且直接拿卷積核提取的特征直接訓練也容易出現過拟合的現象。回想一下,之是以對圖像使用卷積提取特征是因為圖像具有一種“靜态性”的屬性,是以,一個很自然的想法就是對不同位置區域提取出有代表性的特征(進行聚合統計,例如最大值、平均值等),這種聚合的操作就叫做池化,池化的過程通常也被稱為特征映射的過程(特征降維),如下圖:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

LeNet5

回顧了卷積神經網絡(CNN)上面的三個特點後,下面來介紹一下CNN的經典模型:手寫字型識别模型LeNet5。

LeNet5誕生于1994年,是最早的卷積神經網絡之一, 由Yann LeCun完成,推動了深度學習領域的發展。在那時候,沒有GPU幫助訓練模型,甚至CPU的速度也很慢,是以,LeNet5通過巧妙的設計,利用卷積、參數共享、池化等操作提取特征,避免了大量的計算成本,最後再使用全連接配接神經網絡進行分類識别,這個網絡也是最近大量神經網絡架構的起點,給這個領域帶來了許多靈感。

LeNet5的網絡結構示意圖如下所示:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

LeNet5由7層CNN(不包含輸入層)組成,上圖中輸入的原始圖像大小是32×32像素,卷積層用Ci表示,子采樣層(pooling,池化)用Si表示,全連接配接層用Fi表示。下面逐層介紹其作用和示意圖上方的數字含義。

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

1、C1層(卷積層):[email protected]×28

該層使用了6個卷積核,每個卷積核的大小為5×5,這樣就得到了6個feature map(特征圖)。

(1)特征圖大小

每個卷積核(5×5)與原始的輸入圖像(32×32)進行卷積,這樣得到的feature map(特征圖)大小為(32-5+1)×(32-5+1)= 28×28

卷積過程如下圖所示:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

卷積核與輸入圖像按卷積核大小逐個區域進行比對計算,比對後原始輸入圖像的尺寸将變小,因為邊緣部分卷積核無法越出界,隻能比對一次,如上圖,比對計算後的尺寸變為Cr×Cc=(Ir-Kr+1)×(Ic-Kc+1),其中Cr、Cc,Ir、Ic,Kr、Kc分别表示卷積後結果圖像、輸入圖像、卷積核的行列大小。

(2)參數個數

由于參數(權值)共享的原因,對于同個卷積核每個神經元均使用相同的參數,是以,參數個數為(5×5+1)×6= 156,其中5×5為卷積核參數,1為偏置參數

(3)連接配接數

卷積後的圖像大小為28×28,是以每個特征圖有28×28個神經元,每個卷積核參數為(5×5+1)×6,是以,該層的連接配接數為(5×5+1)×6×28×28=122304

2、S2層(下采樣層,也稱池化層):[email protected]×14

(1)特征圖大小

這一層主要是做池化或者特征映射(特征降維),池化單元為2×2,是以,6個特征圖的大小經池化後即變為14×14。回顧本文剛開始講到的池化操作,池化單元之間沒有重疊,在池化區域内進行聚合統計後得到新的特征值,是以經2×2池化後,每兩行兩列重新算出一個特征值出來,相當于圖像大小減半,是以卷積後的28×28圖像經2×2池化後就變為14×14。

這一層的計算過程是:2×2 單元裡的值相加,然後再乘以訓練參數w,再加上一個偏置參數b(每一個特征圖共享相同的w和b),然後取sigmoid值(S函數:0-1區間),作為對應的該單元的值。卷積操作與池化的示意圖如下:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

(2)參數個數

S2層由于每個特征圖都共享相同的w和b這兩個參數,是以需要2×6=12個參數

(3)連接配接數

下采樣之後的圖像大小為14×14,是以S2層的每個特征圖有14×14個神經元,每個池化單元連接配接數為2×2+1(1為偏置量),是以,該層的連接配接數為(2×2+1)×14×14×6 = 5880

注:

關于池化層與下采樣層,個人了解,就是一個東西,兩個名字而已。

參考:https://blog.csdn.net/qq_41621362/article/details/88766768

位置

池化或子采樣層通常緊跟在CNN中的卷積層之後。

常用方法

最大值池化(max-pooling):對鄰域内特征點取最大值。

平均值池化(mean-pooling):對鄰域内特征點求平均。

作用

降維,減少網絡要學習的參數數量。

防止過拟合。

可以擴大感覺野。

可以實作不變性:平移不變性,旋轉不變性,尺度不變性。

3、C3層(卷積層):[email protected]×10

C3層有16個卷積核,卷積模闆大小為5×5。

(1)特征圖大小

與C1層的分析類似,C3層的特征圖大小為(14-5+1)×(14-5+1)= 10×10

(2)參數個數

需要注意的是,C3與S2并不是全連接配接而是部分連接配接,有些是C3連接配接到S2三層、有些四層、甚至達到6層,通過這種方式提取更多特征,連接配接的規則如下表所示:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

例如第一清單示C3層的第0個特征圖(feature map)隻跟S2層的第0、1和2這三個feature maps相連接配接,計算過程為:用3個卷積模闆分别與S2層的3個feature maps進行卷積,然後将卷積的結果相加求和,再加上一個偏置,再取sigmoid得出卷積後對應的feature map了。其它列也是類似(有些是3個卷積模闆,有些是4個,有些是6個)。是以,C3層的參數數目為(5×5×3+1)×6 +(5×5×4+1)×9 +5×5×6+1 = 1516

(3)連接配接數

卷積後的特征圖大小為10×10,參數數量為1516,是以連接配接數為1516×10×10= 151600

4、S4(下采樣層,也稱池化層):[email protected]×5

(1)特征圖大小

與S2的分析類似,池化單元大小為2×2,是以,該層與C3一樣共有16個特征圖,每個特征圖的大小為5×5。

(2)參數數量

與S2的計算類似,所需要參數個數為16×2 = 32

(3)連接配接數

連接配接數為(2×2+1)×5×5×16 = 2000

5、C5層(卷積層):120

(1)特征圖大小

該層有120個卷積核,每個卷積核的大小仍為5×5,是以有120個特征圖。由于S4層的大小為5×5,而該層的卷積核大小也是5×5,是以特征圖大小為(5-5+1)×(5-5+1)= 1×1。這樣該層就剛好變成了全連接配接,這隻是巧合,如果原始輸入的圖像比較大,則該層就不是全連接配接了。

(2)參數個數

與前面的分析類似,本層的參數數目為120×(5×5×16+1) = 48120

(3)連接配接數

由于該層的特征圖大小剛好為1×1,是以連接配接數為48120×1×1=48120

6、F6層(全連接配接層):84

(1)特征圖大小

F6層有84個單元,之是以選這個數字的原因是來自于輸出層的設計,對應于一個7×12的比特圖,如下圖所示,-1表示白色,1表示黑色,這樣每個符号的比特圖的黑白色就對應于一個編碼。

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

該層有84個特征圖,特征圖大小與C5一樣都是1×1,與C5層全連接配接。

(2)參數個數

由于是全連接配接,參數數量為(120+1)×84=10164。跟經典神經網絡一樣,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置,然後将其傳遞給sigmoid函數得出結果。

(3)連接配接數

由于是全連接配接,連接配接數與參數數量一樣,也是10164。

7、OUTPUT層(輸出層):10

Output層也是全連接配接層,共有10個節點,分别代表數字0到9。如果第i個節點的值為0,則表示網絡識别的結果是數字i。

(1)特征圖大小

該層采用徑向基函數(RBF)的網絡連接配接方式,假設x是上一層的輸入,y是RBF的輸出,則RBF輸出的計算方式是:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

上式中的Wij的值由i的比特圖編碼确定,i從0到9,j取值從0到7×12-1。RBF輸出的值越接近于0,表示目前網絡輸入的識别結果與字元i越接近。

(2)參數個數

由于是全連接配接,參數個數為84×10=840

(3)連接配接數

由于是全連接配接,連接配接數與參數個數一樣,也是840

通過以上介紹,已經了解了LeNet各層網絡的結構、特征圖大小、參數數量、連接配接數量等資訊,下圖是識别數字3的過程,可對照上面介紹各個層的功能進行一一回顧:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

資料與實驗可視化

Mnist資料集中的資料是這樣的(部分截圖)

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

每個數字都有60K左右張訓練圖像

每個數字都有10K左右張訓練圖像

直接訓練的結果:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

可以看到正确率還是很高的

我們将(随機抽取的部分樣本中)識别錯誤的圖檔單獨儲存下來

檔案名的第一個數字為模型比對的結果

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

1

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選
計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

2

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

3

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

4

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

5

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選
計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

6

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

7

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

8

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

9

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

比對結果分析

我個人認為最難比對的反而是輪廓相似的數字,特别是有局部輪廓相似

以數字8舉例:

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

這些數字都被比對為8

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

圈出的黃色圓圈出,有類似橢圓的拐角

圈出的藍色方框出,有類似的有點傾斜的直線

是以它們很容易與8比對上

在數字1,9中,有傾斜的直線有許多都比對成了8

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選
計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

以數字3舉例:

這些數字都被比對為3

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

都是有一個向上拐的尖角,而且其弧度相近

而數字3的錯誤比對中

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

有許多向上的尖角不正常,進而導緻錯誤比對

諸如此類的原因還有很多,沒辦法全部描述出來

我個人歸納為如下幾點:

1、特征相似,局部特征相似

2、走勢相似

3、結構相似

個人資料比對

計算機視覺學習10_LeNet_卷積神經網絡_Mnist資料集分析原理部分LeNet5資料與實驗可視化比對結果分析個人資料比對代碼節選

大部分圖檔都比對失敗

與上面分析的原因相近。

代碼節選

import tensorflow as tf
import numpy as np
import tkinter as tk
import os
from tkinter import filedialog
from PIL import Image, ImageTk
from tkinter import filedialog
import time


def creat_windows():
    win = tk.Tk() # 建立視窗
    sw = win.winfo_screenwidth()
    sh = win.winfo_screenheight()
    ww, wh = 400, 450
    x, y = (sw-ww)/2, (sh-wh)/2
    win.geometry("%dx%d+%d+%d"%(ww, wh, x, y-40)) # 居中放置視窗

    win.title('手寫體識别') # 視窗命名

    bg1_open = Image.open("timg.jpg").resize((300, 300))
    bg1 = ImageTk.PhotoImage(bg1_open)
    canvas = tk.Label(win, image=bg1)
    canvas.pack()


    var = tk.StringVar() # 建立變量文字
    var.set('')
    tk.Label(win, textvariable=var, bg='#C1FFC1', font=('宋體', 21), width=20, height=2).pack()

    tk.Button(win, text='選擇圖檔', width=20, height=2, bg='#FF8C00', command=lambda:main(var, canvas), font=('圓體', 10)).pack()
    
    win.mainloop()

def main(var, canvas):

    ip='9'
    L=os.listdir('D:\workspace\\untitled\Mnist手寫體訓練\Mnist手寫體訓練\mnist_test\\'+ip)
    print(L)
    global i
    for i in range(0,len(L),15):
        file_path ='D:\workspace\\untitled\Mnist手寫體訓練\Mnist手寫體訓練\mnist_test\\'+ip+'\\'+L[i]
        print(L[i])
        bg1_open = Image.open(file_path).resize((28, 28))
        pic = np.array(bg1_open).reshape(784, )
        bg1_resize = bg1_open.resize((300, 300))
        bg1 = ImageTk.PhotoImage(bg1_resize)
        canvas.configure(image=bg1)
        canvas.image = bg1
        init = tf.global_variables_initializer()
        with tf.Session() as sess:
            sess.run(init)
            saver = tf.train.import_meta_graph('save/model.meta')  # 載入模型結構
            saver.restore(sess, 'save/model')  # 載入模型參數
            graph = tf.get_default_graph()  # 加載計算圖
            x = graph.get_tensor_by_name("x-input:0")  # 從模型中讀取占位符變量
            keep_prob = graph.get_tensor_by_name("keep_prob:0")
            y_conv = graph.get_tensor_by_name("y-pred:0")  # 關鍵的一句  從模型中讀取占位符變量
            prediction = tf.argmax(y_conv, 1)
            predint = prediction.eval(feed_dict={x: [pic], keep_prob: 1.0},
                                      session=sess)  # feed_dict輸入資料給placeholder占位符
            answer = str(predint[0])
        var.set("預測的結果是:" + answer)
        if answer!=ip:
            bg1_open.save('D:\workspace\\untitled\Mnist手寫體訓練\Mnist手寫體訓練\wrong\\'+ip+'\\'+answer+'_'+str(i)+'.png')





if __name__ == "__main__":
    creat_windows()
           

繼續閱讀