Как создать пользовательский слой keras "min pooling", но игнорировать нули? - PullRequest
1 голос
/ 23 апреля 2019

Я работаю над нейронными сетями с кератом и бэкэндом тензорного потока. Обычно он состоит из сверточного и максимального пула слоев, как, например, в vgg16. Для моей нейронной сети я хотел бы изменить максимальные уровни пула на минимальные слои пула, но слой должен игнорировать нули при объединении.

Например:

[[0, 16], [72, 0]] слой пула 2x2 должен объединять 16 вместо 72 (максимальное объединение).

Есть ли в keras простой способ написать этот пользовательский слой?

Я думаю, что минимальное объединение возможно через

min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))

Теперь дополнительно следует игнорировать нули как минимумы. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 26 апреля 2019

Одним из возможных решений, которое я нашел, является следующее. Это своего рода обходной путь с минимальным объединением, добавление высокого значения ко всем нулям до минимального объединения и после минимального объединения, снова вычитая это высокое значение. Я все еще ищу лучшее решение для этой проблемы, так как считаю, что это не самый лучший способ, особенно в отношении производительности.

def min_pool2d(x):

    max_val = K.max(x) + 1 # we gonna replace all zeros with that value
    # replace all 0s with very high numbers
    is_zero = max_val * K.cast(K.equal(x,0), dtype=K.floatx())
    x = is_zero + x

    # execute pooling with 0s being replaced by a high number
    min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))

    # depending on the value we either substract the zero replacement or not
    is_result_zero = max_val * K.cast(K.equal(min_x, max_val), dtype=K.floatx()) 
    min_x = min_x - is_result_zero

    return min_x # concatenate on channel

...