На этом шаге мы рассмотрим разницу между этими понятиями.
В примерах низкоуровневого цикла обучения, которые вы видели до сих пор, шаг 1 (прямой проход) выполнялся инструкцией
predictions = model(input) ,
gradients = tape.gradient(loss, model.weights) .
Некоторые слои Keras (такие как Dropout) во время обучения и во время прогнозирования ведут себя по-разному. Метод call() таких слоев принимает логический аргумент training. Вызов
dropout(inputs, training=True)
dropout(inputs, training=False)
predictions = model(inputs, training=True) .
Также обратите внимание, что для получения градиентов весов модели следует использовать не
tape.gradients(loss, model.weights) ,
tape.gradients(loss, model.trainable_weights) .
В действительности слои и модели обладают двумя видами весов, такими как:
Из встроенных слоев Keras необучаемые веса имеет только слой BatchNormalization, который мы обсудим позже. Необучаемые веса нужны слою BatchNormalization для запоминания среднего и стандартного отклонения обрабатываемых данных, чтобы потом динамически выполнить нормализацию признаков.
Принимая во внимание эти две детали, этап обучения с учителем в конечном итоге будет выглядеть следующим образом:
def train_step(inputs, targets): with tf.GradientTape() as tape: predictions = model(inputs, training=True) loss = loss_fn(targets, predictions) gradients = tape.gradients(loss, model.trainable_weights) optimizer.apply_gradients(zip(model.trainable_weights, gradients))
На следующем шаге мы рассмотрим низкоуровневое использование метрик.