Usando AveragePooling2D em vez de GlobalAveragePooling 2D para substituir as Densas camadas depois de uma FCN para a classificação

0

Pergunta

Posso usar um AveragePooling2D camada com o pool_size igual ao tamanho do recurso de mapa em vez de um GlobalAveragePooling2D camada? o objetivo é substituir uma densa camada após uma FCN. É GlobalAveragePooling2D um caso especial de AveragePooling2D??

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

Melhor resposta

2

GlobalAveragePooling2D vai downsample uma entrada tomando o valor médio ao longo das dimensões espaciais e retorno 1D saída por padrão, a menos que você defina keepdims= True. AveragePooling2D também fará o downsample uma entrada, mas toma o valor médio de uma janela de entrada definidos pelo pool_size o parâmetro. Assim, ele vai retornar um 3D de saída:

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)

Provavelmente você vai ter para achatar a sua saída do AveragePooling2D camada se você quer alimentá-lo para um Dense a camada mais tarde:

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)

Se não for esse o caso, você pode deixar como está.

Atualização: GlobalAveragePooling2D e AveragePooling2D por vezes, pode comportar-se da mesma forma, se você ajustar o strides e pool_size parâmetros de acordo:

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)

Ou

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

'x = Input(forma=(128,128,3))' depois de muitos mais FCN camadas de eu chegar a : 'a = Conv2D(200 ,(1,1), preenchimento = 'mesmo' , a ativação='softmax', data_format = 'channels_last')(output_of_the_layer_before)' é o último convolucionais camada, em seguida, eu faço 'b = Lambda(lambda x: aperte(x, eixo=2))(AveragePooling2D(pool_size=(1, 128))(a)
DSPinterested

Isso funciona perfeitamente para a tarefa específica que eu tenho, o que me fez pensar que usando GlobalaveragePooling2D não pode ser a única opção disponível para a substituição de camadas densas... também com GlobalAveragePooling2D você tem a opção de 'keepdims= True' ou 'keepdims= False", não podem compartilhar o meu código, eu espero que isso faz sentido para você
DSPinterested

Sim, fazia sentido para mim ... mas o que é exatamente a sua pergunta, agora, ou o que você não entende?
AloneTogether

Como usando o AveragePooling2D camadas, como descrito acima leva a quase a mesma classificação de resultados como GlobalAveragePooling2D! Geralmente, na literatura, eu tenho quase sempre visto GlobalAveragePooling2D como um substituto para camadas Densas na FCN, mas nunca vi AveragePooling2D ser utilizado em vez de uma Densa camada de
DSPinterested

Resposta atualizado, mas não poderia reproduzir o código adicionado nos comentários.. por favor atualize sua pergunta com o respectivo código, o resultado, e a sua pergunta.
AloneTogether

A média Global de agrupamento é nada de especial. Você pode usar média de agrupamento com filtro de tamanho igual ao do tamanho da entrada e válido de preenchimento e, em seguida, é exatamente o mesmo. Você pode até mesmo usar funções como tf.reduce_mean. A razão, ninguém faz isso é que é apenas a maneira mais fácil de uso global do agrupamento diretamente...
xdurch0

@xdurch0 , faz sentido!
DSPinterested
0

Adicionar a resposta acima, a média global de agrupamento podem ser utilizadas para a tomada de tamanho variável imagens como entradas. Se a entrada de forma global antes de agrupamento é (N,H,W,C) em seguida, a saída será (N,1,1,C) para keras quando keepdims=True. Isto faz a saída de imagens com diferentes (H,W) produzir de forma semelhante saídas.

Referências:

2021-11-22 13:59:40

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................