卷积和池化matlab 实现,UFLDL新版教程与编程练习(七):Convolution and Pooling(卷积和池化)...

2023-11-16

UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!

我这里找不到新版对应这块的中文翻译了,-_-,趁早写一下,否则又没感觉了!

第七节是:Convolution and Pooling(卷积和池化)

卷积(Convolution)

之前的多层卷积网络是Fully Connected Networks,而卷积神经网络是Locally Connected Networks,现在CNN这么火,想必提到卷积大家都会想到类似这种的图吧:

[图片上传失败...(image-cb3ff4-1565444895291)]

实际上,数学中离散变量的二维卷积是这样的;

math?formula=C(j%2C%20k)%3D%5Csum_%7Bp%7D%20%5Csum_%7Bq%7D%20A(p%2C%20q)%20B(j-p%2B1%2C%20k-q%2B1)

而我们可以利用matlab里面的conv2函数快捷地实现二维卷积操作(注意要先翻转W 180°),通过卷积我们就可以让一张

math?formula=r%20%5Ctimes%20c大图片

math?formula=x_%7B%5Ctext%20%7Blarge%7D%7D,用小的

math?formula=a%20%5Ctimes%20b卷积核

math?formula=%5Cboldsymbol%7Bx%7D_%7B%5Ctext%20%7B%20small%20%7D%7D滑过,就可以得到大小为

math?formula=(r-a%2B1)%20%5Ctimes(c-b%2B1)的特征图了,下面就是我的cnnConvolve.m代码,其中还有一段利用GPU运算的,被我注释掉了

function convolvedFeatures = cnnConvolve(filterDim, numFilters, images, W, b)

% convolvedFeatures = cnnConvolve(filterDim, numFilters, convImages, W, b);

% in cnnExercise.m 8 100 28*28*8 8*8*100 100*100

%cnnConvolve Returns the convolution of the features given by W and b with

%the given images

%

% Parameters:

% filterDim - filter (feature) dimension

% numFilters - number of feature maps

% images - large images to convolve with, matrix in the form

% images(r, c, image number)

% W, b - W, b for features from the sparse autoencoder

% W is of shape (filterDim,filterDim,numFilters)

% b is of shape (numFilters,1)

%

% Returns:

% convolvedFeatures - matrix of convolved features in the form

% convolvedFeatures(imageRow, imageCol, featureNum, imageNum)

numImages = size(images, 3);

imageDim = size(images, 1); % 方阵

convDim = imageDim - filterDim + 1; % 28 - 8 + 1 = 21

convolvedFeatures = zeros(convDim, convDim, numFilters, numImages);

% Instructions:

% Convolve every filter with every image here to produce the

% (imageDim - filterDim + 1) x (imageDim - filterDim + 1) x numFeatures x numImages

% matrix convolvedFeatures, such that

% convolvedFeatures(imageRow, imageCol, featureNum, imageNum) is the

% value of the convolved featureNum feature for the imageNum image over

% the region (imageRow, imageCol) to (imageRow + filterDim - 1, imageCol + filterDim - 1)

%

% Expected running times:

% Convolving with 100 images should take less than 30 seconds

% Convolving with 5000 images should take around 2 minutes

% (So to save time when testing, you should convolve with less images, as

% described earlier)

for imageNum = 1:numImages

for filterNum = 1:numFilters

% convolution of image with feature matrix

convolvedImage = zeros(convDim, convDim);

% Obtain the feature (filterDim x filterDim) needed during the convolution

%%% YOUR CODE HERE %%%

filter = squeeze(W(:,:,filterNum));

% Flip the feature matrix because of the definition of convolution, as explained later

filter = rot90(squeeze(filter),2); % squeeze 删除单一维度 二维数组不受 squeeze 的影响

% Obtain the image

im = squeeze(images(:, :, imageNum));

% Convolve "filter" with "im", adding the result to convolvedImage

% be sure to do a 'valid' convolution

