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的后端。
感谢有人提供算法/代码。
我是新手,因为我之前没有写过任何自定义图层,所以有人可以帮忙吗?谢谢!
答案 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.0,这是因为tf不对batch_size和通道执行合并,而是对高度和宽度执行