Как внести вклад в средний слой в керасе - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу использовать предварительно обученный vgg-19 после добавления последнего слоя и добавления слоя 2 FC (Dense). Я хочу дать вход для одного из этих слоев FC двоичной переменной (мужской или женский). Как мне этого добиться.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Если вы хотите повторно использовать слои old_model с 5-го уровня для вывода в качестве новой модели, вам необходимо перестроить модель следующим образом, ключевой момент - определить Input и передать это до 5-го слоя. это может выглядеть так: FC = ... # your FC layers old_model = models.load_model(MODEL_DIR) old_model.layers.pop(-1) # Get rid of the classification layer for i in range(4): # Get rid of the first 4 layer old_model.layers.pop(0) # care pop index while iterating input = Input(shape=(INPUT_DIM,)) new_model = Model(inputs=input, outputs=FC(old_model(input)))

0 голосов
/ 30 апреля 2018

Что вам нужно, сеть с двумя входами и одним выходом, где каждый вход имеет свое собственное извлечение признаков и обе функции объединены перед предсказанием окончательного выхода.

Ниже приведен пример.

import keras
from keras.applications.vgg19 import VGG19
from keras.layers import Input, Dense, Concatenate
from keras.models import Model

#-------------------------------------------------------------------------------
# Define your new inputs
# Here I pretend that your new task is a classification task over 100 classes
#-------------------------------------------------------------------------------
gender_input = Input(shape=(1,), name='gender_input')
image_input  = Input(shape=(224,224,3), name='image_input')
num_classes  = 100
#-------------------------------------------------------------------------------
# define your pretrained feature extraction
# you may do something different than below
# but the point here is to have a pretrained model for `featex`
# so you may define it differently
#-------------------------------------------------------------------------------
pretrained   = VGG19()
featex       = Model( pretrained.input, pretrained.layers[-2].output, name='vgg_pop_last' )
# consider to freeze all weights in featex to speed-up training
image_feat   = featex( image_input )
#-------------------------------------------------------------------------------
# From here, you may play with different network architectures
# Below is just one example
#-------------------------------------------------------------------------------
image_feat   = Dense(128, activation='relu', name='image_fc')( image_feat )
gender_feat  = Dense(16, activation='relu', name='gender_fc')( gender_input )
# mix information from both information
# note: concatenation is only one of plausible way to mix information
concat_feat  = Concatenate(axis=-1,name='concat_fc')([image_feat, gender_feat])
# perform final prediction
target       = Dense(num_classes, activation='softmax', name='pred_class')( concat_feat )
#-------------------------------------------------------------------------------
# Here is your new model which contains two inputs and one new target
#-------------------------------------------------------------------------------
model = Model( inputs=[image_input, gender_input], outputs=target, name='myModel')

print model.summary()
...