概述
本文通过代码 将 池化结果 显示成 图片,便于理解池化层的功能
注意:
卷积结果、池化结果 可能是 负数、浮点数,而图片是 0-255 之间的 整数,所以 将 卷积结果、池化结果 显示成图片,肯定会有 偏差
准备图片
代码
导入模块
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D
from tensorflow.keras.layers import Activation
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
读取图片
读取图片
path=r"C:\Users\mym\Desktop\文件接收柜\aodaili.jpg"
im = Image.open(path)
img=np.array(im)
print('输入图shape:',img.shape)
print('输入图:',img)
将图片格式转换成3维
由于是 灰度图,只有 2个维度(即:宽、高)
但tensorflow需要的是 3维 格式,所以要转换成3维,第3维是 通道数,灰度图的通道数是 1
img=img.reshape(img.shape[0],img.shape[1],1)
# img=np.expand_dims(img,-1)
print('输入图shape:',img.shape)
# print('输入图:',img)
建立模型
model = Sequential()
# 第一个参数是卷积核的数量,第二个参数是卷积核的大小
model.add(Conv2D(4, (3, 3), input_shape=img.shape))
model.add(MaxPool2D((3, 3)))
model.summary()
预测前准备
由于tensorflow预测时,要求数据为4维矩阵,在原图片维度前插入一个维度,表示图片数量,也就是说:
- 第1维是图片 数量
- 第2、3维表示图片 宽高
- 第4维表示图片 通道数
所以要将图片转为4维矩阵
# 多增加一个维度,第一维是图片数量
img_batch=img.reshape(1,img.shape[0],img.shape[1],1)
# img_batch = np.expand_dims(img, axis=0)
print('输入图shape:',img_batch.shape)
执行结果:
输入图shape: (1, 300, 300, 1)
进行预测
直接对该图进行预测,输出卷积结果
# 输出特征图
out_img = model.predict(img_batch)
print ("结果类型:",type(out_img))
print ("结果shape:",out_img.shape)
print ("卷积结果",out_img)
执行结果:
注意:
预测结果的 类型是 numpy类型
shape解释:
- 第一个元素:表示传入图片 数量是1,所以预测结果的图片 数量也是1
- 第二、三个元素:表示图片 高、宽
- 第四个元素:上一层经过 4个卷积核 计算,生成4个特征结果,池化层对每个特征结果做池化,所以也是 4个特征结果
注意 注意 注意:
由于 卷积结果,有 负数、浮点数 也有,
所以 池化结果 也有 负数、浮点数
为了直观感受 池化结果,下面要将结果显示成图片,图片是0-255之间的数字,所以显示成图片时,并不是真实的
实现函数:显示卷积结果
def show_img(out_img):
num_pic = out_img.shape[-1]
print('out_img.shape:',out_img.shape)
#显示将特征图
for _ in range(num_pic):
show_img = out_img[:, :, _]
# 通过matplotlib显示图片,图片大小不准确
plt.imshow(show_img, cmap='gray')
plt.axis('off')
plt.show()
# 根据图片的numpy数组转成图片对象,由于numpy数组是浮点型,且可能有负数,所以要转换成8位像素模式,然后保存图片
Image.fromarray(show_img).convert('L').save("池化-%s.jpeg"%_)
显示卷积结果
show_img(out_img[0])
matplotlib显示卷积结果:
- 图片大小与卷积结果 不一致
- 显示与卷积结果 不一致,因为卷积结果有负数、浮点数
pil显示图片结果:
- 图片大小与卷积结果 一致
- 显示与卷积结果 不一致,因为卷积结果有负数、浮点数
总结
为了让图片特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性,在 卷积结果 的基础之上,进行 最大池化 计算,将特征图变小










