Использование AveragePooling2D вместо GlobalAveragePooling 2D для замены плотных слоев после FCN для классификации

0

Вопрос

Могу ли я использовать слой AveragePooling2D с размером пула, равным размеру карты объектов, вместо слоя GlobalAveragePooling2D? цель этого состоит в том, чтобы заменить плотный слой после FCN. ЯВЛЯЕТСЯ ли GlobalAveragePooling2D частным случаем AveragePooling2D??

deep-learning keras tensorflow
2021-11-22 13:35:20
2

Лучший ответ

2

GlobalAveragePooling2D будет уменьшена выборка входных данных, взяв среднее значение по пространственным размерам, и по умолчанию вернет 1D-вывод, если вы не зададите keepdims= True. AveragePooling2D также уменьшает входные данные, но принимает среднее значение по окну ввода, определяемому pool_size параметр. Таким образом, он вернет 3D-вывод:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(avg_pool_2d(x).shape)
print(avg_global_2d(x).shape)
(1, 2, 2, 1)
(1, 1)

Вам, вероятно, придется выровнять свой вывод из AveragePooling2D слой, если вы хотите передать его в Dense слой после этого:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(tf.keras.layers.Flatten()(avg_pool_2d(x)).shape)
print(avg_global_2d(x).shape)
(1, 4)
(1, 1)

Если это не так, вы можете просто оставить все как есть.

Обновить: GlobalAveragePooling2D и AveragePooling2D иногда может вести себя аналогично, если вы отрегулируете strides и pool_size параметры соответственно:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(3, 3), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()

print(avg_pool_2d(x))
print(avg_global_2d(x))
tf.Tensor([[[[3.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)

Или

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
   strides=(2, 2), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
tf.Tensor([[[[5.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)
2021-11-22 14:51:04

'х = вход(форма=(128,128,3)) после еще много отдельных слоев я : 'а = Conv2D(200 ,(1,1), обивка = 'равно' , активация='softmax', data_format = 'channels_last')(output_of_the_layer_before) является последним сверточного слоя, то я делаю 'б = лямбда(лямбда-х: выжать(X, оси=2))(AveragePooling2D(pool_size=(1, 128))(а)
DSPinterested

Это прекрасно работает для конкретной задачи, которая у меня есть, и это заставило меня задуматься о том, что использование GlobalAveragePooling2D может быть не единственным вариантом, доступным для замены плотных слоев... также с GlobalAveragePooling2D у вас есть возможность "keepdims= True" или "keepdims= False", не могу поделиться своим кодом, надеюсь, это имело для вас смысл
DSPinterested

Да, для меня это имело смысл ... но в чем именно заключается ваш вопрос сейчас или чего вы не понимаете?
AloneTogether

Как использование слоя AveragePooling2D, описанного выше, приводит к почти тем же результатам классификации, что и GlobalAveragePooling2D! Обычно в литературе я почти всегда видел GlobalAveragePooling2D в качестве замены плотных слоев в FCN, но никогда не видел, чтобы AveragePooling2D использовался вместо плотного слоя
DSPinterested

Обновлен ответ, но не удалось воспроизвести код, который вы добавили в комментариях.. пожалуйста, обновите свой вопрос соответствующим кодом, результатом и вашим вопросом.
AloneTogether

В среднем по миру объединение не представляет собой ничего особенного. Вы можете использовать среднее объединение с размером фильтра, равным размеру ввода, и допустимым заполнением, тогда оно будет точно таким же. Вы даже можете использовать такие функции, как tf.reduce_mean. Причина, по которой никто этого не делает, заключается в том, что гораздо проще напрямую использовать глобальный пул...
xdurch0

@xdurch0 , в этом есть смысл!
DSPinterested
0

В дополнение к ответу выше, глобальное среднее объединение можно использовать для получения изображений переменного размера в качестве входных данных. Если форма ввода перед глобальным объединением является (N,H,W,C) тогда выход будет (N,1,1,C) для кераса, когда keepdims=True. Это делает вывод изображений с различными (H,W) создавайте аналогичные выходные данные формы.

Рекомендации:

2021-11-22 13:59:40

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................