【问题标题】:How can I visualize what happens during loss.backward()? [closed]如何可视化 loss.backward() 期间发生的情况? [关闭]
【发布时间】:2018-10-25 12:05:15
【问题描述】:

我对我的模型的前向传播有信心,我该如何控制它的后向传播?

这不是关于什么是反向传播的理论问题。这个问题是一个实际的问题,关于是否有适合可视化/跟踪/控制反向传播过程中发生的事情的工具。

理想情况下,该工具将允许可视化模型计算图的结构(模型操作图)、其输入和可训练参数。

现在,我愿意:

loss.backward()

我想想象一下这一步会发生什么。

【问题讨论】:

  • 不幸的是,这个问题仍然是题外话,因为您正在寻求工具或软件的推荐。我认为您最好在其他网站上寻找一些工具。 AFAIK,应该已经有一些问题可以解决这个问题。
  • 好的。那我应该删除它吗?我不知道没有办法仅使用 PyTorch 来回答我的问题。如果有人以这种方式回答这个问题,我觉得这不会离题。此外,实际上要在该问题的“外面”找到答案并不简单。
  • 这个问题不属于这里,但我仍然会尝试解决它。 - 您可以使用 torchviz 进行可视化 github.com/szagoruyko/pytorchviz - 如果您想要一些学术论文,要了解反向传播,您可以查看 arxiv.org/abs/1502.05767 - 如果您想要更多类似示例的代码,您可以查看 autograd (github.com/hips/autograd)。 pytorch 的 autograd 就是受此启发的。 - 这里实现了一个教程版的 autograd (github.com/mattjj/autodidact)。

标签: pytorch backpropagation


【解决方案1】:

已经提到了pytorchviz,它可以让您可视化图表。

这是一个小例子,可以帮助您了解pytorchviz 是如何使用grad_fn 跟踪图形的:

import torch
from torch import nn
d = 5
x = torch.rand(d, requires_grad=True)
print('Tensor x:', x)
y = torch.ones(d, requires_grad=True)
print('Tensor y:', y)
loss = torch.sum(x*y)*3

del x
print()
print('Tracing back tensors:')
def getBack(var_grad_fn):
    print(var_grad_fn)
    for n in var_grad_fn.next_functions:
        if n[0]:
            try:
                tensor = getattr(n[0], 'variable')
                print(n[0])
                print('Tensor with grad found:', tensor)
                print(' - gradient:', tensor.grad)
                print()
            except AttributeError as e:
                getBack(n[0])

loss.backward()
getBack(loss.grad_fn)

输出:

Tensor x: tensor([0.0042, 0.5376, 0.7436, 0.2737, 0.4848], requires_grad=True)
Tensor y: tensor([1., 1., 1., 1., 1.], requires_grad=True)

Tracing back tensors:
<MulBackward object at 0x1201bada0>
<SumBackward0 object at 0x1201bacf8>
<ThMulBackward object at 0x1201bae48>
<AccumulateGrad object at 0x1201badd8>
Tensor with grad found: tensor([0.0042, 0.5376, 0.7436, 0.2737, 0.4848], requires_grad=True)
 - gradient: tensor([3., 3., 3., 3., 3.])

<AccumulateGrad object at 0x1201bad68>
Tensor with grad found: tensor([1., 1., 1., 1., 1.], requires_grad=True)
 - gradient: tensor([0.0125, 1.6129, 2.2307, 0.8211, 1.4543])

您还应该进一步了解 autograd 函数(由 backward()-function 使用)实际上是如何工作的!
这是来自 pytorch 网站的教程,其中包含一个简单而简短的示例:

PyTorch: Defining New autograd Functions

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多