pytorch super 的用法

库中的torch.nn.Module模块,声明继承Model类时有提示可以按照这样方式书写

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

其中的super类的作用是继承的时候,调用含super的各个的基类__init__函数,如果不使用super,就不会调用这些类的__init__函数,除非显式声明。而且使用super可以避免基类被重复调用。
使用 print(Model.mro)打印搜索顺序或者祖先树,被官方称为MRO即Method Resolution Order,

(<class ‘main.Model’>, <class ‘torch.nn.modules.module.Module’>, <class ‘object’>)
按这个顺序是从右至左调用,标准用法是:

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

super的典型用法:
在具有单一继承结构的类层级中,super可以指代父类而不需要显式的声明,这对更改父类的时候是有帮助的;
在动态执行环境中支持多继承协作,这个功能是python独有的,使得有可能解决菱形图问题,指多个基类实现相同的方法。

先看第一个用法:

class A():
    def fortest(self):
        print('Call class A')
        print('Leave class A')
class B(A):
    def fortest(self):
        print('Call class B')
        A.fortest(self)
        print('Leave class B')
sample=B()
sample.fortest()
print(B.__mro__)

运行的结果:

Call class B
Call class A
Leave class A
Leave class B
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

如果需要更改B的基类A为D,那么不仅需要更改声明class B(D),函数体中的函数也要进行更改,如果调用A的地方多,修改起来就会很麻烦,加上super就简单很多

class A():
    def fortest(self):
        print('Call class A')
        print('Leave class A')
class B(A):
    def fortest(self):
        print('Call class B')
        super(B,self).fortest()#等同于super().fortest()
        print('Leave class B')
sample=B()
sample.fortest()
print(B.__mro__)

运行的结果:
Call class B
Call class A
Leave class A
Leave class B
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

加上super以后,修改基类就只需要修改声明,不需要修改函数体内的东西,所以super可以指代父类而不需要显式的声明,这对更改基类的时候是有帮助的,使得代码更容易维护

接着看另外的用法:

class A():
    def __init__(self):
        print('Call class A')
        print('Leave class A')
class B(A):
    def __init__(self):
        print('Call class B')
        print('Leave class B')
class C(A):
    def __init__(self):
        print('Call class C')
        super(C,self).__init__()
        print('Leave class C')
class D(A):
    def __init__(self):
        print('Call class D')
        super(D, self).__init__()
        print('Leave class D')
class E(B,C):
    def __init__(self):
        print('Call class E')
        B.__init__(self)
        C.__init__(self)
        print('Leave class E')
sample=E()
print(E.__mro__)

运行的结果:
Call class E
Call class B
Leave class B
Call class C
Call class A
Leave class A
Leave class C
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

B和C类都继承的A,但是由于B没有使用super,这里调用B的时候没有调用A,只有C自动调用了A

class A():
    def __init__(self):
        print('Call class A')
        print('Leave class A')
class B(A):
    def __init__(self):
        print('Call class B')
        print('Leave class B')
class C(A):
    def __init__(self):
        print('Call class C')
        super(C,self).__init__()
        print('Leave class C')
class D(A):
    def __init__(self):
        print('Call class D')
        super(D, self).__init__()
        print('Leave class D')
class E(B,C,D):
    def __init__(self):
        print('Call class E')
        B.__init__()
        C.__init__()
        D.__init__()
        print('Leave class E')
sample=E()
print(E.__mro__)

运行的结果:
Call class E
Call class B
Leave class B
Call class C
Call class D
Call class A
Leave class A
Leave class D
Leave class C
Call class D
Call class A
Leave class A
Leave class D
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

这里的A和D都重复调用了一次,尤其是调用C的时候,也调用了D

class A():
    def __init__(self):
        print('Call class A')
        super(A, self).__init__()
        print('Leave class A')
class B(A):
    def __init__(self):
        print('Call class B')
        super(B,self).__init__()
        print('Leave class B')
class C(A):
    def __init__(self):
        print('Call class C')
        super(C,self).__init__()
        print('Leave class C')
class D(A):
    def __init__(self):
        print('Call class D')
        super(D, self).__init__()
        print('Leave class D')
class E(B,C,D):
    def __init__(self):
        print('Call class E')
        super(E, self).__init__()
        print('Leave class E')
sample=E()
print(E.__mro__)

运行结果是:
Call class E
Call class B
Call class C
Call class D
Call class A
Leave class A
Leave class D
Leave class C
Leave class B
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

都加super以后每个基类都只调用一次

作者:shiheyingzhe
来源:CSDN
原文:https://blog.csdn.net/shiheyingzhe/article/details/83051471
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 30
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
SuperPoint是一个基于深度学习的特征点检测和描述算法,它结合了特征点检测和描述的两个任务,并可以用于匹配、跟踪和三维重建等计算机视觉应用。 要用PyTorch实现SuperPoint,首先需要导入PyTorch库。然后,可以根据论文中提供的网络结构构建SuperPoint模型。模型的输入是一个灰度图像,经过卷积和池化层之后,提取出特征图。在特征图上进行非极大值抑制,得到特征点的坐标。接下来,根据特征点的坐标,从特征图中提取对应的特征描述子。 在实现过程中,我们可以使用PyTorch提供的卷积、池化和非极大值抑制等函数。可以使用PyTorch的自动求导机制,定义网络的损失函数,并使用梯度下降等优化算法进行训练。 除了模型的实现,还需要准备用于训练和测试的数据集。可以使用公开的视觉数据集,如MSCOCO或KITTI,对整个模型进行训练和评估。 在训练过程中,可以根据论文提供的指导,设置合适的损失函数和超参数。通过迭代优化,逐渐提高模型的性能。 实现SuperPoint的过程中,还可以加入一些其他的优化方法,如数据增强、模型剪枝等,以提高模型的效果和减少计算资源的消耗。 总结来说,使用PyTorch实现SuperPoint需要构建网络模型,选择合适的损失函数和训练数据集,通过迭代优化训练模型。同时可以尝试一些额外的优化方法,以提高模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值