Заморозка слоя в TensorFlow
Если блок уже не нужно подстраивать
по данным, у слоя выключают атрибут
trainable. Тогда его веса
остаются в модели, но не попадают
в список обновляемых при спуске.
Сравним две одинаковые по форме
схемы: в одной все блоки обучаемы,
во второй у скрытого слоя атрибут
выключен до соединения с входом.
Посчитаем обучаемые параметры
через длину списка
trainable_weights:
import tensorflow as tf
tf.keras.utils.set_random_seed(0)
def trainable_count(model):
total = 0
for weight in model.trainable_weights:
total += int(tf.size(weight))
return total
inp = tf.keras.Input(shape=(2,))
core = tf.keras.layers.Dense(3, name="core")(
inp
)
out = tf.keras.layers.Dense(1)(core)
all_train = tf.keras.Model(inp, out)
print(trainable_count(all_train))
# выведет 13
inp = tf.keras.Input(shape=(2,))
block = tf.keras.layers.Dense(3, name="core")
block.trainable = False
mid = block(inp)
out = tf.keras.layers.Dense(1)(mid)
part_train = tf.keras.Model(inp, out)
print(trainable_count(part_train))
# выведет 4
Соберите модель с одним скрытым
блоком на 4 нейрона при
2 входах и одним выходом.
Выведите число обучаемых
параметров.
Постройте такую же схему, но запретите обучение скрытого блока. Снова выведите число обучаемых параметров.
Создайте цепочку из двух полносвязных блоков. У первого выключите обучение до связи с входом и сравните с полностью обучаемым вариантом по числу обновляемых весов.