Чтобы ответить на этот вопрос, вам нужно взглянуть на исходный код Keras, который может удивить вас, потому что вы поймете, что:
Как я уже сказал, может быть немного удивительно, что модель Keras получена из слоя Keras.Но если вы подумаете дальше, вы сочтете это разумным, поскольку у них много общих функций (например, оба получают некоторые входные данные, выполняют некоторые вычисления на них, производят некоторые выходные данные и обновляют свои внутренние веса / параметры).Одним из их общих атрибутов является атрибут trainable
.Теперь, когда вы установите trainable
свойство модель как False
, это будет пропуск шаг обновления веса.Другими словами, он не проверяет атрибут trainable
своих нижележащих слоев;скорее, сначала он проверяет свой собственный атрибут trainable
(точнее, в классе Network
), и если он равен False
, обновления пропускаются.Следовательно, это не означает, что для нижележащих слоев их атрибут trainable
также установлен на False
.И на то есть веская причина не делать этого: один экземпляр слоя может использоваться в нескольких моделях.Например, рассмотрим следующие две модели, которые имеют общий слой:
inp = Input(shape=...)
shared_layer = Dense(...)
sout = shared_layer(inp)
m1_out = Dense(...)(sout)
m2_out = Dense(...)(sout)
model1 = Model(inp, m1_out)
model2 = Model(inp, m2_out)
Теперь, если мы установим model1.trainable = False
, это приведет к зависанию всего model1
(т. Е. Тренировка model1
не обновляет весаиз его нижележащих слоев, включая shared_layer
);однако, shared_layer
и model2
все еще обучаемы (то есть обучение model2
обновило бы веса всех его слоев, включая shared_layer
).С другой стороны, если мы установим model1.layers[1].trainable = False
, то shared_layer
будет заблокирован, и поэтому его веса не будут обновляться при обучении либо model1
, либо model2
.Таким образом, вы могли бы иметь гораздо больший контроль и гибкость, и, следовательно, вы можете создавать более сложные архитектуры (например, GAN).