Фон
У меня есть двумерные входные данные для задачи регрессии, которая не является изображением, но может быть представлена в матрице 10x10. Я знаю, что функции, связанные с предсказанием, могут появляться только среди определенных ячеек матрицы, которые зависят от значений в самой матрице. Поэтому вместо того, чтобы, например, использовать подмножества 5x5 в качестве восприимчивых полей для Conv Layer, я хочу определить фильтр, который будет использовать эти знания и по-разному использовать другую форму для восприимчивого поля.
Стандартные квадратные рецептивные поля предполагают, что соответствующие элементы появляются в пикселях / ячейках, которые находятся на расстоянии не более X строк / столбцов от рассматриваемого пикселя. Итак, для фильтрации объектов вокруг ячейки (3,3) выбрано это подмножество:

В моем приложении я знаю, что соответствующие элементы вокруг (3,3) появляются среди ячеек в строках [столбцах], имеющих значение 1 в столбце [строке] 3, то есть имеет значение принимающее поле:
Результат подмножества:
т.е. Сначала я ищу строки со значением 1 в (., 3), а затем столбцы со значением 1 в (3 ,.) и объединяю их в новую матрицу. Для простоты предположим, что это всегда дает мне матрицу 5х5.
Код для выбора этого подмножества прост:
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 Layer, но вместо применения того же фильтра к каждому возможному подмножеству 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 Layer, который использует это зависимое от содержимого рецептивное поле вместо NxN подмножества входных данных?