Объедините выходные данные двух предварительно обученных моделей (обученных на разных наборах данных) и используйте некоторую форму двоичного классификатора для прогнозирования изображений - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть две предварительно обученные модели.

Model_1 = Inception Model with Imagenet Dataset (1000 classes)

My_Model = Inception Model trained with a custom dataset (20 classes) через трансферное обучение и тонкую настройку

Я хотел бы объединить выходы обеих моделей (Model_1 и My_Model) в новом слое.

Новый слой должен использовать некоторый двоичный классификатор, чтобы указать, использовать ли Model_1 или My_Model для прогнозирования на основе входного изображения.

Например:

Если я пытаюсь предсказать изображение «Собаки», двоичный классификатор, который объединяет обе модели, должен сказать, что мне нужно использовать Model_1 для предсказания изображения «Собаки» (поскольку набор данных My_Model не обучается с изображением «Собаки»), тогда как Model_1 обучен с изображениями собак.

Может кто-нибудь сказать мне, как этого добиться? Будет полезен пример реализации или фрагмент кода.

Спасибо

1 Ответ

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

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

import numpy as np
import pandas as pd
import keras
from keras.layers import Dense, Flatten, Concatenate
from tensorflow.python.client import device_lib
# check for my gpu 
print(device_lib.list_local_devices())


# making some models like the ones you have
input_shape = (10000, 3)
m1_input = Input(shape = input_shape, name = "m1_input")
fc = Flatten()(m1_input)
m1_output = Dense(1000, activation='sigmoid',name = "m1_output")(fc)
Model_1 = Model(m1_input,m1_output)

m2_input = Input(shape = input_shape, name = "m2_input")
fc = Flatten()(m2_input)
m2_output = Dense(20, activation='sigmoid',name = "m2_output")(fc)
My_Model = Model(m2_input,m2_output)


# set the trained models to be untrainable
for layer in Model_1.layers:
    layer.trainable = False
for layer in My_Model.layers:
    layer.trainable = False

#build a combined model
combined_model_input = Input(shape = input_shape, name = "combined_model_input")
m1_predict = Model_1(combined_model_input)
m2_predict = My_Model(combined_model_input)
combined = Concatenate()([m1_predict, m2_predict])
fc = Dense(500, activation='sigmoid',name = "fc1")(combined)
fc = Dense(100, activation='sigmoid',name = "fc2")(fc)
output_layer = Dense(1, activation='tanh',name = "fc3")(fc)
model = Model(combined_model_input, output_layer)

#check the number of parameters that are trainable
print(model.summary())

#psudocode to show how to make a training set for the combined model:

    combined_model_y= []
    for im in images:
        if class_of(im) in list_of_my_model_classes:
            combined_model_y.append(1)
        else:
            combined_model_y.append(-1)
    combined_model_y = np.array(combined_model_y)

# then train the combined model:
model.compile('adam', loss = 'binary_crossentropy')
model.fit(images, combined_model_y, ....)

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