在现有 PyTorch 层中实现自定义功能

Implementing Custom Functionality in Existing PyTorch Layers

提问人:k9714 提问时间:9/13/2023 最后编辑:k9714 更新时间:9/13/2023 访问量:30

问:

在 Pytorch 中,我想添加一个函数,
该函数对继承自 的所有执行特定函数。
nn.Module

在这里,图层表示:
///等。
nn.Linearnn.Conv2dnn.MaxPool2d

首先,创建一个继承自 的新主类和层类。nn.Module

class Main(nn.Module):
    def foo(self, x):
        x += 2
        return x 

class Linear(nn.Module, Main):
    pass

class Conv2d(nn.Module, Main):
    pass

...

使用如上所述的多重继承,您可以将方法“foo”与现有的层功能一起使用。

我们将现有图层(如 A)称为 A,将新创建的图层类称为 Bnn.Linear

在组成新模型时,使用 B 时没有问题。
例如)

class NewModel(nn.Module):
    def __init__(self):
        super(NewModel, self).__init__()
        self.linear = Linear(64, 64)  # this Linear object is B, 'foo' method available

但是,使用 A 的模型(torchvision 中的内部类 Cifar10、ResNet50 等)
不能使用“foo”方法。

我还考虑过将“foo”方法放入使用 A 的对象中,并具有 setattr

必须打开 A 对象的所有模块并检查它们会带来不便,并且也很难跟踪内部计算。

在不修改库的情况下,有没有合适的方法可以解决上述问题?

Python 方法 深度学习 PyTorch

评论

0赞 Ivan 9/13/2023
也许你应该看看nn。直接覆盖似乎既不合理也不可行。nn.Module
0赞 Yakov Dan 9/13/2023
您能确切地解释一下您的函数将做什么吗?您可能为此使用钩子
0赞 k9714 9/14/2023
@YakovDan 谢谢你的回答。我需要此功能来计算 LRP,LRP 是可解释的 AI (XAI) 算法之一。如果每层都预定义了相关性计算公式,则计算时只需调用同名方法。

答: 暂无答案