Как расширить вывод GlobalAveragePooling2D (), чтобы он подходил для BiSeNet? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь построить BiseNet, показанный на рисунке "https://github.com/Blaizzy/BiSeNet-Implementation".

Когда я хочу использовать GlobalAveragePooling2D () в Keras (tf-backend), чтобы завершить уточненный модуль на рисунке (b), я нахожу, что выходная форма GlobalAveragePooling2D () не подходит для следующей свертки.

Я проверил многие реализации кода BiSeNet в github, однако большинство из них использует взамен AveragePooling2D (size = (1,1)). Но AveragePooling2D (size = (1,1)) совершенно бессмысленный.

Таким образом, я определяю слой Lambada, чтобы делать то, что я хочу (выбранный код показан ниже). Слой Lambada работает, но выглядит очень некрасиво:

def samesize_globalAveragePooling2D(inputtensor):
    # inputtensor shape:(?, 28,28,32)
    x = GlobalAveragePooling2D()(inputtensor) # x shape:(?, 32)
    divide = tf.divide(inputtensor, inputtensor)  # divide shape:(?, 28,28,32)
    x2 = x * divide  # x2 shape:(?, 28,28,32)



global_pool = Lambda(function=samesize_globalAveragePooling2D)(conv_0)

Надеюсь получить предложение сделать эту Ламбаду более изящной.

Спасибо!

1 Ответ

0 голосов
/ 14 июня 2019

Это можно сделать с помощью лямбда-слоя на tf.reduce_mean.

tf.keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis=[1, 2], keep_dims=True))
...