В функционале 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
.
