卷积神经网络通常在卷积操作后,采用池化方法降维。
具体方法有最大池化、平均池化以及全局平均池化。
按一定的大小(池,通常为2*2的矩形框)按序选取原图像中池中的元素(像素点),池一般不重叠,最大池化取池中最大元素,平均池化取池中元素均值,做为池化的输出。
例(均考虑一个通道,多通道分别池化):
最大池化
平均池化:
全局平均池化(计算原图所有像素点的均值),
全局平均池化一般CNN最后一次卷积后,通过全局平均池化,将高维变成一维,后面接全连接层,到输出。
代码:
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
image = tf.io.read_file("d:/datasets/4.jpg") #读取图片
image = tf.image.decode_jpeg(image, channels=1) #解码JPEG图片
plt.imshow(img,cmap="gray") #显示图片
plt.axis('off') #不显示坐标轴
size=2 #设置池的大小2*2
def pool_mean(img,size=2):
img_mean=np.zeros([img.shape[0]//size,img.shape[1]//size,img.shape[2]])
for i in range(0,img.shape[0]//size*size,size):
for j in range(0,img.shape[1]//size*size,size):
for k in range(img.shape[2]):
sum=0
for m in range(size):
for n in range(size):
sum+=img[i+m,j+n,k]/(size*size) #计算
img_mean[i//size,j//size,k]= sum #均值
return img_mean
img_mean=pool_mean(img)
plt.imshow(img_mean,cmap="gray") #显示图片
plt.axis('off') #不显示坐标轴
def pool_max(img,size=2):
img_max=np.zeros([img.shape[0]//size,img.shape[1]//size,img.shape[2]])
for i in range(0,img.shape[0]//size*size,size):
for j in range(0,img.shape[1]//size*size,size):
for k in range(img.shape[2]):
for m in range(size):
for n in range(size):
img_max[i//size,j//size,k]=max(img[i+m,j+n,k],\
img_max[i//size,j//size,k])
return img_max
img_max=pool_max(img)
plt.imshow(img_max,cmap="gray") #显示图片
plt.axis('off') #不显示坐标轴