计算机视觉入门 3)最大池化

目录

  • 一、最大池化
    • 最大池化进行压缩
    • 平移不变性
  • 二、代码示例
    • 步骤2:图像读取转换
    • 步骤2:Filter & ReLU
    • 步骤3:Pool


一、最大池化

最大池化进行压缩

在Keras中,通过一个 MaxPool2D 层,将压缩步骤添加到之前的模型中:

from tensorflow import keras
from tensorflow.keras import layersmodel = keras.Sequential([layers.Conv2D(filters=64, kernel_size=3), # 激活函数为 Nonelayers.MaxPool2D(pool_size=2),# 后续添加更多层
])

MaxPool2D层很像Conv2D层,不同之处在于它使用了一个简单的最大函数而不是卷积核,pool_size参数类似于kernel_size。然而,MaxPool2D层不像卷积层的卷积核中那样有任何可训练的权重。

让我们再次看一下上一节的特征提取图。记住,MaxPool2D压缩步骤。
特征提取过程的示例。

见上图,在应用ReLU函数(Detect)之后,特征图会出现很多“死区”,即大面积仅包含0的区域(图像中的黑色区域)。如果必须在整个网络中保留这些0激活,将会增加模型的大小,而没有添加太多有用的信息。相反,我们希望将特征图进行压缩,只保留最有用的部分 —— 即特征本身。

这实际上就是最大池化的作用。最大池化采用原始特征图中的一小块激活,并将它们替换为该块中的最大激活值。

最大池化用块中的最大值替换该块。

当应用在ReLU激活之后,它具有“加强”特征的效果。池化步骤增加了活动像素与零像素的比例。

平移不变性

我们称零像素为“不重要”。这是否意味着它们完全不携带任何信息?实际上,零像素携带着位置信息。空白像素仍然在图像中定位特征。当MaxPool2D移除一些像素时,它也会移除特征图中的一些位置信息。这使得卷积网络具有一种称为平移不变性的属性。这意味着带有最大池化的卷积网络往往不会根据特征在图像中的位置来区分它们。

观察当我们反复应用最大池化到下面的特征图时会发生什么。

Pooling tends to destroy positional information.

原始图像中的两个点在经过重复池化后变得无法区分。换句话说,池化破坏了一些位置信息。由于网络在特征图中无法区分它们,因此也无法在原始图像中区分它们:它对于这种位置的差异已经变得不变

事实上,池化只会在网络小距离上产生平移不变性,就像图像中的两个点一样。开始距离较远的特征在经过池化后仍然保持分开;只是一些位置信息丢失了,但并不是全部。

But only over small distances. Two dots far apart stay separated

特征之间位置上小的差异的这种不变性对于图像分类器来说是一个很好的特性。由于视角或构图的差异,同一种特征可能位于原始图像的不同部分,但我们仍然希望分类器能够识别它们是相同的。因为这种不变性内置在网络中,我们可以使用更少的训练数据:我们不再需要教它忽略这种差异。这使得卷积网络在效率上比仅使用密集层的网络具有很大的优势。

二、代码示例

步骤2:图像读取转换

import numpy as np
from itertools import product
import tensorflow as tf
import matplotlib.pyplot as plt
import warnings plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',titleweight='bold', titlesize=18, titlepad=10)
plt.rc('image', cmap='magma')
warnings.filterwarnings("ignore") # to clean up output cellsdef show_kernel(kernel, label=True, digits=None, text_size=28):kernel = np.array(kernel)if digits is not None:kernel = kernel.round(digits)cmap = plt.get_cmap('Blues_r')plt.imshow(kernel, cmap=cmap)rows, cols = kernel.shapethresh = (kernel.max()+kernel.min())/2if label:for i, j in product(range(rows), range(cols)):val = kernel[i, j]color = cmap(0) if val > thresh else cmap(255)plt.text(j, i, val, color=color, size=text_size,horizontalalignment='center', verticalalignment='center')plt.xticks([])plt.yticks([])image_path = 'car_feature.jpg'
image = tf.io.read_file(image_path)
image = tf.io.decode_jpeg(image)kernel = tf.constant([[-1, -1, -1],[-1,  8, -1],[-1, -1, -1],
], dtype=tf.float32)image = tf.image.convert_image_dtype(image, dtype=tf.float32)
image = tf.expand_dims(image, axis=0)
kernel = tf.reshape(kernel, [*kernel.shape, 1, 1])

