#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)