圖片情感分析(2):圖像情感分析模型

        圖像情感分析模型是基於卷積神經網絡建立的,卷積神經網絡的構建用了keras庫,具體代碼實現以及代碼運行在下一篇貼出。

        模型包括3個卷積層、2個池化層、4個激活函數層、2個Dropout層、2個全連接層、1個Flatten層和最終分類層。

        圖片初始化是100*100大小,卷積層卷積核的個數都是32個,大小是13*13,經過三層卷積和兩層池化,每張圖片處理爲4*4大小,經Flatten層壓扁成一維進入全連接層,第一個全連接層指定了128個神經元,進入Dropout層,目的是爲了防止過擬合,當然在Flatten層之前還有一個Dropout層,最後是一個全連接層和一個分類層,激活函數層伴隨着每一個卷積層之後和第一個全連接層之後。模型訓練迭代次數選擇13次。

        具體實現過程如圖1所示:

圖1 圖像情感分析模型

        建立模型

        卷積層:主要是Convolution2D()函數。2D代表這是一個2維卷積,其功能爲對2維輸入進行卷積計算。我們的圖像數據尺寸爲100 * 100,所以在這裏需要使用2維卷積函數計算卷積。所謂的卷積計算,其實就是利用卷積核逐個像素、順序進行計算,簡化過程如圖2:

圖2 卷積計算

        上圖中事例是保留邊界像素算法,也就是卷積過後和原圖像大小一致,處理邊界值過程中,如果部分區域越界,就可以用0進行填充。計算過程中,將卷積核中心對準圖像第一個像素,在這裏就是像素值爲237的那個像素。卷積核覆蓋的區域,其下所有像素取均值然後相加:

        C(1)= 0 * 0.5 + 0 * 0.5 + 0 * 0.5 + 0 *0.5 + 237 * 0.5 + 203 * 0.5 + 0 * 0.5 + 123 * 0.5 + 112 * 0.5

        通過類似的計算,將計算結果作爲原來像素點處的特徵學習值,接着學習下一個卷積核中心覆蓋的像素點,直到所有像素點都被學習完。在這個過程中,卷積核依次覆蓋所有像素點,最終結果還是得到一個二維矩陣,是學習過的圖像。二維矩陣可以和原矩陣大小相同,也可以不相同,這取決於是否保留邊界,保留邊界的話會得到一個大小相同的矩陣圖像,若丟掉邊界像素,那麼在卷積過程中就會以卷積核覆蓋區域不越界的像素開始計算。如圖3.8所示,如果選擇丟掉圖像邊界特徵,卷積核就會從(2,2)像素點開始卷積計算,到(3,3)像素點結束計算,這樣得到的是一個2 * 2的矩陣表示的圖像。在本次畢設的模型中,卷積層採用丟掉邊界特徵的方式來處理圖像邊界:


        第一個卷積層包含32個卷積核,每個卷積核大小爲13 * 13, 值爲“same”意味着我們採用保留邊界特徵的方式進行卷積計算,而值“valid”則代表丟掉邊界像素。圖像經過第一層卷積層,大小變爲32* 88 * 88大小。

        激活函數層:以relu(Rectified Linear Units,修正線性單元)函數爲例,它的數學形式如下:

f(x)=max(0,x)

        這個函數非常簡單,小於0的輸入,輸出全部爲0,大於0的則輸出與輸入相等。該函數的優點是收斂速度快,對於不同的需求,我們可以選擇不同的激活函數,一般的激活函數包括:softplus、softsign、tanh、sigmoid、hard_sigmoid、linear,激活函數層屬於人工神經元的一部分,所以我們可以在構造層對象時通過傳遞activation參數設置。

        池化層:可以縮小輸入的特徵圖,簡化網絡計算複雜度,而且能夠進行特徵壓縮,突出主要特徵。我們通過調用MaxPooling2D()函數建立池化層,這個函數採用最大值池化法,這個方法選取覆蓋區域的最大值作爲區域主要特徵組成新的縮小後的特徵圖,具體過程簡化後如圖3所示:

圖3 池化過程

        池化層最重要的地方是可以降低維度,因爲它是將最大值作爲此學習範圍的輸出,所以能夠保留住此範圍裏的顯著特徵,雖然只能知道顯著特徵是什麼,卻得不到顯著特徵的發生位置,但很多問題不需要我們得到具體位置,只需要知道這一區域學習的最大特徵。由此池化層能夠爲圖像識別提供平移和旋轉不變性。即使圖像平移或旋轉幾個像素,得到的輸出值也基本一樣,因爲每次最大值運算得到的結果總是一樣的。經過第一層池化層,圖片數據變爲32* 44 * 44。採用maxpooling,poolsize爲(2,2)。代碼如下:


       Dropout 層:隨機斷開一定百分比的輸入神經元連接,以防止過擬合。過擬合意思是訓練數據預測準確率很高,測試數據預測準確率很低,用圖形表示就是擬合曲線較尖,不平滑。導致這種現象的原因是模型的參數很多,但訓練樣本太少,導致模型擬合過度。爲了解決這個問題,Dropout 層將隨機減少模型參數,讓模型變得簡單,而越簡單的模型越不容易產生過擬合。代碼中Dropout ()函數只有一個輸入參數,即指定拋棄比率,範圍爲0~1之間的浮點數,其實就是百分比。這個參數亦是一個可調參數,我們可以根據訓練結果調整它以達到更好的模型成熟度。本次模型中,比率選擇是0.5。

       Flatten層:截止到Flatten層之前,在網絡中流動的數據還是多維的(對於我們的程序就是2維的),經過多次的卷積、池化、 之後,到了這裏就可以進入全連接層做最後的處理了。全連接層要求輸入的數據必須是一維的,因此,我們必須把輸入數據“壓扁”成一維後才能進入全連接層,Flatten層的作用即在於此。

        全連接層 :全連接層的作用就是用於分類或迴歸,對於我們來說就是分類。keras將全連接層定義爲Dense層,其含義就是這裏的神經元連接非常“稠密”。我們通過Dense()函數來定義全連接層。這個函數的一個必填參數就是神經元個數,其實就是指定該層有多少個輸出。在我們的代碼中,第一個全連接層指定了512個神經元,也就是保留了512個特徵輸出到下一層。添加512節點的全連接並且進行激活,激活函數用relu。再經過一層Dropout層,防止過擬合。添加輸出2個節點,經過softmax層,進行輸出。
發佈了28 篇原創文章 · 獲贊 81 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章