步骤2:Filter & ReLU

# Filter step
image_filter = tf.nn.conv2d(input=image,filters=kernel,# we'll talk about these two in the next lesson!strides=1,padding='SAME'
)# Detect step
image_detect = tf.nn.relu(image_filter)plt.figure(figsize=(12, 6))
plt.subplot(131)
plt.imshow(tf.squeeze(image), cmap='gray')
plt.axis('off')
plt.title('Input')
plt.subplot(132)
plt.imshow(tf.squeeze(image_filter))
plt.axis('off')
plt.title('Filter')
plt.subplot(133)
plt.imshow(tf.squeeze(image_detect))
plt.axis('off')
plt.title('Detect')
plt.show();

在这里插入图片描述

步骤3:Pool


image_condense = tf.nn.pool(input=image_detect, # image in the Detect step abovewindow_shape=(2, 2),pooling_type='MAX',# we'll see what these do in the next lesson!strides=(2, 2),padding='SAME',
)image_condense2 = tf.nn.pool(input=image_detect, # image in the Detect step abovewindow_shape=(3, 3),pooling_type='MAX',# we'll see what these do in the next lesson!strides=(2, 2),padding='SAME',
)plt.figure(figsize=(12, 6))
plt.subplot(131)
plt.imshow(tf.squeeze(image_detect))
plt.axis('off')
plt.title('Detect')
plt.subplot(132)
plt.imshow(tf.squeeze(image_condense))
plt.axis('off')
plt.title('Pool')
plt.subplot(133)
plt.imshow(tf.squeeze(image_condense2))
plt.axis('off')
plt.title('Pool2')
plt.show();

在这里插入图片描述
图像由左到右,由于池化压缩,图片逐步模糊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑找不到MSVCR120.dll怎么办?MSVCR120.dll是什么?

在我们的日常生活和工作中,电脑故障是难以避免的问题。而MSVCR120.dll文件是Windows系统中的一个重要组件,如果出现损坏或丢失,可能会导致程序无法正常运行,这个问题可能是由于系统文件损坏、病毒感染等原因导致的。因此&#xff…

Day17-Node后端身份认证-JWT

Day17-Node后端身份验证 一 密码加密 1 MD5加密 创建MD5.js//node提供了一个内置模块crypto用于密码加密 const crypto = require("crypto")module.exports.getMd5 = function(password){const md5

记录一次wordpress项目的发布过程

背景:发布一套已完成的代码到线上,有完整的代码包,sql文件,环境是linux 宝塔。无wordpress相关经验。 过程:正常的发布代码 问题1:访问自己的域名后跳转到别的域名。 解决: 修改数据表wp_optio…

Apipost中自定义接口字段如何配置

Apipost项目设置中可以配置接口文档中的自定义接口字段,创建状态码字典。分享分档时会展示到文档页面 状态码字典 在状态码字典中可以自定义状态码即其含义 自定义的状态码会在分享的API文档中展示 接口属性 接口属性中可以自定义接口和接口文档展示字段&#xf…

MySQL索引

目录 一、什么是索引 二、索引的原理 三、优缺点 四、分类 1、聚簇索引--顺序IO 2、非聚簇索引--随机IO 五、索引的设计原则 六、创建索引 1、创建表时创建索引 2、在已经存在的表上创建索引 3、使用ALTER TABLE语句来创建索引 1)普通索引 2)唯一性索引 …

2308C++协程流程4

参考 #include <协程> #include "简异中.cpp" //用来中文定义的.构 任务{构 承诺型{任务 取中(){中{协柄<承诺型>::从承诺(*本)};}从不挂起 初挂起(){中{};}从不挂起 终挂起()无异{中{};}空 中空(){ 输出<<"取协程结果\n"; }//5空 对异…

蓝奥声智能工业安全用电监测与智慧能源解决方案

