1. 程式人生 > >【UFLDL】Exercise: Convolutional Neural Network

【UFLDL】Exercise: Convolutional Neural Network

這個exercise需要完成cnn中的forward pass,cost,error和gradient的計算。需要弄清楚每一層的以上四個步驟的原理,並且要充分利用matlab的矩陣運算。大概把過程總結了一下如下圖所示:

STEP 1:Implement CNN Objective

STEP 1a: Forward Propagation

Forward Propagation主要是為了計算輸入圖片經過神經網路後的輸出,這個網路有三層:convolution->pooling->softmax(dense connected),卷積層對於每個影象用所有的模板進行卷積;pooling層對卷積層輸出的feature map取樣;softmax層根據pooling層輸出的feature預測影象的分類結果。其中convolution和pooling操作在

之前就實現過了。具體的過程可以參見上圖中Forward Pass中每層的具體操作。程式碼如下:

%%% YOUR CODE HERE %%%
%呼叫之前已經實現的函式
activations = cnnConvolve(filterDim, numFilters, images, Wc, bc);%sigmoid(wx+b)
activationsPooled = cnnPool(poolDim, activations);

% Reshape activations into 2-d matrix, hiddenSize x numImages,
% for Softmax layer
%將activationsPooled從outDim*outDim*numFilters*numImages拼接成hiddenSize*numImages的大矩陣 activationsPooled = reshape(activationsPooled,[],numImages); %% Softmax Layer % Forward propagate the pooled activations calculated above into a % standard softmax layer. For your convenience we have reshaped
% activationPooled into a hiddenSize x numImages matrix. Store the % results in probs. % numClasses x numImages for storing probability that each image belongs to % each class. probs = zeros(numClasses,numImages); %%% YOUR CODE HERE %%% h = exp(bsxfun(@plus,Wd * activationsPooled,bd)); probs = bsxfun(@rdivide,h,sum(h,1));

STEP 1b: Calculate Cost

計算梯度下降要優化的目標函式,主要分為兩部分,一部分是由於分類器輸出結果和真實結果的差異引起的誤差函式,另一部分是對權重w的正則約束。第一部分可以參考softmax regression中對損失函式的計算,第二部分就是對Wc和Wd的所有項求平方和。類似下面的公式,不過第一項中的J是softmax的cross entropy損失函式。最後要對第一項除以影象的總數,這是十分重要的,一開始我沒有除,最後得到的演算法是發散的,原因可能是第一項數值過大,直接把正則項的影響給忽略了。

程式碼:

%%% YOUR CODE HERE %%%
logp = log(probs);
index = sub2ind(size(logp),labels',1:size(probs,2));
ceCost = -sum(logp(index));
wCost = lambda/2 * (sum(Wd(:).^2)+sum(Wc(:).^2));
cost = ceCost/numImages + wCost;

STEP 1c: Backpropagation

BP演算法首先要計算各層的對最終誤差的貢獻delta。

softmax層:這一層的誤差最容易計算,只要用ground truth減去神經網路的輸出probs就可以了:

output = zeros(size(probs));
output(index) = 1;
DeltaSoftmax = probs - output;

pool層:這一層首先根據公式δ= Wδl+1 * f'(zl)(pool層沒有f'(zl)這一項)計算該層的error,此時得到一個hiddenSize*numImages的矩陣,首先利用reshape函式把error還原成一個convDim*convDim*numFilters*numImages的矩陣,在pooling操作時,pooling層一個節點的輸入是conv層2*2個節點的輸出(假設poolDim=2)如下圖所示:

所以pooling層的這個節點要將自己的error在這2*2個節點中平均分(因為使用的是mean pooling),UFLDL上面提示了可以用kron這個函式來實現,這樣如上圖所示,就可以通過pooling層一個2*2的filter對應的error計算得到convolution層一個4*4的filter對應的error了。程式碼如下:

