Как использовать один и тот же слой / модель дважды в одной модели в Керасе? - PullRequest
2 голосов
/ 06 февраля 2020

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

После создания кодера и финальной подмодели я попытался создать окончательную комбинированную модель со следующей строкой:

combinedModel = keras.Model(inputs=[encoder.input, encoder.input], outputs=finalSubModel)

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

ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once. Found: [<tf.Tensor 'input_2:0' shape=(None, 32, 32, 1) dtype=float32>, <tf.Tensor 'input_2:0' shape=(None, 32, 32, 1) dtype=float32>]

Возможно ли использовать одну и ту же субмодель дважды в одной модели в керасе, или Я должен использовать отдельные кодировщики для двух разных классов изображений, которые я использую?

1 Ответ

2 голосов
/ 06 февраля 2020

Предположим, у вас есть модель, построенная с использованием следующей функции:

def make_encoder(h, w, c):
    inp = Input((h, w, c))
    x = SomeLayer()(inp)
    x = SomeLayer()(x)
    ....
    out = OutLayer()(x)
    return Model(inputs=[inp], outputs=[out])

Теперь, чтобы создать комбинированную модель, вам нужно использовать один и тот же кодер с разными Input слоями для каждого вызова. Чтобы понять последнюю строку, взгляните ниже:

def make_combined(h, w, c):
    inp1 = Input((h, w, c))
    inp2 = Input((h, w, c))
    encoder = make_encoder(h, w, c)

    encoded_1 = encoder(inp1)
    encoded_2 = encoder(inp2)

    # Concatenate the result
    encoded_out = Concatenate()([encoded_1, encoded_2])

    return Model(inputs=[inp1, inp2], outputs=[encoded_out])

Обратите внимание, я использую два разных фиктивных слоя Input для предоставления отдельных входов одному и тому же кодеру.

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