PyTorch loss() 和反向传播是否理解 lambda 层?

Does PyTorch loss() and backpropagation understand lambda layers?

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

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

如果是这种情况,任何人都可以深入了解 PyTorch 如何能够解释反向传播的 lambda 层(即 PyTorch 如何知道如何区分层的操作)?

P.S。我还必须修改代码以适应我自己的用例,而且我自己使用选项 == 'A' 的实现似乎并没有产生很好的结果。这可能只是因为使用卷积层而不是填充的选项 == '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))

"I was wondering if PyTorch's backpropagation algorithm using loss() can account for the lambda layer and shortcut in the code provided."

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

"If that is the case, can anyone provide insight into how PyTorch is able to interpret the lambda layer for backpropagation (i.e. how does PyTorch know how to differentiate with respect to the layer's operations)?"

lambda 函数对 x 执行 torch.nn.functional.Pad 函数,我们可以通过它进行 packpropagate,因为它具有定义的 backwards() 函数。

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