python - 有没有办法定义依赖于内容的 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 层?
解决方案
推荐阅读
- angular - 角度构建中的 AOT 模式添加 `fr.` 或 `en.` 作为 transloco 中翻译键的前缀
- c - 如何使用 MCC 将 I2C 与 XC16 结合使用 - Microchip
- regex - 正则表达式匹配列中的 2 个单词
- jquery - 为什么我的轮播滑块中的图像没有响应?
- java - 如何解析 Java 中的任何 URL/URI?
- apache-kafka - 如果 kafka connect 的 debezium 源连接器无法生成到 kafka 怎么办
- forms - 如何在 SwiftUI 中的表单底部添加空格?
- python-3.x - 如何从 Python 生成的动态循环中删除空值?
- python - 如何获取dict列表的索引并将dict添加到每个索引?
- symfony - 在 symfony 中创建另一个实例的空副本