Очень простой подход - сделать l oop внутри вашей собственной модели:
inputs = Input(...)
#part 1 layers:
layer1 = SomeLayer(...)
layer2 = SomeLayer(...)
layer3 = SomeLayer(...)
intermediateLayer = IntermediateLayer(...)
#first pass:
out = layer1(inputs)
out = layer2(out)
out = layer3(out)
intermediate_out = intermediateLayer(out)
#second pass:
out = layer1(intermediate_out)
out = layer2(out)
out = layer3(out)
second_pass_out = intermediateLayer(out)
#rest of the model - you decide wheter you need the first pass or only the second
out = SomeLayer(...)(second_pass_out)
out = SomeLayer(...)(out)
...
final_out = FinalLayer(...)(out)
Затем модель получит:
model = Model(inputs, final_out)
Вы можете, в зависимости от ваших целей Заставьте только второй проход участвовать в тренировке, блокируя градиенты от первого прохода.
#right after intermediate_out, before using it
intermediate_out = Lambda(lambda x: K.stop_gradients(x))(intermediate_out)
Вы также можете создать больше моделей, которые будут совместно использовать эти слои, и использовать каждую модель для определенной цели, в то время как они всегда будут обновляться вместе (так как они используют одни и те же слои).
Обратите внимание, что в «части 1» есть слои, которые «повторно используются».
В то время как в «остальной части модели» слои не «повторно используются», если по какой-то причине вам необходимо повторно использовать слои для второй части, вы должны сделать это так же, как это было сделано для "части 1".