競賽練習(xí)—形狀識(shí)別2:方圓之外

前言

此次競賽為《形狀識(shí)別2:方圓之外》锅棕,是一起圖像的多分類問題拙泽。因?yàn)槭浅醮谓佑|CNN模型,主要分析標(biāo)桿模型并進(jìn)行調(diào)參裸燎。
提交的結(jié)果為每行的預(yù)測標(biāo)簽顾瞻,也就是0、1德绿、2荷荤。評(píng)價(jià)方法為準(zhǔn)確率。本文最終處理結(jié)果為0.98767移稳,排名2

1 CNN模型概述

其實(shí)卷積神經(jīng)網(wǎng)絡(luò)(CNN)依舊是層級(jí)網(wǎng)絡(luò)梅猿,只是層的功能和形式做了變化,主要是面對(duì)圖像輸入

1.1 卷積神經(jīng)網(wǎng)絡(luò)的層級(jí)結(jié)構(gòu)

1.1.1 數(shù)據(jù)輸入層/ Input layer

該層要做的處理主要是對(duì)原始圖像數(shù)據(jù)進(jìn)行預(yù)處理

1.1.2 卷積計(jì)算層/ CONV layer

這一層就是卷積神經(jīng)網(wǎng)絡(luò)最重要的一個(gè)層次秒裕,也是“卷積神經(jīng)網(wǎng)絡(luò)”的名字來源袱蚓。在這個(gè)卷積層,有兩個(gè)關(guān)鍵操作:
局部關(guān)聯(lián)——每個(gè)神經(jīng)元看做一個(gè)濾波器(filter)——相當(dāng)于一個(gè)filter提取圖像的一個(gè)特征圖
窗口(receptive field)滑動(dòng)——filter對(duì)局部數(shù)據(jù)計(jì)算——矩陣內(nèi)積

一般要設(shè)置的超參數(shù)包括filters的數(shù)量几蜻、大小喇潘、步長,以及填充值(padding)

image

這里filters的數(shù)量為兩個(gè)filter(w0,w1)梭稚、大小為(3×3)颖低、步長為2

這里的藍(lán)色矩陣就是輸入的圖像,灰色邊框是填充值
粉色矩陣就是卷積層的filter
移動(dòng)的藍(lán)色矩陣就是窗口滑動(dòng)弧烤,將窗口內(nèi)的局部數(shù)據(jù)與粉色矩陣filter計(jì)算內(nèi)積
綠色矩陣就是經(jīng)過卷積運(yùn)算后的輸出矩陣

1.1.3 ReLU激勵(lì)層 / ReLU layer

把卷積層輸出結(jié)果做非線性映射忱屑,不過一般使用ReLU函數(shù),它的特點(diǎn)是收斂快暇昂,求梯度簡單莺戒,但較脆弱,圖像如下:

ReLU

1.1.4 池化層 / Pooling layer

池化層夾在連續(xù)的卷積層中間急波, 用于在特征不變的基礎(chǔ)上壓縮數(shù)據(jù)和參數(shù)的量从铲,減小過擬合

這里里面沒有參數(shù)需要我們學(xué)習(xí),因?yàn)檫@里里面的參數(shù)都是我們?cè)O(shè)置好了澄暮,要么是Maxpooling名段,要么是Averagepooling
需要指定的超參數(shù),包括是Max還是average泣懊,窗口大小以及步長
通常伸辟,我們使用的比較多的是Maxpooling,而且一般取大小為(2,2)步長為2的filter馍刮,這樣信夫,經(jīng)過pooling之后,輸入的長寬都會(huì)縮小2倍,特征不變

1.1.5 全連接層 / FC layer

和傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)一樣忙迁,這一層是每一個(gè)單元都和前一層的每一個(gè)單元相連接,所以稱之為“全連接”
這里要指定的超參數(shù)碎乃,無非就是神經(jīng)元的數(shù)量姊扔,以及激活函數(shù),一般最后一個(gè)全連接層才使用softmax函數(shù)(前面用relu是為了收斂快梅誓,最后softmax是為了輸出結(jié)果)

