虽然pool也能通过比较naive的方法来实现,但是效率相对来说比较低,因此我通过conv2来实现,然后间隔取样,效率较高。
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(imageRow, imageCol, featureNum, imageNum)
%
% Returns:
% pooledFeatures - matrix of pooled features in the form
% pooledFeatures(poolRow, poolCol, featureNum, imageNum)
%
numImages = size(convolvedFeatures, 4);
numFilters = size(convolvedFeatures, 3);
convolvedDim = size(convolvedFeatures, 1);
pooledFeatures = zeros(convolvedDim / poolDim, ...
convolvedDim / poolDim, numFilters, numImages);
% Instructions:
% Now pool the convolved features in regions of poolDim x poolDim,
% to obtain the
% (convolvedDim/poolDim) x (convolvedDim/poolDim) x numFeatures x numImages
% matrix pooledFeatures, such that
% pooledFeatures(poolRow, poolCol, featureNum, imageNum) is the
% value of the featureNum feature for the imageNum image pooled over the
% corresponding (poolRow, poolCol) pooling region.
%
% Use mean pooling here.
%%% YOUR CODE HERE %%%
for imageNum = 1:numImages
for filterNum = 1:numFilters
pooledFeature = zeros(convolvedDim / poolDim , convolvedDim / poolDim);
pooledFeature = conv2(convolvedFeatures(:,:,filterNum,imageNum),ones(poolDim,poolDim),'valid')/(poolDim*poolDim);
pooledFeature = pooledFeature(1:poolDim:end,1:poolDim:end);
pooledFeatures(:,:,filterNum,imageNum) = pooledFeature(:,:);
end
end
end