Керас: Как вычесть выходные данные двух разных моделей и подать на другую модель? - PullRequest
1 голос
/ 06 ноября 2019

Я получаю одинаковые размеры от двух разных моделей. Я хочу вычесть эти два вывода и дать результат в качестве входных данных для формирования новой модели. Но, к сожалению, я получаю следующую ошибку:

Объект 'Вычитать' не может быть подписан

Мой код:

# create a data generator
datagen2 = ImageDataGenerator(horizontal_flip=True,brightness_range=[0.7,1.0],rotation_range=10,width_shift_range=[-10,10],preprocessing_function=preprocess_input)
# load anad iterate training dataset
train_it2 = datagen2.flow_from_directory('DATA/train/', class_mode='categorical', batch_size=50,subset='training',target_size=(224, 224),shuffle=True)
test_it2 = datagen2.flow_from_directory('DATA/val/', class_mode='categorical', batch_size=50,target_size=(224, 224))
#subtract layer model

model_del1 = VGG16(include_top=False, weights='imagenet')
#add layers
model_del1_x = Conv2D(512, (3, 3), activation='relu',kernel_regularizer=l2(0.001), bias_regularizer=l2(0.002))(model_del1.output)
model_del1_x = Conv2D(4,(1,1), activation='relu')(model_del1_x)
model_del1_x = GlobalAveragePooling2D()(model_del1_x)

model_del1 = Model(inputs=model_del1.input, outputs=model_del1_x)
#print(model_del1.summary())


model_del2 = VGG16(include_top=False, weights='imagenet')
#add layers
model_del2_x = Conv2D(512, (3, 3), activation='relu',kernel_regularizer=l2(0.001), bias_regularizer=l2(0.002))(model_del2.output)
model_del2_x = Conv2D(4,(1,1), activation='relu')(model_del2_x)
model_del2_x = GlobalAveragePooling2D()(model_del2_x)

model_del2 = Model(inputs=model_del2.input, outputs=model_del2_x)
#print(model_del2.summary())

model_del_fin = keras.layers.Subtract()[model_del1_x, model_del2_x]

model_del_fin_x = Activation('softmax')(model_del_fin)
model_del_fin = Model(inputs=model_del_fin.input, outputs=model_del1_x)
print(model_del_fin.summary())

Я также пытался model_del_fin = keras.layers.Subtract()[model_del1.output, model_del2.output], но получил ту же ошибку.

Пожалуйста, скажите мне, какую ошибку я совершаю, а также как ее исправить?

1 Ответ

2 голосов
/ 06 ноября 2019

В Python object[a] всегда означает: индекс в ('индекс') object через a;вам нужно вызвать object, чтобы вызвать метод call (и, следовательно, использовать его как функцию):

keras.layers.Subtract()[model_del1.output, model_del2.output]   # INCORRECT
keras.layers.Subtract()([model_del1.output, model_del2.output]) # CORRECT

Это, однако, не решит всей проблемы - которая зависит от предполагаемого использования;в ожидании разъяснения.


Обновление : см. комментарии;OP, кажется, понял это. Чтобы завершить этот ответ: цель состоит в том, чтобы backpropagate вычитать выходные данные модели для всего ансамбля, включая две модели, выходные данные которых вычитаются.

Для этого требуется полностью связанный график от каждой из двух моделей Input s до выхода третьей модели;например, model3 = Model(inputs=[model1.input, model2.input], out). Затем данные можно подавать как model3.fit([x1, x2]) или, если x1 == x2, model3.fit([x1, x1]), где x1 подается на model1.input, x2 подается на model2.input.

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