Штраф на веса в TensorFlow
Большие веса иногда мешают
обобщению. Их ограничивают
регуляризатором: к основной
ошибке прибавляют штраф за величину
коэффициентов. Для суммы квадратов
весов берут функцию l2
из модуля регуляризаторов.
Создадим штраф с коэффициентом
0.01 и передадим его
полносвязному слою через аргумент
kernel_regularizer:
import tensorflow as tf
penalty = tf.keras.regularizers.l2(0.01)
layer = tf.keras.layers.Dense(
2, kernel_regularizer=penalty
)
print(penalty.l2) # выведет 0.01
В функциональной модели штраф вешают на нужный блок, затем обучают как обычно. Средний квадрат и спуск те же, эпохи ограничим двумя:
import tensorflow as tf
tf.keras.utils.set_random_seed(0)
inp = tf.keras.Input(shape=(1,))
out = tf.keras.layers.Dense(
1,
kernel_regularizer=tf.keras.regularizers.l2(
0.01
),
)(inp)
model = tf.keras.Model(inp, out)
model.compile(
optimizer=tf.keras.optimizers.SGD(
learning_rate=0.1
),
loss=tf.keras.losses.MeanSquaredError(),
)
features = tf.constant(
[[0.0], [1.0], [2.0]]
)
targets = tf.constant(
[[0.0], [1.0], [2.0]]
)
model.fit(
features, targets, epochs=2, verbose=2
)
# последняя строка loss: 0.4613
Задайте полносвязный блок на
3 нейрона со штрафом
0.001 на матрицу весов.
Выведите коэффициент штрафа
из объекта регуляризатора.
Соберите одновходовую модель
с одним выходом и штрафом
0.05 на веса единственного
блока. Подготовьте её к обучению
со средним квадратом и спуском.
Обучите модель с штрафом
0.02 на двух строках
[1.0] и [2.0]
с ответами 2.0 и 4.0
две эпохи и выведите ход
обучения.