Sınıflandırma için bir fcn'den sonra Yoğun katmanları değiştirmek için GlobalAveragePooling 2D yerine AveragePooling2D kullanma

0

Soru

Bir GlobalAveragePooling2D katmanı yerine özellik eşlemesinin boyutuna eşit pool_size ile bir AveragePooling2D katmanı kullanabilir miyim? bunun amacı, bir FCN'DEN sonra yoğun bir tabakanın değiştirilmesidir. GlobalAveragePooling2D, averagepooling2d'nin özel bir durumu mu??

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

En iyi cevabı

2

GlobalAveragePooling2D uzamsal boyutlar boyunca ortalama değeri alarak bir girişi aşağı örnekleyecek ve siz ayarlamadığınız sürece varsayılan olarak bir 1D çıkışı döndürecektir keepdims= True. AveragePooling2D ayrıca bir girişi altörnekler, ancak tarafından tanımlanan bir giriş penceresi üzerinden ortalama değeri alır pool_size parametre. Böylece, bir 3D çıktı döndürecektir:

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)

Muhtemelen çıkışınızı düzleştirmek zorunda kalacaksınız. AveragePooling2D eğer bir katmana beslemek istiyorsanız Dense daha sonra katman:

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)

Eğer durum böyle değilse, olduğu gibi bırakabilirsiniz.

Güncelleme: GlobalAveragePooling2D ve AveragePooling2D ayarlarsanız bazen benzer şekilde davranabilir strides ve pool_size buna göre parametreler:

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)

Veya

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 = İnput(şekil=(128,128,3))' çok daha fazla FCN katmanları ben de : 'bir = Conv2D(200), (1,1), dolgu = 'aynı' , aktivasyon='softmax', data_format = 'channels_last')(output_of_the_layer_before)' dir son katlamalı katman sonra ben 'b = Lambda(lambda x: sıkmak(x ekseni=2))(AveragePooling2D(pool_size=(1, 128))(a)
DSPinterested

Bu, sahip olduğum belirli görev için gayet iyi çalışıyor, bu da GlobalaveragePooling2D kullanmanın yoğun katmanları değiştirmek için mevcut tek seçenek olmayabileceğini merak etmemi sağladı... ayrıca GlobalAveragePooling2D ile 'keepdims= True' veya 'keepdims= False' seçeneğiniz var, kodumu paylaşamıyorum, umarım bu sizin için mantıklıdır
DSPinterested

Evet, bana mantıklı geldi.. ama şimdi sorunun tam olarak nedir ya da neyi anlamıyorsun?
AloneTogether

Yukarıda açıklandığı gibi AveragePooling2D katmanının kullanılması, GlobalAveragePooling2D ile hemen hemen aynı sınıflandırma sonuçlarına yol açar! Genellikle literatürde neredeyse her zaman globalaveragepooling2d'yi fcn'deki Yoğun katmanların yerine gördüm, ancak Yoğun bir katman yerine averagepooling2d'nin kullanıldığını hiç görmedim
DSPinterested

Yanıt güncellendi, ancak yorumlara eklediğiniz kod yeniden oluşturulamadı.. lütfen sorunuzu ilgili kod, sonuç ve sorunuzla güncelleyin.
AloneTogether

Küresel ortalama havuzlama özel bir şey değildir. Giriş boyutuna ve geçerli dolguya eşit filtre boyutuna sahip ortalama havuzu kullanabilirsiniz, o zaman tam olarak aynıdır. Aşağıdaki gibi işlevleri bile kullanabilirsiniz tf.reduce_mean. Kimsenin bunu yapmamasının nedeni, küresel havuzu doğrudan kullanmanın çok daha kolay olmasıdır...
xdurch0

@xdurch0, mantıklı!
DSPinterested
0

Yukarıdaki cevaba ek olarak, değişken boyutlu görüntüleri girdi olarak almak için genel ortalama havuzu kullanılabilir. Genel havuzlamadan önceki giriş şekli ise (N,H,W,C) sonra çıktı olacak (N,1,1,C) keras için ne zaman keepdims=True. Bu, görüntülerin çıktısını farklı kılar (H,W) benzer şekil çıktıları üretin.

Referanslar:

2021-11-22 13:59:40

Diğer dillerde

Bu sayfa diğer dillerde

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