用一个很简单的例子,输入特征图是4×4,1个通道,卷积核是3×3,池化输出特征图为2×2:
下面是实现代码:
import cv2
import numpy as np
input = np.array([
[1,2,1,1],
[0,1,2,1],
[1,1,0,1],
[3,0,0,1]])
k = np.array([
[0,1,0],
[0,1,0],
[0,1,0]])
h,w = input.shape
conv = [] # 卷积操作
max_pool = [] # 最大池化
ave_pool = [] # 平均池化
for i in range(h-2):
line_conv = []
for j in range(w-2):
t = input[i:i+3,j:j+3]
line_conv.append(np.sum(k*t)) # 输入3×3区域和卷积核进行对应元素相乘再相加
conv.append(line_conv)
for i in range(0,w,2):
line_ave = []
line_max = []
for j in range(0,h,2):
t = input[i:i+2,j:j+2]
line_ave.append(np.sum(t)/4)
line_max.append(np.max(t)) # 注意, 要用np.max(), 不是max()
ave_pool.append(line_ave)
max_pool.append(line_max)
print('conv = \n',conv,'\nmax_pool = \n',max_pool,'\nave_pool = \n',ave_pool)