卷积神经网络-池化与Python实现

卷积神经网络通常在卷积操作后,采用池化方法降维。

具体方法有最大池化、平均池化以及全局平均池化。

按一定的大小(池,通常为2*2的矩形框)按序选取原图像中池中的元素(像素点),池一般不重叠,最大池化取池中最大元素,平均池化取池中元素均值,做为池化的输出。

例(均考虑一个通道,多通道分别池化):

最大池化

卷积神经网络-池化与Python实现_第1张图片

 

 平均池化:

卷积神经网络-池化与Python实现_第2张图片

 全局平均池化(计算原图所有像素点的均值),

卷积神经网络-池化与Python实现_第3张图片

 

全局平均池化一般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')  #不显示坐标轴

你可能感兴趣的:(深度学习,神经网络,机器学习,cnn,深度学习,神经网络)