池化层的作用[通俗易懂]

maxpooling是CNN当中的最大值池化操作,其实用法和卷积很类似tf.nn.max_pool(value,ksize,strides,padding,name=None)参数是四个,和卷积很类似:第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是featuremap,依然是[batch,height,width,channels]这样的shape第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1,height,width,1],

大家好,又见面了,我是你们的朋友全栈君。

1. 池化层理解

池化层夹在连续的卷积层中间, 用于压缩数据和参数的量。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
个人理解的同图片resize方法类似(双线性插值法,邻近法),只不过池化层用的是取最大值法。

在这里插入图片描述

2. 池化层的作用:

个人觉得主要是两个作用:

  1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
  2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力

A: 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

B. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用

在这里插入图片描述

3. 函数解析 tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数是四个,和卷积很类似:
第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

第四个参数padding:和卷积类似,可以取’VALID’ 或者’SAME’

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

4. 代码演示详解维度变化

import tensorflow as tf
import numpy as np


# [ batch, in_height, in_weight, in_channel ]
input_data = np.random.randn(32, 32).reshape(1, 32, 32, 1)
# [ filter_height, filter_weight, in_channel, out_channels ]
# 8: 输出有 8 个 1: 同 input_data 中的 1 对应
filter_ = np.random.randn(5, 5, 8).reshape(5, 5, 1, 8)

# 一层卷积
conv = tf.nn.conv2d(input_data, filter_, strides=[1, 1, 1, 1], padding='VALID')
# VALID:不会补0。 28如何得到的: 32 - 5 + 1,宽度和高度的shape变化都是这个公式
# SAME:补0,得到的就是 32 * 32 同输入一样的大小。
# (1, 28, 28, 8)
print(conv.shape)
# 池化层, 此函数参数同 tf.nn.conv2d 一样
# [1, 2, 2, 1]: 输入:1 高度:2 宽度:2 channel:1
max_pool = tf.nn.max_pool(conv, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# (1, 14, 14, 8)
print(max_pool.shape)

# 激活层,不改变维度
relu = tf.nn.relu(max_pool)
# (1, 14, 14, 8)
print(relu.shape)

# dropout
dropput = tf.nn.dropout(relu, keep_prob=0.6)
# (1, 14, 14, 8)
print(dropput.shape)

# 第二层卷积
# 高度:5 宽度:5 输入8:同dropout中的8 输出:20
filter2_ = np.random.randn(5, 5, 8, 20)
conv2 = tf.nn.conv2d(dropput, filter2_, strides=[1, 1, 1, 1], padding='VALID')
# (1, 10, 10, 20)
print(conv2.shape)

# 池化层
# [1, 2, 2, 1]: 输入:1 高度:2 宽度:2 channel:1
max_pool = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# (1, 5, 5, 20)
print(max_pool.shape)
#
# # 激活层
# sigmoid = tf.nn.sigmoid(max_pool)
# # (1, 5, 5, 20)
# print(relu.shape)
#
# # dropout
# dropput2 = tf.nn.dropout(sigmoid, keep_prob=0.5)
# # (1, 5, 5, 20)
# print(dropput.shape)
#
# # 全连接层
# # 500: 上面:5*5*20
# dense = np.random.randn(500, 120)
# fc = tf.reshape(dropput2, shape=[1, 5*5*20])
# conn = tf.matmul(fc, dense)
# # (1, 120)
# print(conn.shape)
#
# # out输出层
# w = np.random.randn(120, 9)
#
# b = np.random.randn(9)
#
# out = tf.matmul(conn, w) + b
# # (1, 9)
# print(out.shape)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127602.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 仙之侠道二九章怎么开青门_仙之侠道2玖章全面攻略

    仙之侠道二九章怎么开青门_仙之侠道2玖章全面攻略仙之侠道这一系列的图小编也玩了好几年了(初章一直到现在的六章)。都是单机或者找两个朋友玩的。六章任务中前期推荐做:可以得衣服,得钱的任务,例如:狼皮任务,包包果,巨虾甲任务,古币以及挖蘑菇(牛洞的走法下面有介绍)等。这一系列图前期的等级以及衣服是最最重要的。当然挑战系列不要忘了前期有个移动最大化的鞋子,特别实用。紧急的书信这是游戏中最简单的一个任务了,只要去找NPC接了任务拿了信,再送去南诏就可…

    2025年8月22日
    4
  • inputstreamreader和inputstream_FileInputStream

    inputstreamreader和inputstream_FileInputStream我们的机器只会读字节码,而我们人却很难读懂字节码,所以人与机器交流过程中需要编码解码。InputStreamReader及其子类FileReader:(从字节到字符)是个解码过程;OutputStreamWrite及其子类FileWriter:(从字符到字节)是个编码过程。InputStreamReader这个解码过程中,最主要的就是StreamDecoder类 

    2022年9月26日
    4
  • ubuntu性能优化_ubuntu系统安装教程

    ubuntu性能优化_ubuntu系统安装教程有两个工具可以帮助减少电脑过热问题,提升系统性能。特别是比较慢的笔记本。TLP开始后自动在后台运行。sudoadd-apt-repositoryppa:linrunner/tlpsudoapt-getupdatesudoapt-getinstalltlptlp-rdwsudotlpstartindicator-cpufreqsudoapt-getinstallindi

    2022年9月19日
    3
  • PostgreSql新手入门命令[通俗易懂]

    PostgreSql新手入门命令

    2022年2月11日
    29
  • mysql 如何修改用户密码_如何更改MySQL用户密码

    mysql 如何修改用户密码_如何更改MySQL用户密码在本教程中,我们将向您展示如何更改MySQL用户密码。这些说明应适用于任何现代Linux发行版,例如Ubuntu18.04和CentOS7。先决条件根据系统上运行的MySQL或MariaDB服务器版本,您将需要使用不同的命令来更改用户密码。您可以通过发出以下命令来找到数据库服务器版本:mysql–version如果您的系统中安装了MySQL,则输出将类似于以下内容:mysqlVer14…

    2022年6月17日
    37
  • Qt 资料大全[通俗易懂]

    Qt 资料大全[通俗易懂]全网最强整理,Qt官网、编码风格、GitHub&Third-Party、社区论坛、博客、书籍等资源,应有尽有。

    2022年7月17日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号