池化函数小例子

"""
卷积后的特征图具有一种“静态性”的属性,为了描述全局性信息,需要对特征图不同位置的特征进行聚合
统计,例如,特征提取可以计算图像一个区域上的某个特定特征的平均值(或最大值)。相比使用所有提取到的特征,
这些概要统计特征维度更低,同时还会改善结果,不容易过拟合,这种聚合的操作就叫做池化。
加强卷积特征提取

TensorFlow池化运算的函数
tf.nn.max_pool(value, ksize, strides, padding, name=None)
1. value: 需要的池化输入,一般池化层接在卷基层后面,所以输入通常是feature map,
shape依然是[batch, height, width, channels]
2. ksize: 池化窗的大小,是一个4维Tensor,一般是[1, height, width, 1]
3. strides: 滑动步长,一般是[1, stride, stride, 1]
4. padding: 仍然取值为"VALID"和"SAME"之一
池化最终的返回结果是一个Tensor,类型为float,shape是[batch, height, width, channels]
"""
# 池化函数的小例子
import tensorflow as tf
import cv2
import numpy as np

data = tf.constant([
    [[3.0, 2.0, 3.0, 4.0],
     [2.0, 6.0, 2.0, 4.0],
     [1.0, 2.0, 1.0, 5.0],
     [4.0, 3.0, 2.0, 1.0]]
])

# 首先将其变为4维Tensor,变成了一个单通道的特征图
data = tf.reshape(data, [1, 4, 4, 1])
maxPooling = tf.nn.max_pool(data, [1, 2, 2, 1], [1, 2, 2, 1], padding="VALID")
sess = tf.Session()
print(sess.run(maxPooling))
sess.close()

# 使用池化运算加强卷积特征提取
# 以lena.jpg为例,在卷积处理后,加上一个池化操作,然后观察原图以及特征图像,并查看张量的变化
imgPath = "tensorflow_application/lena.jpg"
img = cv2.imread(imgPath)
img_float = np.array(img, np.float32)
x_image = tf.reshape(img_float, [1, 512, 512, 3])

filter = tf.Variable(tf.ones([7, 7, 3, 1]))

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
res = tf.nn.conv2d(x_image, filter, strides=[1, 2, 2, 1], padding="SAME")  # 卷积输出的特征图
res_pool = tf.nn.max_pool(res, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="VALID")  # 池化输出的特征图
# 将原图进行可视化
cv2.imshow("origin", img)
# 将卷积特征图进行可视化
res_conv_img = sess.run(tf.reshape(res, [256, 256])) / 128 + 1
res_conv_img = res_conv_img.astype("uint8")  # 将float转变为uint8,不然无法可视化
cv2.imshow("conv", res_conv_img)
# 将池化特征图进行可视化
res_pool_img = sess.run(tf.reshape(res_pool, [128, 128])) / 128 + 1
res_pool_img = res_pool_img.astype("uint8")
cv2.imshow("pool", res_pool_img)
# 打印张量
print(res)  # 卷积输出的张量,由于步长为2,且padding="SAME",故大小变为256*256
print(res_pool)  # 池化输出的张量,由于步长为2,故大小变为128*128
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值