首页 > 解决方案 > 有没有办法定义依赖于内容的 CNN/Keras 接受域

问题描述

背景

我有一个回归问题的二维输入数据,它不是图像,但可以用 10x10 矩阵表示。我知道预测相关的特征只能出现在某些矩阵单元中,这取决于矩阵本身的值。因此,例如,我不想使用 5x5 子集作为 Conv 层的感受野,而是想定义一个过滤器,利用该知识并以不同的方式为感受野使用不同的形状。

标准的方形感受野假设相关特征出现在距所考虑像素最多 X 行/列的像素/单元中。因此,为了过滤单元格 (3,3) 周围的特征,选择了这个子集:

方形感受野

在我的应用程序中,我知道 (3,3) 周围的相关特征出现在行 [列] 中的单元格中,在列 [行] 3 中具有值 1,即重要的接受域是:

内容依赖感受野 结果子集是: 内容依赖的感受野

即,我首先查找在 (.,3) 处具有 1 的行,然后查找在 (3,.) 处具有 1 的列,并将它们组合成一个新矩阵。为简单起见,假设这总是给我 5x5 矩阵。

选择这个子集的代码很简单:

from numpy import array
Tfull = array([ [1, 0, 0, 1, 0, 1, 0, 1, 0, 1],
                [0, 1, 0, 1, 0 ,0, 1, 0, 0, 0],
                [1, 0, 0, 0, 0, 1, 0, 0, 1, 1],
                [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
                [0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
                [0, 0, 0, 0, 0, 0, 0, 1, 1 ,0],
                [0, 1, 1, 1, 0, 1, 0, 1, 0, 1],
                [1, 0, 0, 1, 0, 1, 0, 0, 0, 0],
                [0, 1, 1, 0, 1, 0, 1, 0, 0, 1],
                [0, 0, 1, 1, 0, 1, 0, 1, 1, 0]])
Trf = Tfull[[j for j in range(0,10) if Tfull[j,2]==1 or j==2]][...,[i for i in range(0,10) if Tfull[2,i]==1 or i==2]]

我需要什么

我想在 Keras 中定义一个层(例如,按照这个解释),它的行为类似于标准的 Conv 层,但不是对每个可能的 5x5 子集应用相同的过滤器,它应该对每个选择的子集应用相同的过滤器上面的规则:

class MyLayer(Layer):
    def __init__(self, output_dim, **kwargs):
        ...
    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                  shape=(input_shape[1], self.output_dim),
                                  initializer='uniform',
                                  trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this at the end
    def call(self, x):
        ...
    def compute_output_shape(self, input_shape):
        ...

(从上面的链接复制的代码)

如何合并我对感受野的定义,以拥有一个使用此内容相关感受野而不是输入数据的 NxN 子集的 Conv 层?

标签: pythonkerasconv-neural-network

解决方案


推荐阅读