gpt4 book ai didi

python - 如何实现固定长度的空间金字塔池化层?

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:23 24 4
gpt4 key购买 nike

我想实现介绍的空间金字塔池化层 in this paper .

作为论文的设置,关键是定义了最大池化层的变核大小和步长,即:

kernel_size = ceil(a/n)
stride_size = floor(a/n)

其中 a 是输入张量空间大小,n 是金字塔级别,即池化输出的空间箱。

我尝试用tensorflow实现这一层:

import numpy as np
import tensorflow as tf


def spp_layer(input_, name='SPP_layer'):
"""
4 level SPP layer.

spatial bins: [6_6, 3_3, 2_2, 1_1]

Parameters
----------
input_ : tensor
name : str

Returns
-------
tensor
"""
shape = input_.get_shape().as_list()

with tf.variable_scope(name):

spp_6_6_pool = tf.nn.max_pool(input_,
ksize=[1,
np.ceil(shape[1]/6).astype(np.int32),
np.ceil(shape[2]/6).astype(np.int32),
1],
strides=[1, shape[1]//6, shape[2]//6, 1],
padding='SAME')
print('SPP layer level 6:', spp_6_6_pool.get_shape().as_list())

spp_3_3_pool = tf.nn.max_pool(input_,
ksize=[1,
np.ceil(shape[1]/3).astype(np.int32),
np.ceil(shape[2]/3).astype(np.int32),
1],
strides=[1, shape[1]//3, shape[2]//3, 1],
padding='SAME')
print('SPP layer level 3:', spp_3_3_pool.get_shape().as_list())

spp_2_2_pool = tf.nn.max_pool(input_,
ksize=[1,
np.ceil(shape[1]/2).astype(np.int32),
np.ceil(shape[2]/2).astype(np.int32),
1],
strides=[1, shape[1]//2, shape[2]//2, 1],
padding='SAME')
print('SPP layer level 2:', spp_2_2_pool.get_shape().as_list())

spp_1_1_pool = tf.nn.max_pool(input_,
ksize=[1,
np.ceil(shape[1]/1).astype(np.int32),
np.ceil(shape[2]/1).astype(np.int32),
1],
strides=[1, shape[1]//1, shape[2]//1, 1],
padding='SAME')
print('SPP layer level 1:', spp_1_1_pool.get_shape().as_list())

spp_6_6_pool_flat = tf.reshape(spp_6_6_pool, [shape[0], -1])
spp_3_3_pool_flat = tf.reshape(spp_3_3_pool, [shape[0], -1])
spp_2_2_pool_flat = tf.reshape(spp_2_2_pool, [shape[0], -1])
spp_1_1_pool_flat = tf.reshape(spp_1_1_pool, [shape[0], -1])

spp_pool = tf.concat(1, [spp_6_6_pool_flat,
spp_3_3_pool_flat,
spp_2_2_pool_flat,
spp_1_1_pool_flat])

return spp_pool

但当输入大小不同时,它不能保证相同长度的池化输出。

如何解决这个问题?

最佳答案

我相信论文的作者是错误的,公式应该是:

stride_size = floor(a/n)
kernel_size = floor(a/n) + (a mod n)

请注意,当 n < 4 时,两个公式给出相同的结果。您可以通过对 a 除以 n 进行欧几里得除法来证明此结果。

我修改了在 https://github.com/tensorflow/tensorflow/issues/6011 找到的代码这是:

def spp_layer(input_, levels=(6, 3, 2, 1), name='SPP_layer'):
shape = input_.get_shape().as_list()
with tf.variable_scope(name):
pyramid = []
for n in levels:

stride_1 = np.floor(float(shape[1] / n)).astype(np.int32)
stride_2 = np.floor(float(shape[2] / n)).astype(np.int32)
ksize_1 = stride_1 + (shape[1] % n)
ksize_2 = stride_2 + (shape[2] % n)
pool = tf.nn.max_pool(input_,
ksize=[1, ksize_1, ksize_2, 1],
strides=[1, stride_1, stride_2, 1],
padding='VALID')

# print("Pool Level {}: shape {}".format(n, pool.get_shape().as_list()))
pyramid.append(tf.reshape(pool, [shape[0], -1]))
spp_pool = tf.concat(1, pyramid)
return spp_pool

关于python - 如何实现固定长度的空间金字塔池化层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com