有没有一种方法可以定义依赖于内容的CNN / Keras接收字段

时间:2019-04-28 16:56:05

标签: python keras conv-neural-network

背景

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

标准的正方形接收场假定相关特征出现在距离所考虑像素最多X行/列的像素/单元中。因此,要过滤单元格(3,3​​)周围的特征,请选择以下子集:

square receptive field

在我的应用程序中,我知道(3,3)周围的相关特征出现在行[column]的行中,该行的第[row] 3列的值为1,即重要的接受域是:

content dependent receptive field resultig子集为:content-dependent receptive field

即我首先寻找在(。,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中定义一个层(例如,遵循此explanation),其行为类似于标准的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):
        ...

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

如何结合我对接收域的定义,使Conv层使用依赖于内容的接收域而不是输入数据的NxN子集?

0 个答案:

没有答案