Asked by Kannan U V
on 5 Jul 2018

If I were to implement just the max pooling operation on an image as mentioned in the following page https://www.quora.com/What-is-max-pooling-in-convolutional-neural-networks What is the most efficient way of computing it without going into for loops

Answer by Kannan U V
on 6 Jul 2018

Accepted Answer

The following does the trick

fun = @(block_struct) max(block_struct.data(:));

b = blockproc (a, [X Y], fun);

Matt J
on 6 Jul 2018

But it is not very efficient. Compare:

a=rand(5000);

X=4; Y=4; %window sizes

tic

fun = @(block_struct) max(block_struct.data(:));

b = blockproc (a, [X Y], fun);

toc

%Elapsed time is 19.764354 seconds.

tic

b=sepblockfun(a,[X,Y],'max');

toc

%Elapsed time is 0.092457 seconds.

It is probably in fact the least efficient approach you could use. Even a double for-loop is faster:

tic;

[m,n]=size(a);

ex=ones(1,m/X)*X;

ey=ones(1,n/Y)*Y;

ac=mat2cell(a,ex,ey);

for i=1:m/X

for j=1:n/Y

ac{i,j}=max(ac{i,j}(:));

end

end

b=cell2mat(ac);

toc

%Elapsed time is 6.203763 seconds.

Sign in to comment.

Answer by Matt J
on 6 Jul 2018

Edited by Matt J
on 6 Jul 2018

What is the most efficient way of computing it without going into for loops

X=2; Y=2; %window sizes

maxpool=sepblockfun(yourImage,[X,Y],'max');

This assumes the image dimensions m,n are evenly divisible by X,Y respectively. Otherwise, you must pad the image to make it so.

Kannan U V
on 6 Jul 2018

Thanks for your time and answer. It looks like the following does the trick

fun = @(block_struct) max(block_struct.data(:));

b = blockproc (a, [X Y], fun);

Sign in to comment.

Answer by Anton Semechko
on 5 Jul 2018

Edited by Anton Semechko
on 5 Jul 2018

Here is an example:

% Sample image

im=imread('cameraman.tif'); % sample image

% 4 pixels comprising non-overlapping 2-by-2 neighbourhoods

im_nw=im(1:2:end,1:2:end);

im_sw=im(2:2:end,1:2:end);

im_se=im(2:2:end,2:2:end);

im_ne=im(1:2:end,2:2:end);

% Select pixel with maximum intensity

im_max=max(cat(3,im_nw,im_sw,im_se,im_ne),[],3);

% Visualize

figure('color','w')

ha=subplot(1,2,1);

imshow(im,imref2d(size(im)))

title(ha,'original','FontSize',20)

ha=subplot(1,2,2);

imshow(im_max,imref2d(size(im_max)))

title(ha,'2x2 max-pool','FontSize',20)

Note that even though two images appear to have the same size when visualized using 'imshow', the dimensions of im_max are half that of im. Recursive application of 2-by-2 max-pool will result in downsampled images with sizes 1/2, 1/4, 1/8, etc. of the original image.

Kannan U V
on 5 Jul 2018

Thanks for your time and answer. I am looking for variable X, Y window sizes too.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.