%%% YOUR CODE HERE %%%

convolvedImage = conv2(im,filter,'valid'); % 21*21

% Add the bias unit

% Then, apply the sigmoid function to get the hidden activation

%%% YOUR CODE HERE %%%

convolvedImage = convolvedImage + b(filterNum);

convolvedImage = sigmoid(convolvedImage);

convolvedFeatures(:, :, filterNum, imageNum) = convolvedImage;

end

end

%%%%%%%%%%%%%%%%%%% use gpu(can comment) %%%%%%%%%%%%%

% for imageNum = 1:numImages

% for filterNum = 1:numFilters

%

% % convolution of image with feature matrix

% convolvedImage = zeros(convDim, convDim);

% gpu_convolvedImage = gpuArray(convolvedImage);

%

% % Obtain the feature (filterDim x filterDim) needed during the convolution

%

% %%% YOUR CODE HERE %%%

% filter = squeeze(W(:,:,filterNum));

% % Flip the feature matrix because of the definition of convolution, as explained later

% filter = rot90(squeeze(filter),2); % squeeze 删除单一维度 二维数组不受 squeeze 的影响

%

% % Obtain the image

% im = squeeze(images(:, :, imageNum));

%

% % Convolve "filter" with "im", adding the result to convolvedImage

% % be sure to do a 'valid' convolution

%

% %%% YOUR CODE HERE %%%

% gpu_filter = gpuArray(filter);

% gpu_im = gpuArray(im);

% gpu_convolvedImage = conv2(gpu_im,gpu_filter,'valid');

% % Add the bias unit

% % Then, apply the sigmoid function to get the hidden activation

%

% %%% YOUR CODE HERE %%%

% convolvedImage = gpu_convolvedImage + b(filterNum);

% convolvedImage = sigmoid(convolvedImage);

%

% convolvedFeatures(:, :, filterNum, imageNum) = gather(convolvedImage);

% end

% end

end

池化(Pooling)

下面这张动图很好解释了池化操作:

[图片上传失败...(image-359be6-1565444895291)]

池化可以降低特征维数,降低计算量吧!下面是我的cnnPool.m代码,用了mean函数和conv2函数都可以实现池化,我把其中一种注释了:

function pooledFeatures = cnnPool(poolDim, convolvedFeatures)

% 3 21*21*100*8

%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); % 7*7*100*8

% 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 %%%

%% METHOD1:Using mean to pool

% for imageNum = 1:numImages

% for filterNum = 1:numFilters

% pooledImage = zeros(convolvedDim / poolDim, convolvedDim / poolDim);

% im = convolvedFeatures(:,:,filterNum, imageNum);

% for i=1:(convolvedDim / poolDim)

% for j=1:(convolvedDim / poolDim)

% pooledImage(i,j) = mean(mean(im((i-1)*poolDim+1:i*poolDim,(j-1)*poolDim+1:j*poolDim)));

% end

% end

%

% pooledFeatures(:,:,filterNum, imageNum) = pooledImage;

% end

% end

%%======================================================================

%% METHOD2:Using conv2 as well to pool

% (if numImages is large,this method may be better,can use "gpuArray.conv2"to speed up!)

pool_filter = 1/(poolDim*poolDim) * ones(poolDim,poolDim);

for imageNum = 1:numImages

for filterNum = 1:numFilters

pooledImage = zeros(convolvedDim / poolDim, convolvedDim / poolDim);

im = convolvedFeatures(:,:,filterNum, imageNum);

for i=1:(convolvedDim / poolDim)

for j=1:(convolvedDim / poolDim)

temp = conv2(im,pool_filter,'valid');

pooledImage(i,j) = temp(poolDim*(i-1)+1,poolDim*(j-1)+1);

end

end

pooledFeatures(:,:,filterNum, imageNum) = pooledImage;

end

end

end

运行结果(这个练习偏简单,只是测试一下,为之后卷积神经网络打铺垫的):

13405989dd87

卷积池化结果