DeltaPool = reshape(Wd' * DeltaSoftmax,outputDim,outputDim,numFilters,numImages);
DeltaUnpool = zeros(convDim,convDim,numFilters,numImages);

for imNum = 1:numImages
    for FilterNum = 1:numFilters
        unpool = DeltaPool(:,:,FilterNum,imNum);
        DeltaUnpool(:,:,FilterNum,imNum) = kron(unpool,ones(poolDim))./(poolDim ^ 2);
    end
end

convolution層:還是根據公式δ= Wδl+1 * f'(zl)來計算:

DeltaConv = DeltaUnpool .* activations .* (1 - activations);

STEP 1d: Gradient Calculation

整個cnn一共有三層:convolution->pooling->softmax(dense connected),只有convolution和softmax層有權重,分別為Wc,bc,Wd,bd。那麼就要計算目標函式J對他們的倒數以便在梯度下降中更新W和b。

Wd和bd的梯度計算:

根據下面兩個公式:

          

其中al-1對應pooling層的激勵(輸出)activitonsPooled,δl就是這一層的誤差DeltaSoftmax,程式碼如下:

Wd_grad = (1./numImages) .* DeltaSoftmax*activationsPooled'+lambda*Wd;
bd_grad = (1./numImages) .* sum(DeltaSoftmax,2);

Wc和bc的梯度計算:

還是根據上面兩個計算梯度的公式,不過麻煩就麻煩在l-1層其實是輸入的影象,所以al-1對應的是輸入的影象,那麼就得用for迴圈逐個便利影象並利用UFLDL上提供的公式計算對應梯度:

這裡為了方便,先對所有DeltaConv進行旋轉,然後再用for迴圈依次求出梯度:

%%% YOUR CODE HERE %%%
Wd_grad = (1./numImages) .* DeltaSoftmax*activationsPooled'+lambda*Wd;
bd_grad = (1./numImages) .* sum(DeltaSoftmax,2);

bc_grad = zeros(size(bc));
Wc_grad = zeros(filterDim,filterDim,numFilters);

for filterNum = 1:numFilters
    error = DeltaConv(:,:,filterNum,:);
    bc_grad(filterNum) = (1./numImages) .* sum(error(:));
end

%旋轉所有DealtaConv
for filterNum = 1:numFilters
    for imNum = 1:numImages
        error = DeltaConv(:,:,filterNum,imNum);
        DeltaConv(:,:,filterNum,imNum) = rot90(error,2);
    end
end

for filterNum = 1:numFilters
    for imNum = 1:numImages
        Wc_grad(:,:,filterNum) = Wc_grad(:,:,filterNum) + conv2(images(:,:,imNum),DeltaConv(:,:,filterNum,imNum),'valid');
    end
end
Wc_grad = (1./numImages) .* Wc_grad + lambda*Wc;

Step 2: Gradient Check

當時明明我的梯度下降沒法收斂,這一步居然通過了=。=

Step 3: Learn Parameters

這步比較簡單,根據UFLDL對隨機梯度下降的解釋,在minFuncSGD中加上衝量的影響就可以了:

%%% YOUR CODE HERE %%%
        velocity = mom*velocity+alpha*grad;
        theta = theta - velocity;

Step 4: Test

執行cnnTrain,最後準確率可以達到97%+

以上就可UFLDL上cnn的實現,最重要的是弄清楚每一層在每一個過程中需要進行的操作,我都總結在文章開頭的表格裡面了~matlab給我一個很大的感受就是矩陣的demension match,有時候知道公式是什麼樣的,但是實現起來要考慮矩陣的維度,兩個維度match的矩陣才能相乘或者相加,不過好處就是再不知道怎麼寫程式碼的時候可以結果維度match來寫程式碼。而且cnn debug起來真的好睏難,完全不知道是哪裡出了問題=。=

參考:

相關推薦

UFLDLExercise: Convolutional Neural Network

這個exercise需要完成cnn中的forward pass,cost,error和gradient的計算。需要弄清楚每一層的以上四個步驟的原理,並且要充分利用matlab的矩陣運算。大概把過程總結了一下如下圖所示: STEP 1:Implement CNN Objective STEP 1a:

TensorFlow Tutorial #02 Convolutional Neural Network

溫馨提示,TensorFlow更新的太快了,有些程式碼實現方式可能變了,但是思想還是沒有變滴,主要還是理解 原文地址 介紹 前面的教程表明,簡單的線性模型具有大約91%的分類準確度,用於識別MNIST資料集中的手寫數字。 在本教程中,我們將在TensorFlow中實現一個簡單的卷積神經網路,如果您進行一

論文閱讀Accelerating the Super-Resolution Convolutional Neural Network

開發十年,就只剩下這套架構體系了! >>>   

《Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences》

概率分布 通過 AD 最小 當前 最大化 gradient function thml Kalchbrenner’s Paper Kal的這篇文章引用次數較高,他提出了一種名為DCNN(Dynamic Convolutional Neural Network)的網絡模型,在

Convolutional Neural Network Architectures for Matching Natural Language Sentences》

cnn min 自定義 分析 map atom 優勢 code 解決 模型結構與原理 1. 基於CNN的句子建模 這篇論文主要針對的是句子匹配(Sentence Matching)的問題,但是基礎問題仍然是句子建模。首先,文中提出了一種基於CNN的句子建模網絡,如下圖:

<Convolutional Neural Network for Paraphrase Identification>

進行 種類 AR 分析 興趣 其中 向量 ras 2014年 Yin的這篇論文提出了一種叫Bi-CNN-MI的架構,其中Bi-CNN表示兩個使用Siamese框架的CNN模型;MI表示多粒度的交互特征。Bi-CNN-MI包含三個部分: 句子分析模型 (CNN-SM)

A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章筆記

方法 可能 lec pan 結果 ica repr 貢獻 tps A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK 文章地址:https://ieeexplor

HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK閱讀筆記

數據 eight 說明 enter 像素點 維數 tran vertica 通用 HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK 論文地址:h

CNN(Convolutional Neural Network)

過去 融合 geo 全局 圍棋 池化層 構造 圖片分類 動態 CNN(Convolutional Neural Network) 卷積神經網絡(簡稱CNN)最早可以追溯到20世紀60年代,Hubel等人通過對貓視覺皮層細胞的研究表明,大腦對外界獲取的信息由多層的感受

Convolutional Neural Network Architectures for Matching Natural Language Sentences

field 任務 互動 ora 計算 host 支持 side line interaction n. 互動;一起活動;合作;互相影響 capture vt.俘獲;奪取;奪得;引起(註意、想像、興趣)n.捕獲;占領;捕獲物;[計算機]捕捉 hence adv. 從此;因

PaperDeep & Cross Network for Ad Click Predictions

目錄 背景 相關工作 主要貢獻 核心思想 Embedding和Stacking層 交叉網路(Cross Network) 深度網路(Deep Network) 組合層(Combination Layer) 理論分析 多項式近似

Deep Learning 學習隨記(八)CNN(Convolutional neural network)理解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

論文學習 | 利用塊分割資訊增強壓縮視訊質量:Enhancing HEVC Compressed Videos with a Partition-Masked Convolutional Neural Network

目錄 一、亮點 二、網路 三、Mask 及其融合 四、結論 一、亮點 提出 partition-masked Convolutin Neural Network (CNN) ,用以提升 HEVC 壓縮視訊的質量。 其亮點在於:該網路利用編碼端提供的塊分割資訊,在解碼端進行質量增強。

深度學習 (三)Convolutional Neural Network

What is Deep Learning        認識任何事物之前最好了解這一事物在我們的知識認知體系中所處的位置,這樣有助於將其歸納到自己的認知體系中,產生聯絡並編製成類似於知識圖譜樣的結構,不用記住也不好忘記。

CS229 6.17 Neurons Networks convolutional neural network(cnn)

之前所講的影象處理都是小 patchs ,比如28*28或者36*36之類,考慮如下情形,對於一副1000*1000的影象,即106,當隱層也有106節點時,那麼W(1)的數量將達到1012級別,為了減少引數規模,加快訓練速度,CNN應運而生。CNN就像辟邪劍譜一樣,正常人練得很挫,一旦自宮後,就變得很厲害。

MSCNN論文解讀-A Unified Multi-scale Deep Convolutional Neural Network for Fast Object Detection

 多尺度深度卷積神經網路進行快速目標檢測: 兩階段目標檢測器,與faster-rcnn相似,分為an object proposal network and an accurate detection network. 文章主要解決的是目標大小不一致的問題,尤其是對小目標的檢測,通過多

A Convolutional Neural Network for Modelling Sentences

引言 Nal Kalchbrenner等人在2014年arXiv上的paper,原文地址:arXiv:1404.2188v1 [cs.CL] 8 Apr 2014。 自然語言處理的基礎問題在於句子的語義表示,其他特定的任務如分類等都是在語義表示的基礎上進行高層次的處理,所以如何對句子

MACNN-Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition

《Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition》是微軟亞洲研究院17年出的一篇細粒度影象識別論文,它的姊妹篇是《Look Closer to

IPFS私有網路(private network)的搭建與使用

原文地址:http://ipfser.org/2018/03/31/r35/ ipfs是否支援私有網路? 答案是:支援 今天小編就帶大家來看看ipfs的私有網路是如何搭建、使用的? 小編有意測試一下私有網路的資料傳輸情況,畢竟ipfs也更新了新的版本。所以使用了一個本地節點(小編的M

模型加速--LCNN: Lookup-based Convolutional Neural Network

本文使用查表法加速CNN網路訓練和計算,可以在嵌入式裝置終端進行CNN網路訓練 本文對每個網路層構建一個 字典 Dictionary,每個 weight filter 可以由這個字典中的某些向量線性組合得到 Fast Convolution using a