Слой исключения все еще активен в замороженной модели Keras (т.е. обучаемый = False)?

У меня есть две обученные модели (model_A и model_B), и у обеих есть слои исключения. Я заморозил model_A и model_B и объединил их с новым плотным слоем, чтобы получить model_AB (но я не удалял выпадающие слои model_A и model_B). Вес model_AB нельзя будет тренировать, за исключением добавленного плотного слоя.

Теперь мой вопрос: активны ли выпадающие слои в model_A и model_B (т. Е. Отбрасывающие нейроны), когда я тренируюсь model_AB?


person 陳建勤    schedule 15.08.2019    source источник


Ответы (1)


Краткий ответ: выпадающие слои будут продолжать отбрасывать нейроны во время обучения, даже если вы установите для их свойства trainable значение False.

Длинный ответ: в Керасе есть два разных понятия:

  • Обновление весов и состояний слоя: это контролируется с помощью свойства trainable этого слоя, т.е. если вы установите layer.trainable = False, веса и внутренние состояния слоя не будут обновляться.

  • Поведение уровня на этапах обучения и тестирования: как вы знаете, уровень, например отсев, может вести себя по-разному на этапах обучения и тестирования. Фаза обучения в Keras устанавливается с помощью keras.backend.set_learning_phase(). Например, когда вы вызываете model.fit(...), фаза обучения автоматически устанавливается на 1 (т. Е. Обучение), тогда как при использовании model.predict(...) она автоматически устанавливается на 0 (т. Е. Тест). Кроме того, обратите внимание, что фаза обучения 1 (т.е. обучение) не обязательно подразумевает обновление весов / состояний слоя. Вы можете запустить свою модель с этапом обучения 1 (т.е. этап обучения), но веса не будут обновляться; просто слои переключатся на свое поведение при обучении (дополнительную информацию см. в этом ответе). Кроме того, есть еще один способ установить фазу обучения для каждого отдельного слоя, передав аргумент training=True при вызове уровня в тензоре (см. этот ответ для получения дополнительной информации).

Таким образом, в соответствии с приведенными выше пунктами, когда вы устанавливаете trainable=False в слое исключения и используете его в режиме обучения (например, вызывая model.fit(...) или вручную устанавливая этап обучения для обучения, как в примере ниже), нейроны все равно будут отброшены слоем исключения. .

Вот воспроизводимый пример, иллюстрирующий эту точку зрения:

from keras import layers
from keras import models
from keras import backend as K
import numpy as np

inp = layers.Input(shape=(10,))
out = layers.Dropout(0.5)(inp)

model = models.Model(inp, out)
model.layers[-1].trainable = False  # set dropout layer as non-trainable
model.compile(optimizer='adam', loss='mse') # IMPORTANT: we must always compile model after changing `trainable` attribute

# create a custom backend function so that we can control the learning phase
func = K.function(model.inputs + [K.learning_phase()], model.outputs)

x = np.ones((1,10))
# learning phase = 1, i.e. training mode
print(func([x, 1]))
# the output will be:
[array([[2., 2., 2., 0., 0., 2., 2., 2., 0., 0.]], dtype=float32)]
# as you can see some of the neurons have been dropped

# now set learning phase = 0, i.e test mode
print(func([x, 0]))
# the output will be:
[array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], dtype=float32)]
# unsurprisingly, no neurons have been dropped in test phase
person today    schedule 15.08.2019