Я изучаю Keras и использование функционального API, в частности, об использовании предварительно обученной модели VGG16 для другой задачи классификации, и я наткнулся на этот фрагмент кода:
baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))
headModel=baseModel.output
headModel=Flatten(name="flatten")(headModel)
headModel=Dense(D, activation="relu")(headModel)
headModel=Dropout(0.5)(headModel)
headModel = Dense(classes, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)
последняя строка, в частности, часть baseModel.input
- это то, что меня смущает. В официальном учебнике аргумент inputs
получает тензор, указывающий, каким должен быть входной слой, и outputs
остальная часть модели:
from keras.models import Model
from keras.layers import Input, Dense
a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)
Эта модель будет включатьвсе слои, необходимые для вычисления b, имеют значение a.
Однако в предыдущем примере baseModel.input
используется для указания всей модели VGG16, за исключением слоя, использованного для создания headModel
(новыйраздел). Из документации свойство input
наследуется от объекта Layer :
input
Извлекает входной тензор (ы) слоя.
Как класс Model
может построить полную модель VGG16 + headModel, если я указываю только в конструкторе входной тензор модели как inputs
?