ConvNet: не получается получить требуемый результат в функции максимального объединения

#python #numpy #deep-learning #conv-neural-network

#python #numpy #глубокое обучение #conv-нейронная сеть

Вопрос:

Я пытаюсь реализовать CNN, используя только numpy. Я получаю ошибку выхода индекса из границы на уровне максимального объединения.

Функция принимает массив карты объектов в качестве аргумента. Массив карты объектов — это ndarray. Вот моя функция:

 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=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[r:r size,  
                                            c:c size, map_num]])
                c2 = c2   1
            r2 = r2  1

    return np.array(pool_res)
  

Это ошибка, которую я получаю:

 --------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-104-ccb65cb3a606> in <module>()
----> 1 feature_pool = pool_forward(features)
  2 feature_pool.shape

<ipython-input-102-5d4c4e76f99a> in pool_forward(feature_map, mode, 
filter_size, stride)
 13             c2 = 0
 14             for c in np.arange(0, f_col-filter_size 1, stride):
 ---> 15                 pool_out[r2, c2, map_num] = 
 np.max([feature_map[r:r filter_size,  c:c filter_size, map_num]])
 16                 c2 = c2   1
 17             r2 = r2  1

IndexError: index 3 is out of bounds for axis 2 with size 3
  

Помогите мне здесь.

Комментарии:

1. Было бы полезно объяснить вашу функцию pool_forward и каким должен быть ваш результат.

2. pool_forward — это функция максимального объединения, применяемая к картам объектов, полученным после свертки в сверточной нейронной сети. На выходе должно быть 4 массива 2×2 для каждой из четырех карт объектов

Ответ №1:

Пожалуйста, проверьте обновленную часть ответа:

Ошибка заключается в строке:

 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, потому что они, похоже, не нужны.

Комментарии:

1. но требуемый результат должен составлять 4 массива 2×2 для каждого из четырех массивов карты объектов 3×3

2. Как вы предлагаете объединить тензор 3 * 3 в тензоры 2 * 2 (с шагом 2)? Ваше предположение, прежде всего, неверно. Вы должны выбрать шаг 1, чтобы объединить 3 * 3 в 2 * 2. Пожалуйста, нарисуйте его и проверьте.

3. спасибо за понимание и ответ на мой вопрос, хотя он не был передан должным образом