Возьмите выходные данные промежуточного слоя в качестве входа для обучения модели - PullRequest
0 голосов
/ 21 января 2020

Обычно мы кормим модель для обучения внешними данными. Но я хотел бы использовать тензор из промежуточного слоя той же модели в качестве входных данных для следующей партии. Я считаю, что этого можно добиться, используя для обучения руководство l oop. На этот раз я предпочитаю использовать fit_generator () из Keras (v2.2.4). Я создаю режим с использованием Functional API.

Любая помощь приветствуется. Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Вот как я решаю свою проблему.

model.compile(optimizer=optimizer, loss=loss, metrics=metrics)
model.metrics_tensors =+ [self.model.get_layer('your_intermediate_layer').output]   # This line is to access the output of a layer during training (what I want)

Затем тренируйтесь так:

loss_out, ...., your_intermediate_layer_out = model.train_on_batch(X, y)

your_intermediate_layer_out - это массив numpy, который я ищу во время обучения модели .

0 голосов
/ 21 января 2020

Очень простой подход - сделать 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".

...