Не уверены в функциональности API Keras для тонкой настройки - PullRequest
0 голосов
/ 09 ноября 2019

Я изучаю 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?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

baseModel.input - это слой Input сети VGG, в то время как baseModel.output является символическим тензором выходных данных модели, поэтому, когда вы строите больше слоев поверх baseModel.output, вы неявно подключаетесь ктот же вычислительный график модели VGG, поэтому класс Model может проследить вывод вашего последнего слоя Dense (переменная headModel) на вход сети VGG.

Этовыполняется внутренне, когда keras отслеживает символические тензоры, используемые для построения модели. В конце концов, в этом и заключается смысл функционального API - легко создавать модели поверх других предварительно созданных моделей.

0 голосов
/ 09 ноября 2019

Я бы сказал, что при создании экземпляра безголового VGG автоматически создается входной слой, который возвращает значение baseModel.input. Затем он отслеживает все вычисления до последнего headModel, поэтому существует график между baseModel.input до headModel.output.

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