TensorFlow实现PSPNet金字塔池化模块时的尺寸匹配问题咨询
TensorFlow实现PSPNet金字塔池化模块时的尺寸匹配问题咨询
各位大佬好,我最近在TensorFlow里写PSPNet的代码,卡在金字塔池化模块的尺寸匹配上了,想请教下大家怎么解决。
先说说这个池化模块的逻辑:
- 拿不同尺寸的池化核对输入特征图做平均池化
- 接着过一个1x1卷积降维
- 再用和池化核一样的尺寸做双线性插值上采样,把尺寸还原
- 最后把所有分支的结果拼在一起
我自己写的代码是这样的:
def pyramid_pooling_module(x, pool_sizes): pool_outputs = [] for pool_size in pool_sizes: pooled= layers.AveragePooling2D(pool_size)(x) pooled= layers.Conv2D(512, (1,1), padding='same')(pooled) pooled= layers.UpSampling2D(size=pool_size, interpolation='bilinear')(pooled) print(pool_size) pool_outputs.append(pooled) return layers.Concatenate()(pool_outputs)
我的输入特征图尺寸是(68, 120),用的池化核是1x1、2x2、3x3、6x6。但问题来了:用3x3和6x6池化的时候,因为输入尺寸没法被池化核整除,平均池化会做向下取整,导致上采样后的特征图尺寸和原输入对不上,最后拼接的时候直接报错。
比如输入68x120用3x3池化,池化后是22x40(68除以3取整是22,120除以3刚好是40),再用3x3上采样就得到66x120,比原输入少了2个像素;用6x6池化的话,池化后是11x20(68//6=11,120//6=20),上采样后也是66x120,和原尺寸差了2个像素,根本没法和其他分支拼起来。
现在我卡在这里好久了,有没有靠谱的办法能解决这个尺寸不匹配的问题,让所有分支的输出都能和原输入尺寸保持一致,顺利完成拼接呀?
备注:内容来源于stack exchange,提问作者Mel7
相关产品推荐
相关产品推荐

