卷積特徵提取與池化(Pooling)——處理大型映像

來源:互聯網
上載者:User

標籤:deep learning   ufldl   深度學習   模式識別   池化   

在之前的章節中,我們已經很好地解決了手寫體識別問題(維數為28*28)。但如果是更大的映像(維數為96*96)呢?如果你還是要學習400個特徵,那麼網路權重參數就有400*96*96即近400萬個。

 

 

卷積特徵提取

如果我們從大型彩色映像(64*64*3)中隨機抽取一些小patch(8*8),學到了一些特徵,然後用這些特作為濾波器去掃過整張大圖,即逐行逐列做卷積。這樣做可以大幅減小網路參數W的數量,然而會使輸入分類器的特徵維數大幅度上升。

 

池化

池化是在卷積特徵提取的基礎上,對每個卷積特徵進行取平均等,繼續縮小隱藏節點對於的卷積特徵維數,減小分類器的設計負擔。

 

下面列表說明

原始映像為64*64*3的彩色映像

卷積特徵提取採樣8*8的patch

隱藏層節點數統一為400

池化採用19*19的尺寸



可以看到,通過卷積特徵提取和池化後,W數量和分類器輸入特徵數量都同時大幅度下降了。

 

下面是核心代碼,使用的資料庫有四種圖片:飛機、汽車、貓、狗,每幅圖的大小就是64*64*3,train圖片2000幅,test圖片3200幅,最後經過漫長的等待:時間已過 3288.054248 秒。

Accuracy:80.406%,結果令人滿意。


cnnExercise

loadSTL10Features%載入線性解碼器提到的特徵


這裡是之前得到的400個特徵

現在拿來當卷積濾波器用

圖1


計算卷積

cnnConvolve

這裡太零散了,直接粘過來整個M檔案好了。

function convolvedFeatures = cnnConvolve(patchDim, numFeatures, images, W, b, ZCAWhite, meanPatch)numImages = size(images, 4);imageDim = size(images, 1);imageChannels = size(images, 3);convolvedFeatures = zeros(numFeatures, numImages, imageDim - patchDim + 1, imageDim - patchDim + 1);WT=W*ZCAWhite;%等效WbT = b - WT*meanPatch;%等效b,這裡要補償均值convolvedFeatures = zeros(numFeatures, numImages, imageDim - patchDim + 1, imageDim - patchDim + 1);for imageNum = 1:numImages  for featureNum = 1:numFeatures    convolvedImage = zeros(imageDim - patchDim + 1, imageDim - patchDim + 1);    for channel = 1:imageChannels      feature = reshape(WT(featureNum,(channel-1)*patchDim*patchDim+1:channel*patchDim*patchDim),patchDim,patchDim); % 取出各通道patch      feature = flipud(fliplr(squeeze(feature)));      im = squeeze(images(:, :, channel, imageNum));      convolvedImage=convolvedImage+conv2(im,feature,'valid'); %計算卷積        end    convolvedImage=sigmoid(convolvedImage+bT(featureNum));        convolvedFeatures(featureNum, imageNum, :, :) = convolvedImage;  endendendfunction sigm = sigmoid(x)    sigm = 1./(1+exp(-x));end


計算池化

cnnPool

cnnPoolfor imageNum=1:numImages    for featureNum=1:numFeatures        for poolRow=1:convolvedDim/poolDim            offsetRow=1+(poolRow-1)*poolDim;            for poolCol=1:convolvedDim/poolDim                offsetCol=1+(poolCol-1)*poolDim;                patch=convolvedFeatures(featureNum, imageNum,offsetRow:offsetRow+poolDim-1,offsetCol:offsetCol+poolDim-1);                pooledFeatures(featureNum,imageNum,poolRow,poolCol) = mean(patch(:));            end        end    endend

歡迎參與討論並關注本部落格和微博以及知乎個人首頁後續內容繼續更新哦~

轉載請您尊重作者的勞動,完整保留上述文字以及文章連結,謝謝您的支援!



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.