有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卷积和池化matlab 实现,UFLDL新版教程与编程练习(七):Convolution and Pooling(卷积和池化)... 的相关文章

  • Python界面 可视化开发(python3+PyQt5+Qt Designer)

    前言 以前制作一个Python窗体界面 我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的 今天朋友问我有没有Python窗体的设计工具 用鼠标拖拖 就能完成窗体设计 我查了查相关资料 果然有一款好用的工具 Qt Designe
  • Q3.Numpy_统计分析-排序、去重和重复、搜索和计数函数

    Part 1 排序函数 numpy排序方式主要分为直接排序和间接排序两种 直接排序是指对数值直接进行排序 间接排序是指根据一个或多个键对数据集进行排序 在numpy中 直接排序常用sort 函数 间接排序常用argsort 函数和lexso
  • 官方YOLOV5的torch模型->ONNX模型->RKNN模型

    1 环境配置 1 1 RKNN Toolkit2的环境配置 下载RKNN Toolkit2 git clone https github com rockchip linux rknn toolkit2 git 打开一个终端命令行窗口 安装
  • C++primer(第五版)---14章(重载运算与类型转换)

    目录 编辑 重载运算符的基本概念 调用重载运算符 而有些运算符不应该被重载 应该保持与内置类型一致的含义 是否成员成员函数 重载io lt lt 和 gt gt 运算符 重载 lt lt 运算符 重载 gt gt 运算符 算术运算符 关系运
  • python英文(无空格)文本分词模块wordninja使用

    在NLP中 数据清洗与分词往往是很多工作开始的第一步 大多数工作中只有中文语料数据需要进行分词 现有的分词工具也已经有了很多了 这里就不再多介绍了 英文语料由于其本身存在空格符所以无需跟中文语料同样处理 如果英文数据中没有了空格 那么应该怎
  • react在移动端的自适应布局

    1 移动端基本可以无阻碍的进行flex的弹性布局 这边对flex就不进行深究 2 可以进行依据窗口进行vw vh vmin vmax单位的布局 1 vw vh vmin vmax 是一种视窗单位 也是相对单位 它相对的不是父节点或者页面的根
  • Android USB Camera(1) : 调试记录

    1 前言 前段时间调试了一个uvc摄像头 这里做下记录 硬件平台为mt6735 软件平台为android 5 0 2 底层配置 UVC全称是usb video class 一种usb视频规范 所有遵循uvc协议的摄像头都不需要安装额外的驱动
  • integer conversion resulted in a change of sign

    Type 69 D integer conversion resulted in a change of sign MDK 出现 68 D integer conversion resulted in a change of sign 在K
  • 三行代码实时追踪你的手,只要有浏览器就够了

    栗子 发自 凹非寺 量子位 报道 公众号 QbitAI Are You OK O K 人脸不管做了多么一言难尽的表情 五官也不太会四处乱跑 手就不一样了 手势百媚千娇 镜头看到的画面就百媚千娇 所以 AI怎么识别手呢 一位叫做Victor
  • Java获取月份天数错误

    之前编写获取日期函数如下 获取某年某月有多少天 return 该月的天数 public static int getDaysAboutMonth int year int month Calendar c Calendar getInsta
  • 电力电子转战数字IC——我的IC面试(2022.10.14更新)

    目录 感谢信 HKWS10 14面试 25mins JXC10 13面试 30mins JDSK9 23面试 42mins 快速的自我介绍 介绍一下这个MCDF的项目 你这里写SV搭建的验证环境 和UVM搭建的有什么区别吗 你这里写了覆盖率
  • 正视周期,创业在衰退中砥砺前行

    比衰退更重要的是 早期投资机构正在面临结构性机遇 数科星球原创 作者丨苑晶 编辑丨大兔 周期 犹如一只隐形的手 在2023年影响着芸芸众生 从经济周期 行业周期再到货币周期 这个隐形的手牵动着消费者需求 产业链变迁 政策变动等多种因素 亦牵
  • 12.SpringBoot整合mybatis实现插入操作

    本文基于10 springboot整合mybatis环境 默认环境配置好的 下面进入正题 首先查看以下数据库表有什么内容 然后 在EmpMapper中定义插入方法 并在emp xml中加入insert语句 这里推荐使用navicat复制其中
  • 概率图论:了解概率分布、概率独立性和随机化

    作者 禅与计算机程序设计艺术 概率图模型 Probabilistic Graphical Model PGM 是现代统计学习中的一个重要工具 它通过描述变量间的依赖关系和概率分布来对复杂系统进行建模 概率图模型由两部分组成 一是概率模型 它
  • QPoint与QPointF的区别

    QPointF类使用浮点精度定义平面中的点 QPoint类使用整数精度定义平面中的点
  • C语言链表嵌套链表学生成绩管理系统

    一阶段考核标准 用C语言链表嵌套链表学生成绩管理系统 链表A 每个节点存放一个新的链表B1 B2 B3 B4 B5的头结点 场景 一个年级 相当链表A 该年级5个班 每个班5个人 相当于链表B1 B5 做一个学生成绩管理系统学生成绩有语文
  • java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

    工程项目管理软件 工程项目管理系统 对建设工程项目管理组织建设 项目策划决策 规划设计 施工建设到竣工交付 总结评估 运维运营 全过程 全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一 系统管理 1 数据字典 实现对数据字典标签
  • Java中transient关键字的详细总结

    目录 一 概要介绍 1 序列化 2 为什么要用transient关键字 3 transient的作用 二 transient使用总结 三 使用场景 一 概要介绍 本文要介绍的是Java中的transient关键字 transient是短暂的
  • the left operand of ** is a garbage value

    CapLocation location 0 if segmentedControl tag SegmentControlTag if segmentIndex 0 location CapLeft else if segmentIndex

