Назначение переменных на месте с помощью pytorch

Будучи (плохим) программистом с хорошими практиками, я пытаюсь написать общую "якобианскую" функцию в pytorch, которую я могу использовать для своего проекта.

#!/usr/bin/env python3
import numpy as np
import torch
import torch.autograd as ag

def full_jacobian(f, wrt):
    f_shape = list(f.size())
    wrt_shape = list(wrt.size())

    fj = ag.Variable(torch.zeros(f_shape + wrt_shape))


    f_range = nd_range(f_shape)
    wrt_range = nd_range(wrt_shape)

    for f_ind in f_range:
        fj[f_ind] = ag.grad(f[tuple(f_ind)], wrt, retain_graph=True, create_graph=True)[0]

Куда:

def nd_range(stop, dims = None):
    if dims == None:
        dims = len(stop)
    if not dims:
        yield ()
        return
    for outer in nd_range(stop, dims - 1):
        for inner in range(stop[dims - 1]):
            yield outer + (inner,)

К сожалению, когда я пытаюсь использовать это для вычисления якобиана, строка fj[f_ind] = ag.grad(f[tuple(f_ind)], wrt, retain_graph=True, create_graph=True)[0] перерывы с ошибкой:

RuntimeError: in-place operations can be only used on variables that don't share storage with any other variables, but detected that there are 2 objects sharing it.

Почему это ошибка? Какой правильный обходной путь?

0 ответов

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