Python类中self参数 / __ init__ ()方法 /super(Model, self).__init__()是什么

在使用tensorFlow2搭建神经网络模型的时候,除了Sequential的方法,还有就是自己写模型class,然后初始化。自己写模型类的优势就是可以自定义层与层之间的连接关系,自定义数据流x的流向。

这是一个简单的基本神经网络模型代码,用于虹膜数据:

[En]

This is a simple basic neural network model code for iris data:

class IrisModel(Model): #继承TF的Model类
    def __init__(self): #在这里定义网络结构块
        super(IrisModel, self).__init__()
        self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) #定义网络结构块

    def call(self, x): #在这里实现前向传播
        y = self.d1(x) #调用网络结构块,实现前向传播
        return y

model = IrisModel() #类实例化

当我第一次学习用类编写这段代码时,我在一些地方感到陌生和不习惯。

[En]

When I first learned to write this code with classes, I felt strange and unaccustomed in several places.

1、为什么要定义 def init()

2、为什么要有 super(MyModel ,self).init()

3、为什么到处都有一个self? 又不能省略,又感觉很累赘,它到底意义何在?

我原本打算写一篇自己的文章来谈这件事,但发现网上已经有人写了,而且写得很细致、很清楚,所以就直接转载了他的文章。

[En]

I originally planned to write my own article to talk about this, but I found that someone had already written it online, and it was very meticulous and clear, so I just reprinted his article directly.

博主Chou_pijiang,原文链接:https://blog.csdn.net/zyh19980527/article/details/107206483

总结下来,有这样几点:

1、self参数

self指的是实例Instance本身,在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self,也就是说, 类中的方法的第一个参数一定要是self,而且不能省略。
我觉得关于self有三点是很重要的:

self指的是实例本身,而不是类
self可以用this替代,但是不要这么去写
类的方法中的self不可以省略

2、 init ()方法

在python中创建类后,通常会创建一个 init ()方法, 这个方法会在创建类的实例的时候自动执行。 init ()方法必须包含一个self参数,而且要是第一个参数

init ()方法在实例化的时候就已经自动执行了,但是如果不是 init ()方法,那肯定就只有调用才执行。如果 init ()方法中还需要传入另一个参数name,但是我们在创建Bob的实例的时候没有传入name,那么程序就会报错, 说我们少了一个__ init__ ()方法的参数,因为__ init__ ()方法是会在创建实例的过程中自动执行的,这个时候发现没有name参数,肯定就报错了。

那么什么需要在__ init__ ()方法中定义?就是 当我们认为一些属性、操作是在创建实例的时候就有的时候,就应该把这个量定义在__ init__ ()方法中。我们写神经网络的代码的时候,一些网络结构的设置,也最好放在__ init__ ()方法中。

3、super(MyModel, self).init()

简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。

Net类继承nn.Module,super(Net, self).init()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。

子类继承父类的所有属性和方法,父属性自然用父方法初始化。

[En]

The subclass inherits all the properties and methods of the parent class, and the parent property is naturally initialized with the parent method.

当然,如果初始化的逻辑与父类的逻辑不同,您可以自己重新初始化它,而不使用父类的方法。

[En]

Of course, if the logic of initialization is different from that of the parent class, you can reinitialize it yourself without using the methods of the parent class.

写神经网络模型的时候,父类Modle中还有一些属性我们不用再自己手写了,直接将其初始化就好,另外Model也是有继承的父类network.Network,这里也有一些我们不知道、不知如何自己写的属性和方法。 所以最好都加上 super(MyModel,self).init()这样的父类初始化命令行。

class Module(tracking.AutoTrackable):
  def __init__(self, name=None):
    if name is None:  #模型名称
      name = camel_to_snake(type(self).__name__)
    else:
      if not valid_identifier(name):
        raise ValueError(
            "%r is not a valid module name. Module names must be valid Python "
            "identifiers (e.g. a valid class name)." % name)

    self._name = name
    if tf2.enabled():
      with ops.name_scope_v2(name) as scope_name:  #TF命名空间
        self._name_scope = ops.name_scope_v2(scope_name)
    else:
      with ops.name_scope(name, skip_on_eager=False) as scope_name:
        self._scope_name = scope_name

Original: https://blog.csdn.net/eylier/article/details/118931908
Author: Just Jump
Title: Python类中self参数 / init ()方法 /super(Model, self).init()是什么

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/514342/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球