python-用numpy实现最大/平均池化(跨步)
作者:互联网
我想知道如何使用numpy实现简单的最大/平均池.我正在阅读Max and mean pooling with numpy,但不幸的是,它假定步幅与内核大小相同.有numnumic的方法来做到这一点吗?如果这适用于任何维度,也很不错,但是当然不是必需的.
解决方法:
这是一个使用stride_tricks的纯numpy实现:
import numpy as np
from numpy.lib.stride_tricks import as_strided
def pool2d(A, kernel_size, stride, padding, pool_mode='max'):
'''
2D Pooling
Parameters:
A: input 2D array
kernel_size: int, the size of the window
stride: int, the stride of the window
padding: int, implicit zero paddings on both sides of the input
pool_mode: string, 'max' or 'avg'
'''
# Padding
A = np.pad(A, padding, mode='constant')
# Window view of A
output_shape = ((A.shape[0] - kernel_size)//stride + 1,
(A.shape[1] - kernel_size)//stride + 1)
kernel_size = (kernel_size, kernel_size)
A_w = as_strided(A, shape = output_shape + kernel_size,
strides = (stride*A.strides[0],
stride*A.strides[1]) + A.strides)
A_w = A_w.reshape(-1, *kernel_size)
# Return the result of pooling
if pool_mode == 'max':
return A_w.max(axis=(1,2)).reshape(output_shape)
elif pool_mode == 'avg':
return A_w.mean(axis=(1,2)).reshape(output_shape)
例:
A = np.array([[1, 1, 2, 4],
[5, 6, 7, 8],
[3, 2, 1, 0],
[1, 2, 3, 4]])
pool2d(A, kernel_size=2, stride=2, padding=0, pool_mode='max')
array([[6, 8],
[3, 4]])
https://cs231n.github.io/convolutional-networks/
标签:python-3-x,conv-neural-network,python,numpy 来源: https://codeday.me/bug/20191024/1923044.html