Шаг 197.
Глубокое обучение на Python. Работа с Keras: глубокое погружение. Разработка своего цикла обучения и оценки. Обучение и прогнозирование

    На этом шаге мы рассмотрим разницу между этими понятиями.

    В примерах низкоуровневого цикла обучения, которые вы видели до сих пор, шаг 1 (прямой проход) выполнялся инструкцией

  predictions = model(input)  , 
а шаг 2 (получение градиентов, вычисленных с помощью GradientTape) - инструкцией
  gradients = tape.gradient(loss, model.weights)   . 
В общем случае следует учитывать две тонкости.

    Некоторые слои Keras (такие как Dropout) во время обучения и во время прогнозирования ведут себя по-разному. Метод call() таких слоев принимает логический аргумент training. Вызов

  dropout(inputs, training=True) 
приведет к сбросу некоторых активаций, а вызов
  dropout(inputs, training=False) 
- нет. Кроме того, метод call() функциональных и последовательных моделей тоже поддерживает аргумент training. Важно не забывать передавать training=True при выполнении прямого прохода модели Keras! То есть прямой проход фактически должен выполняться инструкцией
  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))

    На следующем шаге мы рассмотрим низкоуровневое использование метрик.




Предыдущий шаг Содержание Следующий шаг