В чем разница между настройкой обучаемой модели Keras и обучаемостью каждого слоя - PullRequest
0 голосов
/ 20 июня 2019

У меня есть последовательная модель Keras, состоящая из нескольких плотных слоев. Я установил обучаемое свойство всей модели в False. Но я вижу, что отдельным слоям все еще свойственно обучаемое свойство установлено в True. Нужно ли индивидуально устанавливать обучаемое свойство слоев также в False? Тогда в чем смысл установки обучаемого свойства False для всей модели?

1 Ответ

0 голосов
/ 20 июня 2019

Чтобы ответить на этот вопрос, вам нужно взглянуть на исходный код 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).

...