Как управлять подробностью в TensorFlow 2.0

#python #tensorflow #neural-network #tensorflow2.0

#python #tensorflow #нейронная сеть #tensorflow2.0

Вопрос:

В TensorFlow 1.x у меня была большая свобода в выборе того, как и когда выводить оценки точности / потерь во время обучения. Например, если бы я хотел выводить потери в обучении каждые 100 эпох, в tf.Session() я бы написал:

 if epoch % 100 == 0:
    print(str(epoch)   '. Training Loss: '   str(loss))
  

После выпуска TF 2.0 (alpha) кажется, что Keras API вынуждает придерживаться своего стандартного вывода. Есть ли способ вернуть эту гибкость?

Ответ №1:

Если вы не используете методы модели Keras ( .fit , .train_on_batch , …) и вы пишете свой собственный цикл обучения, используя быстрое выполнение (и, необязательно, оборачивая его в tf.function , чтобы преобразовать в графическое представление), вы можете управлять подробностью, как вы привыкли делать в 1.x

 training_epochs = 10
step = 0
for epoch in range(training_epochs)
    print("starting ",epoch)
    for features, labels in dataset:
        with tf.GradientTape() as tape:
            loss = compute_loss(model(features),labels)
        gradients = tape.gradients(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
        step  = 1
        if step % 10 == 0:
            # measure other metrics if needed
            print("loss: ", loss)
    print("Epoch ", epoch, " finished.")
  

Комментарии:

1. Это здорово. У меня есть дополнительные вопросы: 1) Откуда берется compute_loss() функция?; 2) Должны ли строки 5 и 6 находиться внутри with блока?; 3) Где я могу контролировать количество эпох? Спасибо! (Grazie!)

2. compute_loss это просто псевдокод. Замените его своим loss (по возможности, из tf.keras.losses). Нет, 5 и 6 строк могут находиться за пределами градиентной ленты. Лента используется только для регистрации действий (и вы выполнили модель прямого вызова и вычисления потерь). Поскольку вы выполняете итерацию набора данных, вы можете управлять эпохами многими различными способами: вручную, зная размер набора данных. Или, если dataset это tf.data.Dataset объект, вы можете использовать .repeat(n) метод, чтобы заставить набор данных повторяться в течение n эпох

3. В строке 2: for input in dataset . Является dataset объектом numpy? И если это так, то, похоже, он принимает по одной строке за раз, как в Stochastic GD. Если бы я хотел реализовать простой GD, могу ли я написать: for epoch in range(num_epochs): и поместить мой Dataset вместо ввода? Спасибо

4. набор данных — это нечто повторяющееся. Посмотрите, как работает tf.data.Dataset документация (но она может быть даже numpy). Чтобы реализовать простой цикл обучения, посмотрите на этот пример tensorflow.org/alpha/guide/eager#variables_and_optimizers . Однако, да, вы можете сделать что-то вроде ‘для эпохи в диапазоне (num_epochs)` с внутренним другим циклом, который повторяет набор данных один раз

5. Я обновил пример — взгляните. Кстати, dataset является итерируемым, вы можете заставить его возвращать все, что вы хотите. В моем случае, я полагаю, он возвращает пару (features, labels)