Есть ли способ активировать выпадение во время вывода в Keras, при замораживании слоев пакетной нормы

Я пытаюсь использовать слои исключения в моей модели во время вывода для измерения неопределенности модели, как описано в метод, описанный Юрином Галом

Решение описано в этом сообщении: Как рассчитать неопределенность прогноза с помощью Keras?, который определяет новую функцию Keras self.f = K.function([self.graph.layers[0].input, K.learning_phase()], [self.graph.layers[-1].output])

Однако этот метод не работает, если используемая модель имеет уровни пакетной нормализации. Так как это заставит модель не использовать среднее значение и дисперсию, полученные во время обучения, а установить новые в зависимости от текущего пакета.

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

Я использую Keras effectiveNet B0 в качестве модели, обученной на пользовательских данных keras_efficientNet

Я уже пробовал сам менять настройки слоев

`
        for layer in self.graph.layers[4].layers:
            if 'batch_norm' in layer.name:
                layer._trainable = False
                layer._inbound_nodes[0].output_tensors[0]._uses_learning_phase = False
                layer._inbound_nodes[0].input_tensors[0]._uses_learning_phase = False
            if 'dropout' in layer.name:
                layer._inbound_nodes[0].output_tensors[0]._uses_learning_phase = True
            for weight in self.graph.layers[4].weights:
                if 'batch_norm' in weight.name:
                    weight._trainable = False`

Тем не менее, ничего из этого не сработало.


person Hammamramma    schedule 12.06.2020    source источник


Ответы (2)


Этот вопрос продублирован, на него уже дан ответ здесь Как применить метод исключения Монте-Карло в тензорном потоке для LSTM, если пакетная нормализация является частью модели?

По сути, когда вы определяете свою модель, вы должны добавить training=True в свой слой Dropout.

inputs = tf.keras.Input(...) 
x = tf.keras.layers.___(...)(input)
...
x = tf.keras.layers.Dropout(...)(x, training=True)
...

В случае, если вы не можете изменить код конструктора модели, вы можете изменить его следующим образом (не мое любимое решение) [1].

# load model
model_config = model.get_config()
layer_index = 3 # layer index you want to modify
model_config['layers'][layer_index]['inbound_nodes'][0][0][-1]['training'] = True
model = tf.keras.models.model_from_config(model_config)
person Pedrolarben    schedule 12.06.2020
comment
Спасибо за быстрый ответ. проблема в том, что я не определяю модель снова. Я использую его только для вывода и не хочу снова его тренировать. Я использую функцию загрузки из keras.model для загрузки уже обученной модели .h5. есть ли способ изменить определение модели при ее загрузке таким образом? - person Hammamramma; 12.06.2020

спасибо @pedrolarben за ваше решение, оно мне очень помогло, но было неполным!

что, наконец, сработало, было следующее

  1. model_config = self.graph.get_config()
  2. вам необходимо изменить inbound_nodes конфигурации слоя, а не inbound_nodes напрямую model_config['layers'][layer_index]['config']['layers'][index_of_dropout_layer]['inbound_nodes'][0][0][-1]['training'] = True

  3. перезагрузите модель: (как указано в этом ответе Обратный к keras.models.Model.get_config () кажется keras.models.Model .from_config (), а не keras.models.model_from_config ()):

model = Model.from_config(model_config)

  1. И, наконец, вам нужно снова загрузить веса, иначе ваша модель инициализируется случайным образом model.load_weights(self.graph_path)

Примечание: это работает для реализации keras в effectiveNet.

person Hammamramma    schedule 16.06.2020