1.2 CNN的特點(diǎn)

CNN相較于傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)恰梢,無非就是把FC改成了CONV和POOL,就是把傳統(tǒng)的由一個(gè)個(gè)神經(jīng)元組成的layer梗掰,變成了由filters組成的layer
優(yōu)點(diǎn)

? 共享卷積核(一個(gè)filter對(duì)應(yīng)一個(gè)參數(shù))嵌言,對(duì)高維數(shù)據(jù)處理無壓力
? 無需手動(dòng)選取特征,訓(xùn)練好權(quán)重及穗,即得特征分類效果好

缺點(diǎn)

? 需要調(diào)參摧茴,需要大樣本量,訓(xùn)練最好要GPU
? 物理含義不明確(也就說埂陆,我們并不知道沒個(gè)卷積層到底提取到的是什么特征苛白,而且神經(jīng)網(wǎng)絡(luò)本身就是一種難以解釋的“黑箱模型”)

1.3 CNN結(jié)構(gòu)演化歷史

image

以上結(jié)構(gòu)可查看《深度學(xué)習(xí)----CNN幾種常見網(wǎng)絡(luò)結(jié)構(gòu)及區(qū)別》

2 標(biāo)桿模型分析

標(biāo)桿模型是基于Keras所構(gòu)造的一個(gè)CNN卷積網(wǎng)絡(luò)。
Keras是一個(gè)高級(jí)的Python神經(jīng)網(wǎng)絡(luò)框架焚虱,已被添加到TensorFlow中购裙,成為其默認(rèn)的框架,為TensorFlow提供更高級(jí)的API鹃栽。
keras系列︱Sequential與Model模型躏率、keras基本結(jié)構(gòu)功能(一)

2.1 加載數(shù)據(jù)

將數(shù)據(jù)特征轉(zhuǎn)換為矩陣,以便卷積計(jì)算

2.2 數(shù)據(jù)處理

①圖像預(yù)處理:

利用中值濾波(median filter)進(jìn)行降噪
——中值濾波的基本原理是把數(shù)字圖像或數(shù)字序列中一點(diǎn)的值用該點(diǎn)的一個(gè)鄰域中各點(diǎn)值的中值代替民鼓,讓周圍的像素值接近的真實(shí)值薇芝,從而消除孤立的噪聲點(diǎn)。
利用閾值分割法(threshold segmentation)生成掩膜(binary mask)
——圖像閾值化的目的是要按照灰度級(jí)丰嘉,對(duì)像素集合進(jìn)行一個(gè)劃分恩掷,得到的每個(gè)子集形成一個(gè)與現(xiàn)實(shí)景物相對(duì)應(yīng)的區(qū)域,各個(gè)區(qū)域內(nèi)部具有一致的屬性供嚎,而相鄰區(qū)域不具有這種一致屬性黄娘。
利用形態(tài)閉合(morphology closing)來填充圖中的小洞
——先膨脹(一般對(duì)二值圖像進(jìn)行操作。找到像素值為1的點(diǎn)克滴,將它的鄰近像素點(diǎn)都設(shè)置成這個(gè)值逼争。1值表示白,0值表示黑劝赔,因此膨脹操作可以擴(kuò)大白色值范圍誓焦,壓縮黑色值范圍)再腐蝕(和膨脹相反的操作,將0值擴(kuò)充到鄰近像素),可用來填充孔洞杂伟。

②挑選異形樣本并過采樣:

因?yàn)橛?xùn)練集中沒有異形樣本移层,人工挑選5個(gè)異形樣本加入訓(xùn)練

2.3 構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)

