Понимание того, что (x) и (x_1) делают в мобильной сети Keras SSD - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь понять код SSD Keras и у меня возникли некоторые проблемы, особенно с функциями Conv2d, Lambda и Input.

Что я понимаю, так это

Функция ввода будет принимать кортеж размером 3 (скажем, (x, y, z)). Затем у меня возникают проблемы с пониманием того, что делают (x), (x_1) и lambda ()?

x = Input(shape=(img_height, img_width, img_channels))

x1 = Lambda(lambda z: z,
            output_shape=(img_height, img_width, img_channels),
            name='idendity_layer')(x)
conv1_1 = Conv2D(64, (3, 3), activation='relu', padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(l2_reg), name='conv1_1')(x1)

Так что мне трудно понять, что делают (x) и (x1). Кроме того, что означает создание функции Lambda ().

1 Ответ

0 голосов
/ 22 мая 2019

В функционале Keras результат операции необходимо передать следующей операции, которую вы можете увидеть из первой и второй строк вашего примера кода: x подается в x1, так же как x1 подается в conv1_1. Причина, по которой они имеют уникальные имена переменных (а не просто распространяющуюся переменную x), заключается в том, что на них можно ссылаться несколько раз, если вы хотите отправить тензор нескольким различным маршрутам операций.

В этом случае входной тензор x входит в сеть через x1, который, помимо прочего, передается в conv1_1. Как видно из изображения внизу этого поста, некоторые слои выводятся на несколько слоев. Например, блок 16 переходит к блоку 17 и ко второму сверточному уровню сети SSD. Рассмотрим следующий пример фрагмента кода, в котором показан один тензор, подающий несколько слоев и собравшийся в конце.

input_tensor = Input(shape=(28,28,3)

x1 = Conv2D(64,(3,3),padding='same')(input_tensor)
x2 = Conv2D(64,(2,2),padding='same')(input_tensor)

x1 = GlobalMaxPooling2D()(x1)
x2 = GlobalAveragePooling2D()(x2)

x = concatenate([x1,x2])
x = Dense(5, activation='softmax')(x)

model = Model(input_tensor, x) # in and out

Относительно лямбды ... В этом случае лямбда лишняя, так как слой Conv2D conv1_1 мог бы обработать свою функцию здесь, но мог бы быть добавлен для ясности. Поскольку лямбда-функция внутри лямбда-функции, по сути, просто z : z, она фактически не выполняет никаких операций. В этом случае он служит точкой входа для тензора x.

SSD MobileNet

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