Что означает "trainable_weights" в Керасе? - PullRequest
0 голосов
/ 06 октября 2019

Если я замораживаю свою base_model с trainable=false, я получаю странные числа с trainable_weights.

Перед тем как заморозить мою модель имеет 162 trainable_weights. После замораживания модель имеет только 2. Я привязал 2 слоя к предварительно обученной сети. trainable_weights показывает мне слои для тренировки? Я нахожу число странным, когда вижу 2253335 обучаемых параметров.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Обучаемые веса такие же, как и обучаемые параметры. Обучаемый слой часто имеет несколько обучаемых весов.

Давайте рассмотрим этот пример:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, None, 501)         0         
_________________________________________________________________
lstm_1 (LSTM)                (None, None, 40)          86720     
_________________________________________________________________
SoftDense (TimeDistributed)  (None, None, 501)         20541     
=================================================================
Total params: 107,261
Trainable params: 107,261
Non-trainable params: 0
__________________________

Первый слой - это просто входной слой;он получает данные как есть, поэтому у него нет обучаемых весов.

Следующий уровень имеет 542 * 4 * 40 = 86720 обучаемых весов. 40 из-за выходного значения dim, 4 потому что в качестве LSTM у него на самом деле есть 4 обучаемых слоя, и 542 для 501 + 40 + 1 ... по причинам, которые, вероятно, выходят за рамки этого ответа.

Последний слой имеет 41 * 501 = 20451 обучаемых весов (40 от входного слоя, +1 для смещения, время 501 для его выхода).

Всего обучаемых параметров - 107,261.

Если бы я заморозил последний слой, у меня было бы только 86,720 обучаемых весов.

0 голосов
/ 06 октября 2019

Обучаемые веса - это веса, которые будут изучены в процессе обучения. Если вы делаете trainable=False, то эти веса сохраняются как есть и не изменяются, потому что они не изучены. Вы можете увидеть некоторые «странные числа», потому что либо вы используете предварительно обученную сеть, вес которой уже изучен, либо используете случайную инициализацию при определении модели. При использовании трансферного обучения с предварительно обученными моделями обычной практикой является замораживание весов базовой модели (предварительно обученных) и обучение только тех дополнительных слоев, которые вы добавляете в конце.

...