def built_model(): 
    n_filter=32; 
    model = Sequential() 
    model.add(Convolution2D(filters=n_filter, kernel_size=(5, 5), input_shape=(40, 40, 1), activation='relu'))
    model.add(Convolution2D(filters=n_filter, kernel_size=(5,5), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Convolution2D(filters=n_filter, kernel_size=(5,5), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Convolution2D(filters=n_filter, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(units=128, activation='relu'))
    model.add(Dense(3, activation='softmax')) # Final Layer using Softmax
    model.compile(loss='categorical_crossentropy', 
                  optimizer=Adam(lr=0.0003),
                  metrics=['accuracy']) 
    model.summary()
    return model

流程:創(chuàng)建Sequential()對(duì)象(簡單線性堆疊網(wǎng)絡(luò)),逐層堆疊網(wǎng)絡(luò)
[Convolution2D-> RELU]卷積層—— 【[Convolution2D-> RELU]卷積層——MaxPooling2D池化層】×3
——Dropout防止過擬合——Flatten壓平赫粥,多維轉(zhuǎn)為一維——[FC -> RELU]全連接層——[FC -> Softmax]全連接層

n_filter就是濾波器(filter)的個(gè)數(shù)观话,一般個(gè)數(shù)從少到多,本文統(tǒng)一為32個(gè)
model.compile()定義損失函數(shù)
model.summary()輸出模型各層的參數(shù)狀況越平,具體參數(shù)計(jì)算可參考《詳細(xì)解釋CNN卷積神經(jīng)網(wǎng)絡(luò)各層的參數(shù)和鏈接個(gè)數(shù)的計(jì)算》

2.4 訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)

①訓(xùn)練模型的同時(shí)進(jìn)行數(shù)據(jù)增廣:

datagen = ImageDataGenerator( rotation_range=180, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True ) 
# 訓(xùn)練模型的同時(shí)進(jìn)行數(shù)據(jù)增廣
history=model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),
                            steps_per_epoch=len(x_train) / batch_size, epochs=epochs,
                            class_weight=class_weight, 
                            validation_data=datagen.flow(x_train, y_train, batch_size=batch_size), validation_steps=1)

ImageDataGenerator()是keras.preprocessing.image模塊中的圖片生成器频蛔,同時(shí)也可以在batch中對(duì)數(shù)據(jù)進(jìn)行增強(qiáng)擴(kuò)充數(shù)據(jù)集大小秦叛,增強(qiáng)模型的泛化能力晦溪。比如進(jìn)行旋轉(zhuǎn),變形挣跋,歸一化等等三圆。
因?yàn)楫愋螛颖据^少,還設(shè)置class_weight損失權(quán)重避咆,使得損失函數(shù)對(duì)異形樣本更加關(guān)注嫌术。

②畫epoch損失圖:

2.5 提交結(jié)果

試著按照原代碼,每一個(gè)epoch時(shí)間為150s(使用的是CPU所以計(jì)算較慢)牌借,經(jīng)過100個(gè)epoch度气,最終提交成績?yōu)?.95242

3 模型處理

3.1 模型調(diào)參和選擇結(jié)構(gòu)

3.1.1 調(diào)整卷積層和池化層數(shù)量

【[Convolution2D-> RELU]卷積層——MaxPooling2D池化層
——Dropout防止過擬合——Flatten壓平,多維轉(zhuǎn)為一維——[FC -> RELU]全連接層——[FC -> Softmax]全連接層

圖1

【[Convolution2D-> RELU]卷積層——MaxPooling2D池化層】×2
——Dropout防止過擬合——Flatten壓平膨报,多維轉(zhuǎn)為一維——[FC -> RELU]全連接層——[FC -> Softmax]全連接層

圖2

【[Convolution2D-> RELU]卷積層——MaxPooling2D池化層】×3
——Dropout防止過擬合——Flatten壓平磷籍,多維轉(zhuǎn)為一維——[FC -> RELU]全連接層——[FC -> Softmax]全連接層

圖3

由上往下,隨著卷積層和池化層得增多现柠,時(shí)耗增多院领,這是因?yàn)?strong>每一層卷積層都會(huì)增加參數(shù)數(shù)量。但發(fā)現(xiàn)圖2表現(xiàn)最好够吩,即下降得快且又平滑比然,

3.1.2 調(diào)整n_filter個(gè)數(shù)

在上面圖1的基礎(chǔ)上更改n_filter個(gè)數(shù)(速度較快)

