# f(x, y) = (x ^ 3) * y - x * (y ^ 2)
# Therefore, the 1st order derivatives are:
# df / dx = 3 * (x ^ 2) * y - y ^ 2
# df / dy = x ^ 3 - 2 * x * y
def f(x, y):
return x * x * x * y - x * y * y
# Obtain a function that returns the function value and the 1st order
# gradients.
val_grads_fn = tfe.value_and_gradients_function(f)
x = 2.0
y = 3.0
# Invoke the value-and-gradients function.
f_val, (x_grad, y_grad) = val_grads_fn(x, y)
assert f_val.numpy() == (2 ** 3) * 3 - 2 * (3 ** 2)
assert x_grad.numpy() == 3 * (2 ** 2) * 3 - 3 ** 2
assert y_grad.numpy() == (2 ** 3) - 2 * 2 * 3
# To obtain a callable that returns the value of `f` and the gradient(s) of
# `f` with respect to a subset of its inputs, use the `params` keyword
# argument with `value_and_gradients_function()`.
val_ygrad_fn = tfe.value_and_gradients_function(f, params=[1])
f_val, (y_grad,) = val_ygrad_fn(x, y)
assert f_val.numpy() == (2 ** 3) * 3 - 2 * (3 ** 2)
assert y_grad.numpy() == (2 ** 3) - 2 * 2 * 3
Аргументы
f
функция, подлежащая дифференцированию. Если f возвращает скаляр, этот скаляр будет дифференцирован. Если f возвращает тензор или список тензоров, по умолчанию будет вычислен скаляр, складывая все их значения для получения одного скаляра. Если нужно, тензоры можно поэлементно умножить на тензоры, переданные в качестве ключевого аргумента dy возвращенной функции градиента.
params
список имен параметров f или список целых чисел, индексирующих параметры, по которым мы будем дифференцировать. Передача None дифференцирует по всем параметрам.
Возвращает
функция, которая, при вызове, возвращает значение f и градиент f по отношению ко всем params. Функция принимает дополнительный необязательный ключевой аргумент "dy". Его установка позволяет вычислять произведения вектор-якобиана для векторов, отличных от вектора единиц.
Возможные исключения
ValueError
если параметры не являются все строками или все целыми числами.