卷积特征提取与池化(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

欢迎参与讨论并关注本博客微博以及知乎个人主页后续内容继续更新哦~

转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!

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

时间: 2024-11-05 15:59:53

卷积特征提取与池化(Pooling)——处理大型图像的相关文章

卷积层,池化层等,前向/反向传播原理讲解

今天闲来无事,考虑到以前都没有好好研究过卷积层.池化层等等的前向/反向传播的原理,所以今天就研究了一下,参考了一篇微信好文,讲解如下: 参考链接:https://www.zybuluo.com/hanbingtao/note/485480 https://github.com/hanbt/learn_dl/blob/master/cnn.py 一.卷积层 (1)首先是卷积神经网络中的卷积操作: 计算公式为: 注意上式的使用场景:stride = 1 , channel = 1 我们可以将其扩展到

理解CNN卷积层与池化层计算

概述 深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长.填充方式.卷积核大小.池化层策略等都会对最终输出模型与参数.计算复杂度产生重要影响,本文将从卷积层与池化层计算这些相关参数出发,演示一下不同步长.填充方式.卷积核大小计算结果差异. 一:卷积层 卷积神经网络(CNN)第一次提出是在1997年,杨乐春(LeNet)大神的一篇关于数字OCR识别的论文,在2012年的ImageNet竞赛中CNN网络成功击败其它非DNN模型算法,从此获得学术界的关注与工业界的兴趣

第十四节,TensorFlow中的反卷积,反池化操作以及gradients的使用

反卷积是指,通过测量输出和已知输入重构未知输入的过程.在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积神经网络,没有学习训练的过程.反卷积有着许多特别的应用,一般可以用于信道均衡.图像恢复.语音识别.地震学.无损探伤等未知输入估计和过程辨识方面的问题. 在神经网络的研究中,反卷积更多的是充当可视化的作用,对于一个复杂的深度卷积网络,通过每层若干个卷积核的变换,我们无法知道每个卷积核关注的是什么,变换后的特征是什么样子.通过反卷积的还原,可以对这些问题有个清晰的可视

tf.nn的conv2d卷积与max_pool池化

tf.nn.conv2d(value,filter,strides,[...]) 对于图片来说 value :   形状通常是np.array()类型的4维数组也称tensor(张量),  (batch,height,width,channels) 可以理解为(图片样本的个数,高,宽,图片的颜色通道数) value是待卷积的数据 filter: 卷积核 -4元素元组[height,width,in_channels,out_channels],前面的3个参数和value的后面3个参数一一对应.但

卷积层和池化层

卷积神经网络是在BP神经网络的改进,与BP类似,都采用了前向传播计算输出值,反向传播调整权重和偏置:CNN与标准的BP最大的不同是:CNN中相邻层之间的神经单元并不是全连接,而是部分连接,也就是某个神经单元的感知区域来自于上层的部分神经单元,而不是像BP那样与所有的神经单元相连接.CNN的有三个重要的思想架构: 局部区域感知 权重共享 空间或时间上的采样

tensorflow 卷积/反卷积-池化/反池化操作详解

Plese see this answer for a detailed example of how tf.nn.conv2d_backprop_input and tf.nn.conv2d_backprop_filter in an example. In tf.nn, there are 4 closely related 2d conv functions: tf.nn.conv2d tf.nn.conv2d_backprop_filter tf.nn.conv2d_backprop_i

图像平均池化 pytorch库中的平均池化

一. 池化简介 平均池化:将图片按照固定大小网格分割,网格内的像素值取网格内所有像素的平均值. 池化:使用均等大小的网格将图片分割,并求网格内代表值的过程. 池化是卷积神经网络(convolutional neural network)中非常重要的处理方式,能够有效地降低图像的维度. 平均池化定义: 二. 将输入图像用4*4网格做平均池化 import cv2 import numpy as np # average pooling def average_pooling(img, G=4):

ufldl学习笔记与编程作业:Feature Extraction Using Convolution,Pooling(卷积和池化抽取特征)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 学习链接: http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution

Spatial pyramid pooling (SPP)-net (空间金字塔池化)笔记(转)

在学习r-cnn系列时,一直看到SPP-net的身影,许多有疑问的地方在这篇论文里找到了答案. 论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 转自:http://blog.csdn.net/xzzppp/article/details/51377731 另可参考:http://zhangliliang.com/2014/09/13/paper-note-sppnet/ http:/