Я объяснил, как создать набор данных, как создать файл TFREC, как построить модель и как сохранить модель.Эта статья в основном объясняет режим ожидания, предложенный в TF2, который значительно упрощает сложность TF.
1 Что такое нетерпеливый режим
Eager mode (агрессивный режим), я думаю, это самое большое обновление TensorFlow 2.0, никто.
Tensorflow 1.0 все еще был статическим графиком вычислений.В первом содержании серии «Xiaobai Learning PyTorch» объяснялась разница между статической картой функций Tensorflow и динамической картой функций PyTorch.Tensorflow2.0 предлагает активный режим, в котором также поддерживается построение динамических карт объектов.
Должен сказать, что изменения все больше и больше похожи на PyTorch, но человеческие инструменты всегда развиваются в сторону простоты и удобства использования, что вполне объяснимо.
2 TF1.0 vs TF2.0
В TF1.0 добавлен расчет градиента, и можно строить только графики статического расчета.
- сначала построить процесс расчета;
- Затем запустите объект сеанса;
- Поместите данные в этот статический график данных.
Весь процесс очень громоздкий.
# 这个是tensorflow1.0的代码
import tensorflow as tf
a = tf.constant(3.0)
b = tf.placeholder(dtype = tf.float32)
c = tf.add(a,b)
sess = tf.Session() #创建会话对象
init = tf.global_variables_ini tializer()
sess.run(init) #初始化会话对象
feed = {
b: 2.0
} #对变量b赋值
c_res = sess.run(c, feed) #通过会话驱动计算图获取计算结果
print(c_res)
В коде нам нужно использовать palceholder, чтобы сначала открыть пространство памяти, а затем построить статический график вычислений, назначить данные в открытую память, а затем запустить весь процесс вычислений.
Давайте посмотрим на запуск приведенного выше кода в активном режиме.
import tensorflow as tf
a = tf.Variable(2)
b = tf.Variable(20)
c = a + b
Все верно, в данном случае построение динамического графа расчета завершено, TF2 по умолчанию включает активный режим, поэтому никаких дополнительных настроек не требуется. Этот метод построения очень похож на PyTorch.
3 Получить производные/градиенты
Если мы используем PyTorch, как нам получитьА производная от ?
import torch
# Create tensors.
x = torch.tensor(10., requires_grad=True)
w = torch.tensor(2., requires_grad=True)
b = torch.tensor(3., requires_grad=True)
# Build a computational graph.
y = w * x + b # y = 2 * x + 3
# Compute gradients.
y.backward()
# Print out the gradients.
print(x.grad) # tensor(2.)
print(w.grad) # tensor(10.)
print(b.grad) # tensor(1.)
Нет проблем, давайте перепишем приведенное выше с помощью Tensorflow2.0:
import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape() as tape:
z = w * x + b
dz_dw = tape.gradient(z,w)
print(dz_dw)
>>> tf.Tensor(10.0, shape=(), dtype=float32)
Нам нужно обратить внимание на эти моменты:
- Во-первых, по результатам нет проблем, градиент w равен 10;
- Для переменных, участвующих в вычислении градиентов, то есть участвующих в градиентном спуске, необходимо использовать
tf.Varaible
определять; - Независимо от того, является ли это переменной или входными данными, оно должно быть числом с плавающей запятой.Если это целое число, будет сообщено об ошибке, а результат расчета градиента будет None;
- Tensorflow предоставляет tf.GradientTape для автоматического получения, поэтому операции, выполняемые в tf.GradientTape, будут записаны на ленту, что является концепцией ленты. Лента камеры, записывающая процесс расчета, а затем выполняющая операцию вывода.
Теперь мы хотим вывести не только градиент w, но и градиент b, мы меняем приведенный выше код на:
import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape() as tape:
z = w * x + b
dz_dw = tape.gradient(z,w)
dz_db = tape.gradient(z,b)
print(dz_dw)
print(dz_db)
Текущий результат:
Эта ошибка переводится какНепостоянную видеокассету можно попросить вычислить градиент только один раз.Мы используем ленту для вычисления градиента w, затем эта лента очищает данные, поэтому мы больше не можем вычислять градиент b.
Решение также очень простое, нам просто нужно сделать эту ленту постоянной:
import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape(persistent=True) as tape:
z = w * x + b
dz_dw = tape.gradient(z,w)
dz_db = tape.gradient(z,b)
print(dz_dw)
print(dz_db)
Текущий результат:
4 Получите производные высшего порядка
import tensorflow as tf
x = tf.Variable(1.0)
with tf.GradientTape() as t1:
with tf.GradientTape() as t2:
y = x * x * x
dy_dx = t2.gradient(y, x)
print(dy_dx)
d2y_d2x = t1.gradient(dy_dx, x)
print(d2y_d2x)
>>> tf.Tensor(3.0, shape=(), dtype=float32)
>>> tf.Tensor(6.0, shape=(), dtype=float32)
Если вы хотите получить вторую производную, вам нужно использовать две ленты, а затем взять производную от первой производной.