各位大神都有自己实现自己的k-max Poling的方法,简单搜索了下用theano实现k-max poling的相关文章,但是确实比较少,也许是各种大神觉得这是个特别简单的问题,所以不屑于发布或者给予发布问题者回答此类问题,下面我给出我自己的实现代码,希望可以解决一部分人的问题:
def k_max_poling(x_conv_hidden, k, hid_dim, map_count):
'''
k-max poling for CNNs if the feature maps are columns argsort(axis = 0)[-k:, :] else argsort(axis = 1)[:, -k:]
@ x_conv_hidden: hidden map generated by convolution layer
@ k: number for max values<pre name="code" class="python"> @ hid_dim: dimension of hidden units'''<pre name="code" class="python"> sorted_indices = x_conv_hidden.argsort(axis = 0)[-k:, :].sort(axis = 0)<pre name="code" class="python"> return T.concatenate([x_conv_hidden[:, i].reshape([hid_dim, ], ndim = 1)[sorted_indices[:, i]].reshape([k, 1], ndim = 2) for i in xrange(map_count)], axis = 1)
代码解释:
sorted_indices = x_conv_hidden.argsort(axis = 0)[-k:, :].sort(axis = 0)
index操作:首先用 .argsort(axis = 0) 对每一列进行降序排列得到并获取排序后的feature map在源feature map中对应的位置;其次,[-k:, :] .sort(axis = 0)取出所有feature map的top k个数(顺序与各元素在源feature map中的相对位置一致);
for i in xrange(map_count)
对于每一个feature map 执行如下操作:
x_conv_hidden[:, i].reshape([hid_dim, ], ndim = 1)[sorted_indices[:, i]].reshape([k, 1], ndim = 2)
将每个feature map扁平化成向量,并且取出对应的top k个数后,将其转化为原来的feature map格式(column)
return T.concatenate([], axis = 1)
最后对所有feature maps重新组合,返回得到k-max poling结果。
就这么两行代码就解决问题,这个是对于feature map是vector的情况,至于对于feature map 是matrix的情况需要运行两次,将第一次运行得到的结果作为第二次 运行的输入,并且对于feature map是row的情况,将行列互换即可(可以根据自己的实际需要进行灵活转换)。