特征层次分析、视觉特征语义探索(微调+预训练)
1. 關(guān)于卷積運(yùn)算、密集連接層、池化與小樣本
密集連接層與卷積層的根本區(qū)別在于,密集連接層從輸入特征中學(xué)到的是全局模式,在計(jì)算機(jī)視覺領(lǐng)域?qū)?yīng)著的是高級(jí)語(yǔ)義特征(全局模式就是涉及所有像素的模式,如 狗,耳朵,向日葵等)。卷積層學(xué)到的是局部模式,學(xué)到的就是輸入圖像二維圖像小窗口中發(fā)現(xiàn)的模式,對(duì)應(yīng)低級(jí)語(yǔ)義特征(局部模式就是卷積覆蓋的區(qū)域,3*3,5*5...,如邊緣、紋理等)。
正是因?yàn)檫@樣的特性,使得卷積神經(jīng)網(wǎng)絡(luò)具有兩個(gè)有趣的特性:
- 卷積神經(jīng)網(wǎng)絡(luò)學(xué)到的模式具有平移不變性。卷積神經(jīng)網(wǎng)絡(luò)在圖像某個(gè)區(qū)域?qū)W習(xí)到某個(gè)模式之后,可以在任何地方識(shí)別這個(gè)模式(其實(shí)質(zhì)就是低級(jí)特征提取器,后續(xù)應(yīng)用時(shí)相當(dāng)于對(duì)每一個(gè)候選模式進(jìn)行判別)。
- 卷積神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)到模式的空間層次結(jié)構(gòu)。例如,第一個(gè)卷基層可以學(xué)到較小的圖像特征(如邊緣、紋理、色度);第二個(gè)卷積層講學(xué)習(xí)由第一特征層組成更大的模式(如貓的耳朵形狀、眼睛紋理等),以此類推。這就使得卷及神經(jīng)網(wǎng)絡(luò)可以有效地學(xué)習(xí)越來(lái)越復(fù)雜、越來(lái)越抽象的視覺概念。(視覺世界從根本上也具有空間層次結(jié)構(gòu))
池化也是卷積網(wǎng)絡(luò)中常使用的一種技巧。與跨步卷積類似的是,池化也是下采樣的一種操作。但是相比之下,最大池化操作往往可以取得更好而效果,這主要在于最大池化保留了卷積濾波器的最大響應(yīng)值(我們也可以理解為最有效益的特征值),更具體的效益如下:
- 減少了需要處理的特征圖的元素個(gè)數(shù)
- 通過(guò)讓連續(xù)卷積層的觀察窗口越來(lái)越大(即串口覆蓋原始輸入的比例越來(lái)越大)從而引入空間過(guò)濾器的層級(jí)結(jié)構(gòu)
很多時(shí)候我們會(huì)聽說(shuō),只有在大量數(shù)據(jù)可以使用的情況下,深度學(xué)習(xí)才會(huì)有效。這種觀點(diǎn)只能說(shuō)是部分正確:深度學(xué)習(xí)的一個(gè)基本特性就是能夠獨(dú)立地[更特別地我希望數(shù)據(jù)局限在某個(gè)domain中,以提高魯棒性]在訓(xùn)練數(shù)據(jù)中找到有趣的特征,不需要人為的特征工程,而這只能在擁有大量訓(xùn)練樣本的情況下才能實(shí)現(xiàn)。對(duì)于輸入樣本維度非常高的情況下更是這樣,比如說(shuō)圖像。只能說(shuō)他是部分正確,是因?yàn)檫€存在如下兩種更可能出現(xiàn)的情況:
- 模型本身就很小,正則化做的也很好,同時(shí)任務(wù)也是非常的簡(jiǎn)單。這種情況下幾百個(gè)樣本就足夠了。
- 深度學(xué)習(xí)模型本質(zhì)上具有高度可重復(fù)使用性。正如上面所分析的那樣,淺層卷積網(wǎng)絡(luò)提取的是諸如邊緣、紋理、色度等低級(jí)視覺特征;深層卷積網(wǎng)絡(luò)/全連接層提取的是諸如鼻子、桌子、打太極、奔跑的馬等高級(jí)的視覺特征。低級(jí)特征是可以重復(fù)使用的,所以我們可以在已經(jīng)訓(xùn)練好的大型卷積網(wǎng)絡(luò)中僅裁剪出淺層卷積網(wǎng)絡(luò),再結(jié)合小樣本進(jìn)行特征網(wǎng)絡(luò)的微調(diào),同樣可以取得非常可觀的效果(與之相比較的是,利用小樣本和深層模型從參數(shù)初始化階段進(jìn)行訓(xùn)練)。
2. 使用預(yù)訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)小樣本任務(wù)
數(shù)據(jù)增強(qiáng)技術(shù)不是這里討論的核心,這里不進(jìn)行重點(diǎn)討論。
預(yù)訓(xùn)練網(wǎng)絡(luò)是一個(gè)已經(jīng)在大型數(shù)據(jù)集上(如ImageNet等大規(guī)模圖像分類任務(wù))訓(xùn)練好的深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),正如在上面1中討論的,如果提供訓(xùn)練的數(shù)據(jù)集足夠大而且通用,那么預(yù)先訓(xùn)練的網(wǎng)絡(luò)學(xué)到的空間層次特征提取結(jié)構(gòu)可以有效的作為視覺世界的通用模型。即使視覺任務(wù)之間存在差異,但是預(yù)先訓(xùn)練的網(wǎng)絡(luò)也給我們給拱了更好的初始化參數(shù)選擇。例如,在ImageNet訓(xùn)練好的網(wǎng)絡(luò)Alexnet、ResNet等,其雖然原本出發(fā)點(diǎn)是對(duì)動(dòng)物和生活中的物品進(jìn)行分類,但是如果將其應(yīng)用于不同類型的植物種類判別,這依然可以取得不錯(cuò)的效果。這足以說(shuō)明,深度卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到的特征確實(shí)的不同視覺問(wèn)題之間具備可移植性。這也是深度學(xué)習(xí)與其他傳統(tǒng)的特征工程方法的優(yōu)勢(shì)所在:深度學(xué)習(xí)在小樣本學(xué)習(xí)問(wèn)題上更有效(高效的特征可移植性)。
2.1 對(duì)比試驗(yàn)
數(shù)據(jù)集:kaggle2013貓狗分類任務(wù),構(gòu)造小樣本:1000張貓/狗圖像作為訓(xùn)練集,500張貓/狗圖像作為驗(yàn)證數(shù)據(jù)集,500張貓/狗圖像作為測(cè)試數(shù)據(jù)集。
- 方法一:淺層卷積神經(jīng)網(wǎng)絡(luò) - training from scratch
網(wǎng)絡(luò)結(jié)構(gòu):
實(shí)驗(yàn)結(jié)果:
vvvvv
評(píng)價(jià):
通過(guò)accuracy和loss評(píng)價(jià),我們能夠看出模型已經(jīng)出現(xiàn)了過(guò)擬合的特征。訓(xùn)練精度隨著時(shí)間幾乎線性增加,直到接近100%,而驗(yàn)證數(shù)據(jù)集的精度停留在65%-72%;驗(yàn)證數(shù)據(jù)集僅僅在7輪迭代之后就達(dá)到了最小值,但是訓(xùn)練集的損失卻一直在下降,最后趨近0.
訓(xùn)練樣本少是很常見的,如果貿(mào)然采用深度學(xué)習(xí)并且training from scratch明顯是不合理的,因?yàn)檫^(guò)擬合問(wèn)題很難避免。這時(shí)候就不得不考慮dropout、L2-norm(權(quán)重衰減)、數(shù)據(jù)增強(qiáng)、pre-trained、tuning等操作。
- 方法二:預(yù)訓(xùn)練深層卷積神經(jīng)網(wǎng)絡(luò) - training from pretrained model [VGG16]
Note 1:雖然VGG16相比較VGG19、Xception、Inception V3、 ResNet50、ResNet101等是一個(gè)比較老古董的結(jié)構(gòu)了,但是VGG16比較簡(jiǎn)單,與方法一中訓(xùn)練的網(wǎng)絡(luò)結(jié)構(gòu)具有高度相似性,所以實(shí)驗(yàn)結(jié)果更有說(shuō)服力。
Note 2:用于圖像分類的卷積神經(jīng)網(wǎng)絡(luò)包括低級(jí)視覺特征抽取[pooling+convolution]和高級(jí)語(yǔ)義特征綜合[fullyconnection]兩個(gè)部分。對(duì)于預(yù)訓(xùn)練網(wǎng)絡(luò)處理小樣本問(wèn)題,實(shí)際上就是直接應(yīng)用pretained模型的低級(jí)視覺特征抽取部分,然后重新構(gòu)造數(shù)據(jù)domain-self的高級(jí)語(yǔ)義特征。
ThinKing:為什么僅僅重復(fù)卷積操作,是否也可以重復(fù)使用密集連接層[全連接層]?
因?yàn)榫矸e操作學(xué)習(xí)到的表示是低級(jí)視覺特征抽取器,在處理視覺任務(wù)上更加通用;而全連接層是高級(jí)予以特征綜合,直接與任務(wù)掛鉤,類似于決策部分。此外,高級(jí)語(yǔ)義抽取器[全連接層]不在包含物體在輸入圖像中的位置信息,空間分別率很差。如果位置信息對(duì)于視覺任務(wù)是很重要的,如分割、檢測(cè)、跟蹤等,那么密集連接層的特征很大程度上是沒(méi)有用處的。
此外,即使對(duì)于卷積操作而言,其特征通用性也是存在差別的,這很大程度上取決于該卷積層在模型中的深度。 模型中更靠近底部的層提取出來(lái)是局部的、高度通用的特征圖,就像我們說(shuō)的邊緣、文理、色度;而更靠近頂部的層提取出來(lái)的特征將會(huì)是更加抽象的概念。所以我更傾向于使用pretrained模型前3-4層的卷積參數(shù)。
Feature Extraction + Classification = NOT End-to-End [運(yùn)行成本極低] 實(shí)驗(yàn)結(jié)果:
我先采用VGG16的卷積網(wǎng)絡(luò)提取特征,然后將特征輸入到全連接層,很明顯這并不是End-to-End的過(guò)程。
def extract_features(directory, sample_count):features = np.zeros(shape=(sample_count, 4, 4, 512))labels = np.zeros(shape=(sample_count))generator = datagen.flow_from_directory(directory,target_size=(150, 150),batch_size=batch_size,class_mode='binary')i = 0for inputs_batch, labels_batch in generator:features_batch = conv_base.predict(inputs_batch)features[i * batch_size : (i + 1) * batch_size] = features_batchlabels[i * batch_size : (i + 1) * batch_size] = labels_batchi += 1if i * batch_size >= sample_count:breakreturn features, labelstrain_features, train_labels = extract_features(train_dir, 2000) validation_features, validation_labels = extract_features(validation_dir, 1000) test_features, test_labels = extract_features(test_dir, 1000)train_features = np.reshape(train_features, (2000, 4 * 4 * 512)) validation_features = np.reshape(validation_features, (1000, 4 * 4 * 512)) test_features = np.reshape(test_features, (1000, 4 * 4 * 512))model = models.Sequential() model.add(layers.Dense(256, activation='relu', input_dim=4 * 4 * 512)) model.add(layers.Dropout(0.5)) model.add(layers.Dense(1, activation='sigmoid'))model.compile(optimizer=optimizers.RMSprop(lr=2e-5),loss='binary_crossentropy',metrics=['acc'])history = model.fit(train_features, train_labels,epochs=100,batch_size=20,validation_data=(validation_features, validation_labels))實(shí)驗(yàn)結(jié)果:
vvvv
雖然仍然存在過(guò)擬合現(xiàn)象,但是在驗(yàn)證數(shù)據(jù)集上,精度得到了非常大的提升,大約為90%-92%.
Expanding vgg16-cnn with dense net = End-to-End [運(yùn)行成本極高] 實(shí)驗(yàn)結(jié)果:
網(wǎng)絡(luò)結(jié)構(gòu):
這里需要注意的是,在編譯和訓(xùn)練模型之前,一定要‘凍結(jié)’VGG卷積網(wǎng)絡(luò)中的權(quán)重參數(shù),也就是說(shuō)保持他的權(quán)重值不變。因?yàn)槲覀兲砑拥腄ense層是隨機(jī)初始化的,如果不凍結(jié)VGG中的權(quán)重值,將會(huì)導(dǎo)致非常大的權(quán)重更新在網(wǎng)絡(luò)中進(jìn)行傳播,這對(duì)于VGG中已經(jīng)學(xué)習(xí)好的特征提取參數(shù)將會(huì)造成非常嚴(yán)重的破壞。
conv_base = VGG16(weights = 'imagenet',include_top = False,input_shape = (150,150,3)) model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid'))conv_base.trainable = False實(shí)驗(yàn)結(jié)果:
vvvv
End-to-End訓(xùn)練之后,精度進(jìn)一步得到了提升,大約94%-95%。
數(shù)據(jù)增強(qiáng)技術(shù)的引入,不僅僅解決了‘過(guò)擬合’現(xiàn)象,是使得驗(yàn)證數(shù)據(jù)集的精度得到了進(jìn)一步提升,最終約為96%-97.4%。
3. 微調(diào)模型實(shí)現(xiàn)小樣本數(shù)據(jù)的深度訓(xùn)練
pretrained模型還有一種更為常用的方法-模型微調(diào) fine-tuning。前面是對(duì)特征提取的卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行完全的凍結(jié),微調(diào)是指將與預(yù)先訓(xùn)練的網(wǎng)絡(luò)模型的頂部幾層進(jìn)行'解凍'[因?yàn)樵绞堑讓?#xff0c;視覺特征越基礎(chǔ),特征越通用;越靠近頂部,特征越容易聚合成針對(duì)任務(wù)的更高級(jí)語(yǔ)義特征,所以更好的辦法是對(duì)頂層特征提取器參數(shù)進(jìn)行微調(diào),使其更適應(yīng)特定的任務(wù)]。
上一節(jié)說(shuō)過(guò),凍結(jié)VGG16的卷積特征提取層,是為了能夠基于卷積特征,訓(xùn)練一個(gè)分類器(也就是形成高級(jí)語(yǔ)義特征用于分類)。同理,只有上面的分類器訓(xùn)練好了,才可能微調(diào)卷積特征提取網(wǎng)絡(luò)的頂部幾層。如果分類器沒(méi)有訓(xùn)練好,那么訓(xùn)練期間通過(guò)網(wǎng)絡(luò)傳播的誤差信號(hào)就會(huì)特別大,微調(diào)的幾層之前好不容易學(xué)習(xí)到的有效的表達(dá)能力,也會(huì)被破壞掉。
- 微調(diào)的步驟如下:
我們能夠發(fā)現(xiàn),fine tuning其實(shí)是對(duì)pretraining的一種優(yōu)化,使得網(wǎng)絡(luò)更加具備‘個(gè)性化’能力。
核心代碼+網(wǎng)絡(luò)結(jié)構(gòu):
conv_base = VGG16(weights = 'imagenet',include_top = False,input_shape = (150,150,3)) model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid'))conv_base.trainable = True # 最頂層的卷積特征提取器的參數(shù)是可以和全連接層一起訓(xùn)練的 # 底部四層卷積特征提取器依然被‘凍結(jié)’ set_trainable = False for layer in conv_base.layers:if layer.name == 'block5_conv1':set_trainable = Trueif set_trainable:layer.trainable = Trueelse:layer.trainable = False實(shí)驗(yàn)結(jié)果:
vvvv
實(shí)驗(yàn)結(jié)果更加的精確,精度提高到了~98%.
Note:我們應(yīng)不應(yīng)該調(diào)整更多的層?
4. 參考資料
1. Simonyan K, Zisserman A. Very Deep Convolutional Networks for Large-Scale Image Recognition[J]. international conference on learning representations, 2015.
2. python3-wih-deep-learning.
總結(jié)
以上是生活随笔為你收集整理的特征层次分析、视觉特征语义探索(微调+预训练)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows Sysinternals
- 下一篇: 窥探黑盒-卷积神经网络的可视化