Что делает keras.layers.concatenate? - PullRequest
       121

Что делает keras.layers.concatenate?

1 голос
/ 24 февраля 2020

Я наткнулся на следующий код и мне было интересно, что именно keras.layers.concatenate делает в этом случае.

Наилучшее предположение:

  1. В fire_module(), y обучения на основе каждого пикселя (kernel_size=1)
  2. y1 обучения на основе каждого пикселя activation map из y (kernel_size=1)
  3. y3 обучается на основе области 3x3 пикселей activation map из y (kernel_size=3)
  4. concatenate объединяет y1 и y3 вместе, что означает общее filters теперь является суммой фильтров в y1 и y3
  5. Эта конкатенация представляет собой среднее значение для обучения, основанного на каждом пикселе, обучения, основанного на 3x3, оба основаны на предыдущей карте активации, основанной на каждый пиксель, что делает модель лучше?

Любая помощь приветствуется.

def fire(x, squeeze, expand):
    y  = Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
    y  = BatchNormalization(momentum=bnmomemtum)(y)
    y1 = Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
    y1 = BatchNormalization(momentum=bnmomemtum)(y1)
    y3 = Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
    y3 = BatchNormalization(momentum=bnmomemtum)(y3)
    return concatenate([y1, y3])

def fire_module(squeeze, expand):
    return lambda x: fire(x, squeeze, expand)
x = Input(shape=[144, 144, 3])
y = BatchNormalization(center=True, scale=False)(x)
y = Activation('relu')(y)
y = Conv2D(kernel_size=5, filters=16, padding='same', use_bias=True, activation='relu')(x)
y = BatchNormalization(momentum=bnmomemtum)(y)

y = fire_module(16, 32)(y)
y = MaxPooling2D(pool_size=2)(y)

Редактировать:

Чтобы быть немного более точным c, почему бы не иметь это:

# why not this?
def fire(x, squeeze, expand):
    y  = Conv2D(filters=squeeze, kernel_size=1, activation='relu', padding='same')(x)
    y  = BatchNormalization(momentum=bnmomemtum)(y)
    y = Conv2D(filters=expand//2, kernel_size=1, activation='relu', padding='same')(y)
    y = BatchNormalization(momentum=bnmomemtum)(y)
    y = Conv2D(filters=expand//2, kernel_size=3, activation='relu', padding='same')(y)
    y = BatchNormalization(momentum=bnmomemtum)(y)
    return y

1 Ответ

0 голосов
/ 24 февраля 2020

Я цитирую @parsethis из этого вопроса стека , когда он объяснил конкатенацию, это то, что он делает, если a объединяется с b (результаты объединяются):

    a        b         c
a b c   g h i    a b c g h i
d e f   j k l    d e f j k l

В документации говорится, что она просто возвращает тензор, содержащий конкатенацию всех входных данных, при условии, что они имеют одно измерение (т.е. одинаковую длину или длину, в зависимости от оси)

Что произошло в вашем дело выглядит так:

Y 
 \
  Y1----
   \    |
    Y3  Y1

Надеюсь, я достаточно ясно

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