почему глобальный средний пул работает в ResNet - PullRequest
0 голосов
/ 04 ноября 2019

В последнее время я начинаю проект о классификации, используя очень неглубокий ResNet. модель просто имеет 10 конв. слой, а затем соединяет слой Global avg pooling перед слоем softmax.

производительность соответствует моим ожиданиям - 93% (да, все в порядке).

однако по некоторым причинам, Мне нужно заменить слой Global avg pooling.

Я пробовал следующие способы:

(учитывая входную форму этого слоя [-1, 128, 1, 32], форму тензорного потока)

  1. Глобальный максимальный уровень пула. но получил 85% ACC

  2. Экспоненциальная скользящая средняя. но получил 12% (почти не работал)

    split_list = tf.split(input, 128, axis=1)
    avg_pool = split_list[0]
    beta = 0.5
    for i in range(1, 128):
        avg_pool = beta*split_list[i] + (1-beta)*avg_pool
    avg_pool = tf.reshape(avg_pool, [-1,32])
    
  3. разделить входные данные на 4 части, avg_pool каждой части, наконец, объединить их. но получил 75%

    split_shape = [32,32,32,32]
    split_list = tf.split(input, 
                          split_shape, 
                          axis=1)
    for i in range(len(split_shape)):
        split_list[i] = tf.keras.layers.GlobalMaxPooling2D()(split_list[i])
    avg_pool = tf.concat(split_list, axis=1)
    
  4. среднее значение последнего канала. [-1, 128, 1, 32] -> [-1, 128], не работает ^

  5. использовать конв. слой с 1 ядром. Таким образом, выходная форма равна [-1, 128, 1, 1]. но не сработало, 25% или около того.

Я довольно озадачен, почему глобальное среднее объединение может работать так хорошо? и есть ли другой способ заменить его?

...