随机推荐

  • 最全的前端性能优化手段回答

    前端性能优化手段 参考答案 前端性能优化手段从以下几个方面入手 加载优化 执行优化 渲染优化 样式优化 脚本优化 1 加载优化 减少HTTP请求 缓存资源 压缩代码 无阻塞 首屏加载 按需加载 预加载 压缩图像 减少Cookie 避免重定向
  • 时序预测模型汇总

    时序预测模型 一 自回归 AR 在 AR 模型中 我们使用变量过去值的线性组合来预测感兴趣的变量 术语自回归表明它是变量对自身的回归 二 移动平均模型 MA 与在回归中使用预测变量的过去值的 AR 模型不同 MA 模型在类似回归的模型中关注
  • 三角函数的向量表示的原理计算

    在 电路 中 三相电源经常用复数或者是向量来表示 但是与我们初高中熟知的空间向量不同 这里的三相交流电是一种时间向量 由于采用的形式是正弦形式 使得其也可以用空间向量中的平行四边形原则来进行计算合成 下面将介绍一下正弦量可以用向量表示的原理
  • 生成tensorrt引擎错误记录-yolov5

    warning nvinfer1 Dims type is deprecated Wdeprecated declarations note TRT DEPRECATED DimensionType type MAX DIMS lt The
  • c++ virtual 关键字 override 关键字

    文章目录 1 什么是virtual 2 为什么需要 3 通常用在什么情形 4 延伸 虚函数 纯虚函数 override 关键字 9 问题汇总 9 1 非虚函数和虚函数都可以重写 那区别是啥 9 2 基类虚函数 纯虚函数 子类有没有 over
  • MS5543单通道、16位、串行通信、高速ADC转换芯片

    产品简述 MS5543 是一款单通道 16 位 串行输入 电压输出的数模 转换器 采用 2 7V 至 5 5V 单电源供电 输出范围为 0V 至 V REF 在输出范围内保证单调性 在温度范围为 40 C 至 85 C 能够提供 1LSB
  • linux设备驱动归纳总结(四):3.抢占和上下文切换

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 上一节介绍了进程调度的一些基本概念 并简单介绍了在没有抢占的情况下
  • 生产环境使用HBase,你必须知道的最佳实践

    需要关注的一些最佳实践经验 Schema设计七大原则 1 每个region的大小应该控制在10G到50G之间 2 一个表最好保持在 50到100个 region的规模 3 每个cell最大不应该超过10MB 如果超过 应该有些考虑业务拆分
  • Java中存储金额用什么数据类型

    文章目录 1 抛砖引玉 2 加减乘除 3 大小比较 4 小数位数及四舍五入规则 1 抛砖引玉 在给自己做一个小的Java记账小程序的时候 对金额的处理时必不可少的 一开始选择的是float数据类型 在数据库中 存储金额的数据字段也是floa
  • 二进制转16进制字符串和16进制字符串转二进制的C和JAVA实现

    二进制转16进制字符串和16进制字符串转二进制的C语言实现 二进制转16进制字符串 长度会翻倍 void ByteToHexStr const unsigned char source char dest int sourceLen 16进
  • 《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.17集群(多主多从)》

    一 部署架构图 1 架构图如下所示 2 部署流程图如下所示 二 环境信息 1 部署规划 主机名 K8S版本 系统版本 内核版本 IP地址 备注 k8s master 63 1 24 17 Ubuntu 20 04 5 LTS 5 15 0
  • 【QT】判断鼠标按键

    代表按键类型的枚举变量 enum Qt MouseButton Qt NoButton 0x00000000 Qt AllButtons 0x07ffffff Qt LeftButton 0x00000001 Qt RightButton
  • 12306验证码识别 --- 2017-12

    1 附件中包含12306查询验证码识别客户端和所需要测试的样本图片 2 模型正确率95 以上 3 操作方式 3 1 解压里面的Client zip 找到里面的user client exe可执行文件 3 2 点击里面的browse按钮进行选
  • unity基本知识点2

    一 把图片打包成图集 1 全选图片 把texture type改成sprite 2DandUI Packing Tag是打包标签 给想打包的图片写上统一的标签才可打包 2 edit project setting editor里inspec
  • 测试人:“躺平?不可能的“, 盘点测试人在职场的优势

    之前有这么一个段子 有人喜欢创造世界 他们做了程序员 有人喜欢拯救世界 他们做了测试员 近几年 测试工程师在企业究竟是怎么样的发展 随着企业对于用户体验的满意度越来越重视 更加推动了软件测试工程师这个岗位的需求度 接下来 我们从4个纬度来分
  • Envoy源码分析之ThreadLocal

    ThreadLocal机制 Envoy中的ThreadLocal机制其实就是我们经常说的线程本地存储简称TLS Thread Local Storage 顾名思义通过TLS定义的变量会在每一个线程专有的存储区域存储一份 访问TLS的时候 其
  • 后台管理系统布局以及跳转,点击菜单局部刷新,右侧显示对应界面

    完整版教程 https blog csdn net Lining s article details 117676170 1 整体布局如下 右侧菜单的html 代码 使用了Thymeleaf 模版 这是左测的菜单栏 左侧的所有菜单最外层是一
  • clang(llvm)命令调用android NDK 编译C应用

    在window下载的android NDK解压后 可以用如下命令 安装NDK独立编译工具 这样再用命令时不用带一把参数了 D Program Files python27 python make standalone toolchain p
  • 在asp中数据库的连接

    其中数据库bbs mdb有张friend 的表
  • 卷积和池化matlab 实现,UFLDL新版教程与编程练习(七):Convolution and Pooling(卷积和池化)...

    UFLDL是吴恩达团队编写的较早的一门深度学习入门 里面理论加上练习的节奏非常好 每次都想快点看完理论去动手编写练习 因为他帮你打好了整个代码框架 也有详细的注释 所以我们只要实现一点核心的代码编写工作就行了 上手快 我这里找不到新版对应这