【patch】卷积特征提取与池化(Pooling)——处理大型图像

在之前的章节中,我们已经很好地解决了手写体识别问题(维数为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;%等效W
bT = 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;
  end
end
end
function sigm = sigmoid(x)
    sigm = 1./(1+exp(-x));
end

 

  • 计算池化

cnnPool

cnnPool
for 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
    end
end


转载:https://blog.csdn.net/ycheng_sjtu/article/details/38662785 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值