能源管理变得越来越重要。如今&#xff0c;能源成本已成为国内预算的核心因素&#xff0c;因此用电监控对大多数现代企业来说都很重要。许多企业在日常能源消耗监控中面临着一些挑战&#xff0c;因为它们的规模庞大&#xff0c;基础设施多样化&#xff0c;灵活性低&#xff0c;…

前端框架学习-React(一)

React 应用程序是由组件组成的。 react 程序是用的jsx语法&#xff0c;使用这种语法的代码需要由babel进行解析&#xff0c;解析成js代码。 jsx语法&#xff1a; 只能返回一个根元素 所有的标签都必须闭合&#xff08;自闭和或使用一对标签的方式闭合&#xff09; 使用驼峰式…

Java之包,权限修饰符,final关键字详解

包 2.1 包 包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术&#xff0c;不同的技术类放在不同的包下&#xff0c;方便管理和维护。 在IDEA项目中&#xff0c;建包的操作如下&#xff1a; 包名的命名规范&#xff1a; 路径名.路径名.xxx.xxx // 例如&#xff…

sql数据导出到excel

一、打开Navicat Premium 12 二、导出

R语言处理缺失数据(1)-mice

#清空 rm(listls()) gc()###生成模拟数据### #生成100个随机数 library(magrittr) set.seed(1) asd<-rnorm(100, mean 60, sd 10) %>% round #平均60&#xff0c;标准差10 #将10个数随机替换为NA NA_positions <- sample(1:100, 10) asd[NA_positions] <- NA #转…

ClickHouse(二十一):Clickhouse SQL DDL操作-临时表及视图

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

大模型之BloomLLAMA----SFT(模型微调)

0. 简介 随着chatgpt的爆火&#xff0c;最近也有很多大模型在不断地出现&#xff0c;比如说Bloom系列以及以LLAMA为基础的ziya和baichuan。这些模型相较于chatglm来说&#xff0c;更加具有发展前景&#xff0c;因为其是完全可商用&#xff0c;并可以不断迭代更新的。最近作者在…

面试题 16.11. 跳水板

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 16.11. 跳水板 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 使用哈希表记录所有可能结果&#xff0c;然后再将哈希表中的数据放入数组中&#xff0c;最后对数组进行排序即可。 解题…

Unrecognized Hadoop major version number: 3.0.0-cdh6.3.2

一.环境描述 spark提交job到yarn报错&#xff0c;业务代码比较简单&#xff0c;通过接口调用获取数据&#xff0c;将数据通过sparksql将数据写入hive中&#xff0c;尝试各种替换hadoop版本&#xff0c;最后拿下 1.hadoop环境 2.项目 pom.xml spark-submit \ --name GridCorr…

数据结构算法--4堆排序

堆排序过程: >建立堆(大根堆) >得到堆顶元素&#xff0c;为最大元素 >去掉堆顶&#xff0c;将堆最后一个元素放到堆顶&#xff0c;此时可通过一次调整使堆重新有序 >堆顶元素为第二大元素 >重复步骤3&#xff0c;直到堆变空 此时是建立堆后的大根堆模型 将…

ThinkPHP6.0+ 使用Redis 原始用法

composer 安装 predis/predis 依赖&#xff0c;或者安装php_redis.dll的扩展。 我这里选择的是predis/predis 依赖。 composer require predis/predis 进入config/cache.php 配置添加redis缓存支持 示例&#xff1a; <?php// -----------------------------------------…

国内常见的几款可视化Web组态软件

组态软件是一种用于控制和监控各种设备的软件&#xff0c;也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制&#xff0c;自动…

基于百度文心大模型创作的实践与谈论

文心概念 百度文心大模型源于产业、服务于产业&#xff0c;是产业级知识增强大模型。百度通过大模型与国产深度学习框架融合发展&#xff0c;打造了自主创新的AI底座&#xff0c;大幅降低了AI开发和应用的门槛&#xff0c;满足真实场景中的应用需求&#xff0c;真正发挥大模型…

PostMan 测试项目是否支持跨域

使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头&#xff0c;声明需要跨域跨到的域&#xff08;IP&#xff1a;端口&#xff09;就行&#xff0c;其余参数PostMan会自动生成。添加此标头后&#xff0c;请求会被做为一条跨域的请求来进行处…