首页 > 解决方案 > PyTorch loss() 和反向传播是否理解 lambda 层?

问题描述

我一直在使用此处提供的代码中的 resnet56 模型:https ://github.com/akamaster/pytorch_resnet_cifar10/blob/master/resnet.py 。

我注意到该实现与许多其他在线可用的 ResNet 示例不同,我想知道 PyTorch 使用 loss() 的反向传播算法是否可以解释提供的代码中的 lambda 层和快捷方式。

如果是这种情况,谁能提供有关 PyTorch 如何解释 lambda 层以进行反向传播的见解(即 PyTorch 如何知道如何区分层的操作)?

PS我还必须修改代码以适合我自己的用例,而且似乎我自己使用选项 == 'A' 的实现并没有产生很好的结果。这可能仅仅是因为 option == 'B' 使用卷积层而不是填充,更适合我的数据。

        self.shortcut = nn.Sequential()
        if stride != 1 or in_planes != planes:
            if option == 'A':
                top = (int) ((self.expansion*planes - in_planes) / 2)
                bot = (self.expansion*planes - in_planes) - top
                self.shortcut = LambdaLayer(lambda x:
                                            F.pad(x[:, :, ::stride, ::stride], (0, 0, 0, 0, top, bot), "constant", 0))

标签: pytorchbackpropagationresnetautograd

解决方案


“我想知道 PyTorch 使用 loss() 的反向传播算法是否可以解释提供的代码中的 lambda 层和快捷方式。”

PyTorch 通过 lambda 函数进行反向传播没有问题。您的 LambdaLayer 只是将模块的前向传递定义为对 lambda 函数的评估,因此您的问题归结为 PyTorch 是否可以通过 lambda 函数反向传播。

“如果是这样的话,任何人都可以深入了解 PyTorch 如何解释 lambda 层以进行反向传播(即 PyTorch 如何知道如何区分层的操作)?”

lambda 函数在 x 上执行 torch.nn.functional.Pad 函数,我们可以通过它进行打包传播,因为它有一个定义的 backwards() 函数。

PyTorch 处理 lambda 函数的方式与 PyTorch 等 autodiff 工具处理任何函数的方式相同:它将其分解为原始操作,并使用每个原始操作的微分规则来构建整个计算的导数。


推荐阅读