keras中的分数最大池

时间:2017-06-29 01:08:59

标签: python-3.x keras

keras lib中的现有函数,包括max-pooling,average pooling等。

但是,我想根据论文https://arxiv.org/abs/1412.6071在keras中实现分数最大池。

我的实施如下:

model = Sequential()
......
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

所以,我不想使用model.add(MaxPooling2D(pool_size =(2,2))),而是实现如下内容:

model.add(fractionalMaxpool2D(..............))

有可能吗? 我目前正在使用keras作为tensorflow的后端。

感谢有人提供算法/代码。

我是新手,因为我之前没有写过任何自定义图层,所以有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:0)

在我看来,您可以通过实施自定义图层来实现这一目标

class FractionalMaxpool2D(Layer):
    def __init__(self, output_dim):
        super(FractionalMaxpool2D, self).__init__()
        self.output_dim = output_dim
    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        # This kind of layer doesn't have any variable
        pass
    def call(self, x):
        # Handle you algorithm here
        return ....  
    def compute_output_shape(self, input_shape):
        # return the output shape
        return (input_shape[0], self.output_dim)

问题是难以实现使用GPU的分数最大池的核心功能。 请从Keras的Github查看this discussion

答案 1 :(得分:0)

您可以使用Keras Lambda图层来包装tf.nn.fractional_max_pool,例如

FMP = Lambda(lambda img,pool_size:tf.nn.fractional_max_pool(img,pool_size))

现在,您可以像其他带有两个参数的图层一样,在Keras代码中使用FMP

  1. 图片:具有[批量,高度,宽度,通道]之类的尺寸
  2. pool_size:[1.0,pool_size_you_want,pool_size_you_want,1.0]

第一个和最后一个是1.0,这是因为tf不对batch_size和通道执行合并,而是对高度和宽度执行