[UFLDL Exercise] Convolution and Pooling

I’m learning Prof. Andrew Ng’s Unsupervised Feature Learning and Deep Learning tutorial, This is the 8th exercise, which is a simple ConvNet with Pooling process. I’ll not go through the detail of the material. More details about this exercise can be found HERE.

I’ll try to implement it using C++ and OpenCV if I have time next week.

CODE

% cnnConvolve.m
function convolvedFeatures = cnnConvolve(patchDim, numFeatures, images, W, b, ZCAWhite, meanPatch)
%cnnConvolve Returns the convolution of the features given by W and b with
%the given images
%
% Parameters:
% patchDim - patch (feature) dimension
% numFeatures - number of features
% images - large images to convolve with, matrix in the form
% images(r, c, channel, image number)
% W, b - W, b for features from the sparse autoencoder
% ZCAWhite, meanPatch - ZCAWhitening and meanPatch matrices used for
% preprocessing
%
% Returns:
% convolvedFeatures - matrix of convolved features in the form
% convolvedFeatures(featureNum, imageNum, imageRow, imageCol)
patchSize = patchDim .^ 2;
numImages = size(images, 4);
imageDim = size(images, 1);
imageChannels = size(images, 3);
 
convolvedFeatures = zeros(numFeatures, numImages, imageDim - patchDim + 1, imageDim - patchDim + 1);
 
% Instructions:
% Convolve every feature with every large image here to produce the 
% numFeatures x numImages x (imageDim - patchDim + 1) x (imageDim - patchDim + 1) 
% matrix convolvedFeatures, such that 
% convolvedFeatures(featureNum, imageNum, imageRow, imageCol) is the
% value of the convolved featureNum feature for the imageNum image over
% the region (imageRow, imageCol) to (imageRow + patchDim - 1, imageCol + patchDim - 1)
%
% Expected running times: 
% Convolving with 100 images should take less than 3 minutes 
% Convolving with 5000 images should take around an hour
% (So to save time when testing, you should convolve with less images, as
% described earlier)
% -------------------- YOUR CODE HERE --------------------
% Precompute the matrices that will be used during the convolution. Recall
% that you need to take into account the whitening and mean subtraction
% steps
 
WT = W * ZCAWhite;
bMean = b - WT * meanPatch;
% --------------------------------------------------------
 
convolvedFeatures = zeros(numFeatures, numImages, imageDim - patchDim + 1, imageDim - patchDim + 1);
for imageNum = 1:numImages
for featureNum = 1:numFeatures
% convolution of image with feature matrix for each channel
convolvedImage = zeros(imageDim - patchDim + 1, imageDim - patchDim + 1);
for channel = 1:3
% Obtain the feature (patchDim x patchDim) needed during the convolution
% ---- YOUR CODE HERE ----
offset = (channel-1) * patchSize;
feature = reshape(WT(featureNum, offset + 1 : offset + patchSize), patchDim, patchDim);
% ------------------------
% Flip the feature matrix because of the definition of convolution, as explained later
feature = flipud(fliplr(squeeze(feature)));
% Obtain the image
im = squeeze(images(:, :, channel, imageNum));
% Convolve "feature" with "im", adding the result to convolvedImage
% be sure to do a 'valid' convolution
% ---- YOUR CODE HERE ----
convOneChannel = conv2(im, feature, 'valid');
convolvedImage = convolvedImage + convOneChannel;
% ------------------------
end
 
% Subtract the bias unit (correcting for the mean subtraction as well)
% Then, apply the sigmoid function to get the hidden activation
% ---- YOUR CODE HERE ----
 
convolvedImage = convolvedImage + bMean(featureNum);
convolvedImage = sigmoid(convolvedImage);
 
% ------------------------
% The convolved feature is the sum of the convolved values for all channels
convolvedFeatures(featureNum, imageNum, :, :) = convolvedImage;
end
end
 
end
 
% Sigmoid function.
function sigm = sigmoid(x)
 
sigm = 1 ./ (1 + exp(-x));
end

 

% cnnPool.m
function pooledFeatures = cnnPool(poolDim, convolvedFeatures)
%cnnPool Pools the given convolved features
%
% Parameters:
% poolDim - dimension of pooling region
% convolvedFeatures - convolved features to pool (as given by cnnConvolve)
% convolvedFeatures(featureNum, imageNum, imageRow, imageCol)
%
% Returns:
% pooledFeatures - matrix of pooled features in the form
% pooledFeatures(featureNum, imageNum, poolRow, poolCol)
% 
numImages = size(convolvedFeatures, 2);
numFeatures = size(convolvedFeatures, 1);
convolvedDim = size(convolvedFeatures, 3);
 
pooledFeatures = zeros(numFeatures, numImages, floor(convolvedDim / poolDim), floor(convolvedDim / poolDim));
 
% -------------------- YOUR CODE HERE --------------------
% Instructions:
% Now pool the convolved features in regions of poolDim x poolDim,
% to obtain the 
% numFeatures x numImages x (convolvedDim/poolDim) x (convolvedDim/poolDim) 
% matrix pooledFeatures, such that
% pooledFeatures(featureNum, imageNum, poolRow, poolCol) is the 
% value of the featureNum feature for the imageNum image pooled over the
% corresponding (poolRow, poolCol) pooling region 
% (see http://ufldl/wiki/index.php/Pooling )
% 
% Use mean pooling here.
% -------------------- YOUR CODE HERE --------------------
 
resultDim = convolvedDim ./ poolDim;
 
for imageNum = 1 : numImages
for featureNum = 1 : numFeatures
for poolRow = 1 : resultDim
offsetRow = 1 + (poolRow - 1) * poolDim;
for poolCol = 1 : resultDim
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
end
end
 
end

 RESULT

Test dataset: Stanford STL-10 dataset

Accuracy: 80.250%

🙂

This entry was posted in Algorithm, Machine Learning and tagged , , , , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

One Comment

  1. parag ahivale
    Posted December 3, 2015 at 2:07 am | Permalink

    Hi, thanks for your detailed explanation. Since I am a beginner at convolutional neural networks, can you help me with some relevent implementations of CNN and RNN.

Post a Comment

Your email is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*