如何在pytorch中计算输出相对于每个输入的梯度

x4shl7ld  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(202)

我有一个形状Tensor(射线数,每条射线的点数,3),我们称之为inputinput经过模型和一些处理(所有这些都是可微的),我们称这个过程为inference,最后得到output = inference(input),它的形状为(number_of_rays,number_of_points_per_ray,300),其中输出中的每个“射线”仅依赖于输入的相同射线,例如output[i]仅依赖于input[i]。这意味着对于输入上的每组3个元素,输出具有300个元素,所以我希望得到一个与输出形状相同的渐变
正如在https://discuss.pytorch.org/t/need-help-computing-gradient-of-the-output-with-respect-to-the-input/150950/5中所解释的,我尝试了grads=torch.autograd.grad (outputs = output, inputs = input, grad_outputs = None)
但是我得到的输出具有形状(number_of_rays,number_of_points_per_ray,3),其与输入相同而与输出不同。
你知道我可能做错了什么吗?先谢了

2wnc66cl

2wnc66cl1#

我假设输入3是转发到模型网络的状态大小,300是模型网络产生的输出大小。
现在,您想为(number_of_rays)中的每个元素调用模型网络的单独示例吗?如果是,那么获取数组中每个元素的梯度的一种方法是为分配给数组元素的模型网络的每个示例分配单独的优化器。
下面是我的代码:

class Environment():
    def __init__(self, N, input_dims, output_dims, lr, gamma):
        self.number_of_rays = N
        self.input_dims = input_dims
        self.output_dims = output_dims
        # assign to each ray a neural network
        self.rays = [YourModel(input_dims, output_dims, gamma) for i in range(N)]
        self.optimizer = []
        for i in range(N):
            optim = T.optim.Adam(self.rays[i].parameters(), lr=lr, betas=(0.92, 0.999))
            self.optimizer.append(optim)

    def run(self):
        # here you do your stuff 
        # ...

        # now update the networks
        for i in range(self.number_of_rays):
            prediction = self.rays[i](observation) # feed your input state to the model
            loss = loss_fn(prediction) # compute loss
            self.optimizer[i].zero_grad() # reset the gradients of model parameters
            loss.backward() # backpropagate the prediction loss
            self.optimizer[i].step() # adjust the parameters by the gradients collected in the backward pass

相关问题