有人为keras写过weldon pooling吗?

有人为keras写过weldon pooling吗?,keras,max-pooling,Keras,Max Pooling,Weldon池[1]是否已在Keras中实施 我可以看到,作者[2]已经在pytorch中实现了它,但找不到与keras等效的版本 [1] T.杜兰德、N.托姆和M.科德。韦尔登:苏- 深度卷积神经网络的监督学习。在里面 CVPR,2016年。 [2] 这里是一个基于lua版本的版本(有一个pytorch impl,但我认为取max+min的平均值有一个错误)。我假设lua版本的最大值和最小值的平均值仍然是正确的。“我还没有测试整个自定义层方面,但已经足够接近了,可以开始工作了,”欢迎评论 托尼

Weldon池[1]是否已在Keras中实施

我可以看到,作者[2]已经在pytorch中实现了它,但找不到与keras等效的版本

[1] T.杜兰德、N.托姆和M.科德。韦尔登:苏- 深度卷积神经网络的监督学习。在里面 CVPR,2016年。
[2]

这里是一个基于lua版本的版本(有一个pytorch impl,但我认为取max+min的平均值有一个错误)。我假设lua版本的最大值和最小值的平均值仍然是正确的。“我还没有测试整个自定义层方面,但已经足够接近了,可以开始工作了,”欢迎评论

托尼

class WeldonPooling(层):
“”“类来实现带有否定证据的Weldon选择性空间池。”
"""
#@interfaces.legacy\u全局\u池\u支持
定义初始化(self,kmax,kmin=-1,数据格式=None,**kwargs):
超级(WeldonPooling,self)。\uuuuuuuuuuuuuuuuu初始(**kwargs)
self.data\u format=conv\u utils.normalize\u data\u format(数据格式)
self.input\u spec=InputSpec(ndim=4)
self.kmax=kmax
self.kmin=kmin
def计算输出形状(自身、输入形状):
如果self.data\u format=='channels\u last':
返回(输入形状[0],输入形状[3])
其他:
返回(输入形状[0],输入形状[1])
def get_配置(自身):
config={'data_format':self.data_format}
base_config=super(_GlobalPooling2D,self).get_config()
return dict(list(base_config.items())+list(config.items())
def呼叫(自我,输入):
如果self.data\u format==“channels\u last”:
输入=tf.转置(输入[0,3,1,2])
kmax=self.kmax
kmin=self.kmin
shape=tf.shape(输入)
批次大小=形状[0]
通道数=形状[1]
h=形状[2]
w=形状[3]
n=h*w
视图=tf.重塑(输入,[批次大小,通道数,n])
排序,索引=tf.nn.top_k(视图,n,排序=True)
#索引\u max=tf.slice(索引,[0,0,0],[batch\u size,num\u channels,kmax])
输出=tf.div(tf.reduce_sum(tf.slice(排序,[0,0,0],[batch_size,num_channels,kmax]),2),kmax)
如果kmin>0:
#索引\u min=tf.slice(索引,[0,0,n-kmin],[batch\u size,num\u channels,kmin])
输出=tf.add(输出,tf.div(tf.reduce_和(tf.slice(排序,[0,0,n-kmin],[batch_size,num_channels,kmin]),2),kmin))
返回tf.REFORMATE(输出,[批次大小,数量通道])

另请注意,这仅用于TF后端。“tf.”可以用“K.tf.”代替,使其更像Keras-y。对于其他后端,它将需要它们的特定实现,因为没有对所需操作的抽象。