ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)
????? 原文鏈接:caffe Model的可視化? snapshot: 6000
???? ? 一個(gè)在線可視化小工具:http://blog.csdn.net/10km/article/details/52713027???
?? ? ? Place205 Model集結(jié)地:http://places.csail.mit.edu/downloadCNN.html?
????? 參考文章:深度學(xué)習(xí)之可視化-ZfNet去卷積????
前言
? ? ?? 由來(lái)已久,ANN方法被稱為模式識(shí)別里面的“黑盒”方法,因?yàn)锳NN模型不能使用明確的函數(shù)——形式化的數(shù)學(xué)公式進(jìn)行表示,同時(shí)也意味著應(yīng)對(duì)評(píng)價(jià)模型,面對(duì)函數(shù)尋求最優(yōu)解的優(yōu)化方程也不能形式化表示。
??????? 基于NN的分層堆疊性,NN即使以特定結(jié)構(gòu)三層網(wǎng)便可以以任意精度逼近任意非線性函數(shù),也同時(shí)表示函數(shù)形式在NN中的難以形式化。K曾經(jīng)證明(1957),在單位超立方體內(nèi)的任意連續(xù)函數(shù),都可以選擇適當(dāng)?shù)膮?shù)展開(kāi)為兩級(jí)級(jí)數(shù)求和問(wèn)題。后來(lái)的研究發(fā)現(xiàn),任意一個(gè)從x到y(tǒng)的映射,都存在一個(gè)合適的三層神經(jīng)網(wǎng)絡(luò)以任意的精度逼近它。
???????? 反過(guò)來(lái)看,從神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù),去描述函數(shù)的一個(gè)形式,涉及到擬合問(wèn)題,是個(gè)不確定問(wèn)題。進(jìn)而以此歸結(jié)出基于模型函數(shù)的優(yōu)化函數(shù),則是不可能完成的事情。從這個(gè)角度上看來(lái),NN是個(gè)語(yǔ)義和語(yǔ)法的黑箱。?????? 好在對(duì)于學(xué)習(xí)來(lái)說(shuō),形式化是非必須的,可形式化的SVM也面臨著核函數(shù)的形式化難題,而CNN可以從語(yǔ)義層次進(jìn)行解析,以彌補(bǔ)語(yǔ)法不能完備的缺憾。
ZFNet思想及過(guò)程
? ? ? ????????? 從科學(xué)的觀點(diǎn)出發(fā),如果不能歸納,只能進(jìn)行遍歷。如果不知道神經(jīng)網(wǎng)絡(luò)為什么取得了如此好的效果,那么只能靠不停的實(shí)驗(yàn)來(lái)尋找更好的模型。
???????? ZFNet使用一個(gè)多層的反卷積網(wǎng)絡(luò)來(lái)可視化訓(xùn)練過(guò)程中特征的演化及發(fā)現(xiàn)潛在的問(wèn)題;同時(shí)根據(jù)遮擋圖像局部對(duì)分類結(jié)果的影響來(lái)探討對(duì)分類任務(wù)而言到底那部分輸入信息更重要。
反卷積可視化:
一個(gè)卷積層加一個(gè)對(duì)應(yīng)的反卷積層;
?輸入是feature map,輸出是圖像像素;
過(guò)程包括反池化操作、relu和反卷積過(guò)程。
反池化:?????? 嚴(yán)格意義上的反池化是無(wú)法實(shí)現(xiàn)的。作者采用近似的實(shí)現(xiàn),在訓(xùn)練過(guò)程中記錄每一個(gè)池化操作的一個(gè)z*z的區(qū)域內(nèi)輸入的最大值的位置,這樣在反池化的時(shí)候,就將最大值返回到其應(yīng)該在的位置,其他位置的值補(bǔ)0。
relu糾正:
?????? 卷積神經(jīng)網(wǎng)絡(luò)使用relu非線性函數(shù)來(lái)保證輸出的feature map總是為正數(shù)。在反卷積的時(shí)候,也需要保證每一層的feature map都是正值,所以這里還是使用relu作為非線性激活函數(shù)。
?濾波:
???????? 使用原卷積核的轉(zhuǎn)秩和feature map進(jìn)行卷積。反卷積其實(shí)是一個(gè)誤導(dǎo),這里真正的名字就是轉(zhuǎn)秩卷積操作。反卷積網(wǎng)中利用卷積網(wǎng)中的相同的濾波器的轉(zhuǎn)置應(yīng)用到糾正過(guò)的特征圖中,而不是上層的輸出。也就是對(duì)濾波器進(jìn)行水平方向和垂直方向的翻轉(zhuǎn)。從高層向下投影使用轉(zhuǎn)換變量switch,這個(gè)轉(zhuǎn)化變量switch產(chǎn)生自向上的卷積網(wǎng)的最大池化操作。由于重建由一個(gè)單獨(dú)的激活獲得,因此也就只對(duì)應(yīng)于原始輸入圖像的一小塊。
???????????
?????????? 上圖左半部分是一個(gè)解卷積層,右半部分為一個(gè)卷積層。解卷積層將會(huì)重建一個(gè)來(lái)自下一層的卷積特征近似版本。圖中使用switc來(lái)記錄在卷積網(wǎng)中進(jìn)行最大池化操作時(shí)每個(gè)池化區(qū)域的局部最大值的位置,經(jīng)過(guò)非池化操作之后,原來(lái)的非最大值的位置都置為0。
特征可視化:
???????? 每個(gè)特征單獨(dú)投影到像素空間揭露了不同的結(jié)構(gòu)能刺激不同的一個(gè)給定的特征圖,因此展示了它對(duì)于變形的輸入內(nèi)在的不變性。下圖即在一個(gè)已經(jīng)訓(xùn)練好的網(wǎng)絡(luò)中可視化后的圖。
???????????
????????? 上圖所示是訓(xùn)練結(jié)束后,模型各個(gè)隱藏層提取的特征,圖所示的是給定輸出特征時(shí),反卷積產(chǎn)生的最強(qiáng)的9個(gè)輸入特征。將這些計(jì)算所得的特征,用像素空間表示后,可以清晰地看出:一組特定的輸入特征(通過(guò)重構(gòu)獲得),將刺激卷積網(wǎng)產(chǎn)生一個(gè)固定的輸出特征。圖2的右邊是對(duì)應(yīng)的輸入圖片,和重構(gòu)特征相比,輸入圖片和其之間的差異性很大,而重構(gòu)特征只包含那些具有判別能力的紋理結(jié)構(gòu)。例如,第5層第1行第2列的9張輸入圖片各不相同差異很大,而對(duì)應(yīng)的重構(gòu)輸入特征則都顯示了背景中的草地,沒(méi)有顯示五花八門的前景。
?????? 每一層的可視化結(jié)果都展示了網(wǎng)絡(luò)的層次化特點(diǎn)。第2層展示了物體的邊緣和輪廓,以及與顏色的組合,第3層擁有了更復(fù)雜的不變性,主要展示了相似的紋理,第4層不同組重構(gòu)特征存在著重大差異性,開(kāi)始體現(xiàn)了類與類之間的差異,第5層每組圖片都展示了存在重大差異的一類物體。
?訓(xùn)練過(guò)程中的feature變化:
???????? 外表突然的變化導(dǎo)致圖像中的一個(gè)變換即產(chǎn)生了最強(qiáng)烈的激活。模型的底層在少數(shù)幾個(gè)epoches就能收斂聚集,然而上層在一個(gè)相當(dāng)多的epoches(40-50)之后才能有所變化,這顯示了讓模型完全訓(xùn)練到完全收斂的必要性。可以由下圖看到顏色對(duì)比度都逐步增強(qiáng)。
?????????
特征不變性
????? ? 下圖所示,5個(gè)不同的例子,它們分別被平移、旋轉(zhuǎn)和縮放。圖5右邊顯示了不同層特征向量所具有的不變性能力。在第一層,很小的微變都會(huì)導(dǎo)致輸出特征變化明顯,但是越往高層走,平移和尺度變化對(duì)最終結(jié)果的影響越小,網(wǎng)絡(luò)的輸出對(duì)于平移和尺度變化都是穩(wěn)定的。卷積網(wǎng)無(wú)法對(duì)旋轉(zhuǎn)操作產(chǎn)生不變性,除非物體具有很強(qiáng)的對(duì)稱性,看似是個(gè)偽命題。
??????
同類不同圖像的一致性分析
???????? 對(duì)五張小狗(同一類)的不同圖片的不同區(qū)域進(jìn)行掩蓋,然后進(jìn)行分析觀察探究深度模型是對(duì)一類物體的那部分進(jìn)行一致性分析的過(guò)程...............
????????
???????? 第5層隨機(jī)遮擋的情況比其他眼睛鼻子被遮擋的情況一致性分析較差,而第7層中,這四類卻都差不多,那是因?yàn)榈讓优袆e的是一類物體共有的部分,而高層判別的是類別中不同的品種這種更高維的部分了。
????????
遷移學(xué)習(xí)的可行性
?????? 把預(yù)訓(xùn)練的CNN模型用于新的場(chǎng)景,是遷移學(xué)習(xí)的應(yīng)用表現(xiàn)。底層CNN-featureMap的通用性為這種移動(dòng)提供了一個(gè)有力的實(shí)驗(yàn)支持。遷移學(xué)習(xí)一般從復(fù)雜模型遷移到簡(jiǎn)單模型,且一般使用遷移模型的底層部分,高層模型需要進(jìn)行重建。
PythonCode
code1.訓(xùn)練Cifar10網(wǎng)絡(luò)
??? 下載Cifar10的數(shù)據(jù)集:得到
? ? mean.binaryproto 文件
??? cifar10_test_lmdb?? cifar10_train_lmdb 文件夾,把三個(gè)文件和目錄,復(fù)制到examples\cifar10 目錄
??? 建立CMD文件 cifar10_train_full.cmd 到工程的根目錄,與example平級(jí)
??? 內(nèi)容為:D:\Works\CNN\MsCaffe\Build\x64\Release/caffe.exe train --solver=examples/cifar10/cifar10_quick_solver.prototxt ?
??????????????? pause
? ?? 運(yùn)行cmd命令
訓(xùn)練結(jié)果:
????
??? 生成結(jié)果到 examples/cifar10/根目錄,生成了H5后綴的訓(xùn)練模型。
2. 可視化Caffe model
??? 在Eclipse工程中,添加一個(gè)py文件,內(nèi)容為:
#coding=utf-8 """ Caffe visualize Display and Visualization Functions and caffe model.Copyright (c) 2017 Matterport, Inc. Licensed under the MIT License (see LICENSE for details) Written by wishchin yangMayBe I should use jupyter notebook """import numpy as np import matplotlib.pyplot as plt import os,sys,caffe #%matplotlib inline#編寫一個(gè)函數(shù),用于顯示各層的參數(shù) def show_feature(data, padsize=1, padval=0):data -= data.min();data /= data.max();# force the number of filters to be squaren = int(np.ceil(np.sqrt(data.shape[0])));padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3);data = np.pad(data, padding, mode='constant', constant_values=(padval, padval));# tile the filters into an imagedata = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)));data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:]);plt.imshow(data);plt.axis('off');#第一個(gè)實(shí)例,測(cè)試cifar10模型 def mainex():caffe_root='D:/Works/CNN/MsCaffe/';os.chdir(caffe_root);sys.path.insert(0,caffe_root+'python');plt.rcParams['figure.figsize'] = (8, 8);plt.rcParams['image.interpolation'] = 'nearest';plt.rcParams['image.cmap'] = 'gray';net = caffe.Net(caffe_root + 'examples/cifar10/cifar10_quick_train_test.prototxt',caffe_root + 'examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5',caffe.TEST);[(k, v[0].data.shape) for k, v in net.params.items()];# 第一個(gè)卷積層,參數(shù)規(guī)模為(32,3,5,5),即32個(gè)5*5的3通道filterweight = net.params["conv1"][0].dataprint(weight.shape);show_feature(weight.transpose(0, 2, 3, 1));# 第二個(gè)卷積層的權(quán)值參數(shù),共有32*32個(gè)filter,每個(gè)filter大小為5*5weight = net.params["conv2"][0].data;print weight.shape;show_feature( weight.reshape(32**2, 5, 5) );# 第三個(gè)卷積層的權(quán)值,共有64*32個(gè)filter,每個(gè)filter大小為5*5,取其前1024個(gè)進(jìn)行可視化weight = net.params["conv3"][0].data ;print weight.shape ;show_feature(weight.reshape(64*32, 5, 5)[:1024]);if __name__ == '__main__':import argparsemainex();???? 調(diào)試運(yùn)行.............................................
結(jié)果顯示:
???? conv1層????????????????????????????????????????????????????????????????????????????????????????? ???? conv2層
??????? ? ???
?
??? 結(jié)果分析:迭代4000次訓(xùn)練的結(jié)果不是特別好,并沒(méi)有訓(xùn)練得到明顯的底層特征。
總結(jié)
以上是生活随笔為你收集整理的ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Go之gob包的使用
- 下一篇: ProE常用曲线方程:Python Ma