0
点赞
收藏
分享

微信扫一扫

python实现CNN池化功能

什么是池化pooling:在矩阵领域内按照规则取值,常见的有均值池化、最大值池化、中值池化、 

最小值池化。

池化实现的两个功能:降维和提取特征信息

池化大小:一般用大小为3*3的或者5*5的池化矩阵

池化的本质:卷积

简单解释池化:将领域内的值综合为一个值

python代码实现中值池化,调整步长,可以实现池化后图片大小是否改变

def midpooling(img1):#中值池化,池化后不改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    midpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1):
        for j in range(1,cols_ext-1):
            pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                     img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                     img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            midpooling[i-1,j-1]= np.median(pool) 
    return midpooling
def midpooling(img1,step):#中值池化,池化后改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    midpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1,step):
        for j in range(1,cols_ext-1,step):
                pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                        img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                        img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            midpooling[i-1,j-1]= np.median(pool) 
    return midpooling

如果pool的尺寸是3*3,一般step = 3;如果pool的尺寸是5*5,一般step = 5,同时补零的大小需要改变。

想要实现均值池化,只需改变一行代码即可

def meanpooling(img1):#中值池化,池化后不改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    meanpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1):
        for j in range(1,cols_ext-1):
            pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                     img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                     img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            meanpooling[i-1,j-1]= np.nanmean(pool) 
    return meanpooling
def meanpooling(img1,step):#中值池化,池化后改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    meanpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1,step):
        for j in range(1,cols_ext-1,step):
                pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                        img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                        img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            meanpooling[i-1,j-1]= np.nanmean(pool) 
    return meanpooling

想要实现最大值池化,只需改变一行代码即可

def maxpooling(img1):#中值池化,池化后不改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    maxpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1):
        for j in range(1,cols_ext-1):
            pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                     img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                     img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            maxpooling[i-1,j-1]= np.max(pool) 
    return maxpooling
def maxpooling(img1,step):#中值池化,池化后改变图的大小
    m, n = img1.shape
    img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0   #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
    rows_ext,cols_ext = img1_ext.shape
    img1_ext [np.isnan( img1_ext )]=0
    maxpooling= np.full((m,n),0)
    for i in range(1,rows_ext-1,step):
        for j in range(1,cols_ext-1,step):
                pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
                        img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
                        img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
            
            maxpooling[i-1,j-1]= np.max(pool) 
    return maxpooling
举报

相关推荐

0 条评论