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

news2024/12/24 21:10:08

目录

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


一、最大池化

最大池化进行压缩

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

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64, kernel_size=3), # 激活函数为 None
    layers.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 cells

def 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.shape
    thresh = (kernel.max()+kernel.min())/2
    if 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 above
    window_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 above
    window_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.coloradmin.cn/o/910817.html

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

相关文章

CentOS下载ISO镜像的方法

目录 一、CentOS 介绍 二、进入CentOS 官方网站 三、步骤 一、CentOS 介绍 CentOS,中文意思是社区企业操作系统是Linux发行版之一,是免费的、开源的、可以重新分发的开源操作系统。 CentOS Linux发行版是一个稳定的,可预测的&#xff0…

防静电实时监控系统的工作原理和主要功能

防静电监控系统是一种用于实时监测静电数值变化的集成系统。它的主要作用是检测和预防静电所可能引起的危险和损坏。以下是该系统的一般工作原理和主要功能: 1. 检测静电:防静电实时监控系统通过传感器和测量设备来监测周围环境中的静电水平。这些传感器…

TDA4超级玩家浮出水面,行泊一体功能、成本刷到极致

2023年以来,智能驾驶市场进入L2普及、高阶ADAS功能(NOA)大规模量产的新周期,降本增效,打造极致性价比、提升用户体验等,成为了竞争的焦点。 其中,替换更具性价比的硬件平台、传感器复用、系统优…

h264 SPS 帧分辨率解析标准

来源:微信公众号「编程学习基地」 文章目录 导致1088出现的原因h264 sps解析h264bitstream的简单使用导致1088出现的原因 大部分IPC推过来的数据流都是标准的1080P(1920x1080),720P(1280x720) 但是也有个例,部分设备存在16位/32位对齐的情况,出现非标1080P(1920x1088),72…

这些数学运算符号你都见过吗?

入门教程、案例源码、学习资料、读者群 请访问: python666.cn 大家好,欢迎来到 Crossin的编程教室 ! 数学运算是编程时少不了的操作。 其中加减乘除都比较简单,就和正常数学中的写法一样。要注意的就是在绝大多数编程语言中&#…

怎样做好数字营销呢?

2023 年,数字营销将随着新技术、趋势和消费者行为的不断发展而不断发展。要在 2023 年在数字营销领域取得成功,请考虑以下策略: 1.内容质量和个性化: 专注于制作与目标受众产生共鸣的高质量且相关的内容。 根据用户偏好、行为和…

elemenPlus ElMessage 字符串如何换行问题

因为后端返回的数据是一长串,而且带有\r,\n等换行符,但是并没有生效。前端写法: // 抛出错误ElMessage.error(msg);我们知道\r,\n,\r\n 是在不同系统下的换行符的表示,但在JavaScript返回字符串中并没有生效…

为何有很多人选择使用ChatGPT的替代品?

尽管ChatGPT备受赞誉且确实是出色的工具,但它也有一些限制。 现在有一些工具比ChatGPT更为经济,并且拥有大量现成的功能,而在ChatGPT中,这需要收集整理编写大量的提示。[1] ChatGPT没有提供对GPT-4模型的无限访问,也没…

GIS应用技巧之空间插值分析

一、空间插值概论 空间插值常用于将离散点的测量数据转换为连续的数据曲面,以便探究空 间现象的分布模式,该方法通常用来分析地区环境污染、地区降水量、地区气候 变化、资源利用程度、公共基础设施影响效应等。空间插值方法分为两类:一类 是…

c语言——判断一个字符有多少位数

//判断一个字符有多少位数 #include<stdio.h> #include<stdlib.h> int main() {long long n;int count0;printf("输入整数&#xff1a;");scanf("%lld",&n);while(n!0){n/10;count;} printf("数字是%d位数\n",count);system(&qu…

探索组间差异利器:Tukey 检验 【Tukey Test】

前言 统计学中有许多方法可用于比较不同组别之间的差异&#xff0c;而其中一种常见且强大的工具就是Tukey检验。当我们进行多组实验或研究时&#xff0c;常常需要了解哪些组别之间存在显著差异&#xff0c;而不仅仅是确定是否存在差异。在这个问题上&#xff0c;Tukey检验可以为…

ArcGIS Pro怎么解决道路压盖问题

在默认情况下&#xff0c;道路可能会存在低等级道路将高等级道路压盖、在道路连接处不连通的情况&#xff0c;这些问题都可以在ArcGIS Pro内解决&#xff0c;这里为大家介绍一下处理方法&#xff0c;希望能对你有所帮助。 道路分级 在符号系统内&#xff0c;选择唯一值&#x…

查看镁光DDR芯片型号的办法

查看镁光DDR芯片型号的办法 百度镁光官网 搜索decoder 输入需要查询的FBGA信息 镁光芯片丝印有两行&#xff0c;第一行为产地&#xff0c;不用管&#xff0c;第二行就是FBGA

PLSQL DEVELOPER 右侧工具栏剪贴板不见了怎么显示

解决&#xff1a;在左侧顶级菜单中找到视图&#xff0c;然后找到PLSQL剪贴板&#xff0c;把它勾选上&#xff0c;就会显示出来了。

企业虚拟直播是什么,操作界面和直播观看界面截图介绍

企业虚拟直播是什么&#xff0c;操作界面和直播观看界面截图介绍 企业MR虚拟直播操作界面和直播观看界面 “虚拟场景虚拟特效虚拟录播/直播”技术方案.MR虚拟直播 MR虚拟直播带来的内容、体验和互动的升级&#xff0c;对多个行业、场景具有重大意义&#xff0c;尤其是在汽车、科…

MySQL 、Sql server 错误处理机制 \输出特点的错误信息

sql server 错误处理机制 try 。。。catch ---Try Catch Syntax BEGIN TRY{<sql statements>} end TRY BEGIN Catch{<sql> statements} end catch [;]MySQL 程序错误处理机制 ** 定义条件 定义处理程序** 定义条件&#xff1a; declare 错误名称 condition …

物流签收异常,财务对账复杂,怎么解决?

电子商务行业的蓬勃发展为人们的购物体验带来了巨大的便利&#xff0c;然而&#xff0c;随之而来的物流签收异常和财务对账复杂问题却给电商企业的财务部门带来了一系列困扰。 每天大量的订单和货物流转&#xff0c;不可避免地导致了物流签收数据与财务记录之间的不一致和差异…

七夕特别!用代码绘制爱心,送你一份浪漫的礼物

七夕情人节即将来临&#xff0c;是时候为心爱的人准备一份特别的礼物了。不过&#xff0c;我们今天要来换个方式&#xff0c;用一段简单的Python代码绘制一个爱心图案&#xff0c;再搭配一个暖心的七夕文案&#xff0c;为这个特别的日子增添一份浪漫与惊喜。 # -*- coding: ut…

基于Element-ui的颜色选取器,增加最近使用的颜色。

8个预设颜色值&#xff0c;使用一个颜色后&#xff0c;将颜色放到第一个预设颜色&#xff0c;去重&#xff0c;保存到本地。 完整代码自取 <template><div><el-color-picker :value"value" show-alpha :predefine"predefineColors" chan…

实例041 获取桌面大小

实例说明 获取桌面分辨率可以使用API函数GetDeviceCaps&#xff0c;但API函数参数较多&#xff0c;使用不方便&#xff0c;如何更方便的获取桌面分辨率呢&#xff1f;在本例中&#xff0c;通过读取Screen对象的属性&#xff0c;来获取桌面分辨率信息&#xff0c;以像素为单位。…