Пожалуйста, проверьте обновленную часть ответа:
Ошибка лежит в строке:
pool_out[r2, c2, map_num] = np.max([feature_map[r:r+size, c:c+size, map_num]])
Должно быть:
pool_out[r2, c2, map_num] = np.max([feature_map[map_num, r:r+size, c:c+size]])
Сейчас:
def pool_forward(feature_map, mode = "max", size=2, stride=2):
f_num, f_row, f_col = feature_map.shape
#Preparing the output of the pooling operation.
pool_out = np.zeros((np.uint16((f_row-size+1)/stride+1),
np.uint16((f_col-size+1)/stride+1), f_num))
for map_num in range(f_num):
r2 = 0
for r in np.arange(0,f_row-size+1, stride):
c2 = 0
for c in np.arange(0, f_col-size+1, stride):
pool_out[r2, c2, map_num] = np.max([feature_map[map_num, r:r+size, c:c+size]])
c2 = c2 + 1
r2 = r2 +1
return np.array(pool_res)
feature_map = np.array([[[4, 3, 4],[2, 4, 3],[2, 3, 4]],
[[3, 4, 2],[2, 4, 4],[2, 4, 2]],
[[5, 7, 6],[2, 1, 3],[3, 3, 8]],
[[3, 3, 2],[1, 3, 5],[7, 4, 9,]]])
pool_forward(feature_map)
возвращает:
array([[[4., 4., 7., 3.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
Обновление : предпосылка вопроса неверна.С вводом формы 3 * 3 У вас есть размер окна объединения 2 * 2 и шаг 2, тогда вы можете захотеть взглянуть на fractional_max_pooling
.Для обычного max_pooling
вы должны выбрать шаг 1. (т.е. значение (f_row-size)/stride
должно быть целым числом).В этом случае проверьте код ниже:
feature_map = np.array([[[4, 3, 4],[2, 4, 3],[2, 3, 4]],
[[3, 4, 2],[2, 4, 4],[2, 4, 2]],
[[5, 7, 6],[2, 1, 3],[3, 3, 8]],
[[3, 3, 2],[1, 3, 5],[7, 4, 9,]]])
def pool_forward(feature_map, mode = "max", size=2, stride=1):
f_num, f_row, f_col = feature_map.shape
pool_out = np.zeros((f_num,np.uint16((f_row-size)/stride+1),\
np.uint16((f_col-size)/stride+1)))
for z in range(f_num):
for r in np.arange(0,f_row-size+1, stride):
for c in np.arange(0, f_col-size+1, stride):
pool_out[z, r, c] = np.max(feature_map[z, r:r+size, c:c+size])
return pool_out
pool_forward(feature_map)
возвращает:
array([[[4., 4.],
[4., 4.]],
[[4., 4.],
[4., 4.]],
[[7., 7.],
[3., 8.]],
[[3., 5.],
[7., 9.]]])
Это кажется правильным.Также я бросил переменные c2 и r2, потому что они не кажутся необходимыми.