n_filter=6
n_filter=36
n_filter=60

n_filter 越多,時(shí)耗越多周循,也是因?yàn)閰?shù)增多强法。但n_filter=36 時(shí)模型表現(xiàn)最好。

3.2 再增異形樣本

以上損失圖中最后epoch顯示訓(xùn)練集和測試集的損失都接近0了湾笛,可提交上去仍未能前幾饮怯。從競賽前身《形狀識(shí)別:是方還是圓》中僅對(duì)正方形和圓形識(shí)別,排行榜多為1.0嚎研,猜測是因?yàn)榇烁傎愐驗(yàn)槎嗔水愋闻袛啾褪噪y達(dá)成100%的準(zhǔn)確率。

嘗試再增加不同的異形樣本加入訓(xùn)練集中,剛好另一位博主的競賽文章也加入了異形樣本且成績有所提高论矾,引用該博主尋找的異形教翩。

最終模型決定是:

def built_model(): 
    n_filter=36; 
    model = Sequential() 
    model.add(Convolution2D(filters=n_filter, kernel_size=(5, 5), input_shape=(40, 40, 1), activation='relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Convolution2D(filters=n_filter, kernel_size=(3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.5))
    model.add(Flatten())
    model.add(Dense(units=128, activation='relu'))
    model.add(Dense(3, activation='softmax')) # Final Layer using Softmax
    model.compile(loss='categorical_crossentropy', 
              optimizer=Adam(lr=0.0003),
    metrics=['accuracy']) 
    model.summary()
    return model
num_anno=10
anno_idx=np.array([0,1, 4, 10, 13,4949, 4956, 4973, 4974, 4988])

3.3 提交結(jié)果

每一個(gè)epoch時(shí)間為60s,經(jīng)過100個(gè)epoch贪壳,最終提交成績?yōu)?.98767

小結(jié)

①了解了CNN模型饱亿,但未嘗試更為復(fù)雜的結(jié)構(gòu)(VGG、ResNet等)

②神經(jīng)網(wǎng)絡(luò)這種大量參數(shù)需要大量運(yùn)算的寥袭,最好還是使用GPU版本(我安裝失敗就沒用)

③本次并未對(duì)模型多大處理,因?yàn)闃?biāo)桿模型做的足夠好关霸,主要僅是消化CNN模型原理和簡單運(yùn)用

主要參考:
卷積神經(jīng)網(wǎng)絡(luò)CNN總結(jié)
【DL筆記6】從此明白了卷積神經(jīng)網(wǎng)絡(luò)(CNN)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末传黄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子队寇,更是在濱河造成了極大的恐慌膘掰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佳遣,死亡現(xiàn)場離奇詭異识埋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)零渐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門窒舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诵盼,你說我怎么就攤上這事惠豺。” “怎么了风宁?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵洁墙,是天一觀的道長。 經(jīng)常有香客問我戒财,道長热监,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任饮寞,我火速辦了婚禮孝扛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幽崩。我一直安慰自己疗琉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布歉铝。 她就那樣靜靜地躺著盈简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柠贤,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天香浩,我揣著相機(jī)與錄音,去河邊找鬼臼勉。 笑死邻吭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宴霸。 我是一名探鬼主播囱晴,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼瓢谢!你這毒婦竟也來了畸写?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤氓扛,失蹤者是張志新(化名)和其女友劉穎枯芬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體采郎,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡千所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蒜埋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淫痰。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖整份,靈堂內(nèi)的尸體忽然破棺而出黑界,到底是詐尸還是另有隱情,我是刑警寧澤皂林,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布朗鸠,位于F島的核電站,受9級(jí)特大地震影響础倍,放射性物質(zhì)發(fā)生泄漏烛占。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一沟启、第九天 我趴在偏房一處隱蔽的房頂上張望忆家。 院中可真熱鬧,春花似錦德迹、人聲如沸芽卿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卸例。三九已至称杨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筷转,已是汗流浹背姑原。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呜舒,地道東北人锭汛。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像袭蝗,于是被迫代替她去往敵國和親唤殴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351