объединение выходов CNN и DNN в качестве входа в новую сеть в керасе - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь тренировать сложную модель с несколькими типами ввода. проблема - потеря не падает, я думаю, что это из-за неправильной топологии сети. Мой код правильный?

Модель:

Введите:

а. 6 изображений. 5 схожи по содержанию, а 1 - случайное изображение.

б. Текстовый запрос, описывающий 5 похожих изображений.

вывод:

модель должна предсказать, является ли случайное изображение аналогичным запросу и 5 другим изображениям или нет (да или нет вопрос - двоичный вывод).

проблема - потеря не падает, я думаю, что это из-за неправильной топологии сети.

def text_dnn(input_shape): #text query converted to vectors using word2vec 
    model = Sequential()
    model.add(Flatten(input_shape=input_shape)) 
    model.add(Dense(1024, activation='relu', name='text_combination'))
    model.add(Dropout(0.5))
    model.add(Dense(128, activation='relu', name='text_feature_vector'))
    return model

def image_cnn(input_shape,number_of_examples):
    images_inputs = [Input(image_input_shape) for i in range(5+1)]
    vgg_16= VGG16(weights='imagenet' ,input_shape=(224, 224, 3))
    vgg_16= Model(inputs=vgg_16.input, outputs=vgg_16.get_layer('fc2').output)
    model = Sequential()
    model.add(vgg_16)
    image_layer_combination = [model(image_input) for image_input in images_inputs]
    combination_layer  = concatenate(image_layer_combination)
    fc_1 = Dense(2048,activation='relu', name='image_combination')(combination_layer)
    image_model  = Model(inputs=images_inputs,outputs=fc_1)
    return image_model

def mergeCnnModel(cnnModel, cnnModel2):
    merged = concatenate([cnnModel.layers[-1].output, cnnModel2.layers[-1].output])
    dense1 = Dense(1024, activation='relu', name='image_text_combination')(merged)
    drop1 = Dropout(0.5)(dense1)
    dense2 = Dense(128, activation='relu', name='feature_vector')(drop1)
    outputs = Dense(1, activation='sigmoid')(dense2)
    model = Model(inputs=cnnModel.inputs+cnnModel2.inputs, outputs=outputs)
    return model


def get_complex_model(image_input_shape, number_of_examples,text_input_shape):

    #text branch
    text_model = text_dnn(text_input_shape)
    #images branch
    image_model=image_cnn(image_input_shape, number_of_examples)
    #merge branches
    new_model= mergeCnnModel(image_model,text_model )
    return new_model

combined_model  = get_complex_model(image_input_shape,number_of_examples,text_input_shape)

Модель тренируется, но потери остаются прежними.

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