Вычисление выходных пиксельных норм градиента в PyTorch

Я ищу эффективный способ вычисления \ hat {x} размеров (b x c x h x w), определенных для каждого образца как:

eq

где x - результат тех же измерений, сгенерированных моделью с параметрами \ theta, и

i, j: индексировать высоту и ширину выходной карты 2D-объектов.

k: индексирует размер канала

l: индексирует параметры.

Как мне добиться этого с помощью x.backward ()? Есть ли эффективный способ сделать это?

Если бы я сделал x.backward (torch.ones_like (x)), я бы вычислил сумму градиентов в приведенном выше уравнении вместо суммы их абсолютных значений.

Это можно сделать методом грубой силы, перебирая каждый пиксель в выходной карте и вычисляя .backward (). Но это было бы невероятно дорого. Есть ли эффективный способ избежать цикла?


person Vineeth Bhaskara    schedule 24.09.2019    source источник


Ответы (1)


После того, как вы позвоните .backward() в случае потери, PyTorch вычислит для вас все градиенты, каждый из которых имеет .norm(). Возможно, это то, что вы ищете?

Например:

x = torch.rand((4,3,3), requires_grad=True)   # Some output volume
y = torch.rand((4,3,3), requires_grad=True)   # Some output volume
z = x + y
loss = z.sum()
loss.backward() 

print(x.grad)          # Print gradients for x
print(x.grad.norm(1))  # Print the L1 norm for these gradients
person JoshVarty    schedule 25.09.2019