Каков эквивалентный синтаксис для Tensor.grad в Tensorflow 2.0

В Pytorch мы можем получить доступ к градиенту переменной x с помощью

z.grad

Что такое тот же синтаксис в Tensorflow 2. Моя цель - сократить градиент. Вот код Pytorch

if z.grad > 1000:
    z.grad = 10

Может ли tensorflow 2 применять те же функции?

Спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, предположим, что в TF2 мы определяем следующие переменные и оптимизатор:

import tensorflow as tf
from tensorflow import keras 

opt = tf.keras.optimizers.Adam(learning_rate=0.1)

x = tf.Variable([3.0, 4.0]) 
y = tf.Variable([1.0, 1.0, 1.0, 1.0])
var_list = [x, y]

Затем мы можем получить градиенты, используя tf.GradientTape():

with tf.GradientTape() as tape:
    loss = tf.reduce_sum(x ** 2) + tf.reduce_sum(y) 

grads = tape.gradient(loss, var_list)

Наконец, мы можем обрабатывать градиенты пользовательской функцией:

def clip_grad(grad):
    if grad > 1000:
        grad = 10
    return grad

processed_grads = [tf.map_fn(clip_grad, g) for g in grads]

opt.apply_gradients(zip(processed_grads, var_list))

Обратите внимание, что вы можете обнаружить, что у оптимизаторов keras есть метод get_gradients, но он не будет работать с включенным eager execution, который по умолчанию используется в TF2. Если вы хотите использовать его, вам, возможно, придется писать код в стиле TF1.

Спасибо за ответ. Предположим, у меня есть много переменных в графе вычислений, таких как x, 'y', 'z'. Я только хочу обрезать градиент y. Любая идея сделать это? Кажется, что grads — это список. Не знаю, как получить градиент y в grads. Спасибо.

jason 25.12.2020 21:05

@jason Рад помочь, из документов: tape.gradient вернуть список или вложенную структуру тензоров (или IndexedSlices, или None), по одному для каждого элемента в источниках. Возвращаемая структура такая же, как структура источников, поэтому, если ваш var_list=[x, y, z], то grads[1] является градиентом y

Matrix Adventurer 26.12.2020 03:05

Другие вопросы по теме