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

时间:2020-01-19 23:52:52

标签: pytorch backpropagation resnet autograd

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

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

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

P.S。我还必须修改代码以适合我自己的用例,并且看来我自己的带有=='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))

1 个答案:

答案 0 :(得分:0)

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

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

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

lambda函数在x上执行torch.nn.functional.Pad函数,我们可以打包通过它,因为它具有已定义的向后函数()。

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