В последнее время я начинаю проект о классификации, используя очень неглубокий ResNet. модель просто имеет 10 конв. слой, а затем соединяет слой Global avg pooling перед слоем softmax.
производительность соответствует моим ожиданиям - 93% (да, все в порядке).
однако по некоторым причинам, Мне нужно заменить слой Global avg pooling.
Я пробовал следующие способы:
(учитывая входную форму этого слоя [-1, 128, 1, 32], форму тензорного потока)
Глобальный максимальный уровень пула. но получил 85% ACC
Экспоненциальная скользящая средняя. но получил 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])
разделить входные данные на 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)
среднее значение последнего канала. [-1, 128, 1, 32] -> [-1, 128], не работает ^
использовать конв. слой с 1 ядром. Таким образом, выходная форма равна [-1, 128, 1, 1]. но не сработало, 25% или около того.
Я довольно озадачен, почему глобальное среднее объединение может работать так хорошо? и есть ли другой способ заменить его?