Есть ли способ определить рецептивные поля CNN / Keras, которые зависят от содержимого - PullRequest
0 голосов
/ 28 апреля 2019

Фон

У меня есть двумерные входные данные для задачи регрессии, которая не является изображением, но может быть представлена ​​в матрице 10x10. Я знаю, что функции, связанные с предсказанием, могут появляться только среди определенных ячеек матрицы, которые зависят от значений в самой матрице. Поэтому вместо того, чтобы, например, использовать подмножества 5x5 в качестве восприимчивых полей для Conv Layer, я хочу определить фильтр, который будет использовать эти знания и по-разному использовать другую форму для восприимчивого поля.

Стандартные квадратные рецептивные поля предполагают, что соответствующие элементы появляются в пикселях / ячейках, которые находятся на расстоянии не более X строк / столбцов от рассматриваемого пикселя. Итак, для фильтрации объектов вокруг ячейки (3,3) выбрано это подмножество:

square receptive field

В моем приложении я знаю, что соответствующие элементы вокруг (3,3) появляются среди ячеек в строках [столбцах], имеющих значение 1 в столбце [строке] 3, то есть имеет значение принимающее поле:

content dependent receptive field Результат подмножества: content-dependent receptive field

т.е. Сначала я ищу строки со значением 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 подмножества входных данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...