我可以使用 pool_size 等于特征圖大小的 AveragePooling2D 層而不是 GlobalAveragePooling2D 層嗎?這樣做的目的是在 FCN 之后替換一個密集層。GlobalAveragePooling2D 是 AveragePooling2D 的特例嗎??
uj5u.com熱心網友回復:
GlobalAveragePooling2D將通過沿空間維度取平均值來對輸入進行下采樣并默認回傳一維輸出,除非您設定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)
uj5u.com熱心網友回復:
除了上面的答案之外,全域平均池化可用于將可變大小的影像作為輸入。如果全域池化之前的輸入形狀是,(N,H,W,C)則輸出將(N,1,1,C)用于 keras 時keepdims=True。這使得不同影像的輸出(H,W)產生相似的形狀輸出。
參考:
- https://stats.stackexchange.com/questions/388859/is-it-possible-to-give-variable-sized-images-as-input-to-a-convolutional-neural
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363847.html
上一篇:ValueError:Input0oflayer"sequential"與層不兼容:expectedshape=(None,455,30),foundshape=(None,30)
下一篇:InvalidArgumentError:ConcatOp:使用Conv2D預測X_test時,輸入的維度應該匹配-為什么?
