亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于tensorflow __init__、build 和call的使用小結(jié)

 更新時(shí)間:2021年02月26日 11:49:21   作者:時(shí)光碎了天  
這篇文章主要介紹了基于tensorflow __init__、build 和call的使用小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1.介紹

在使用tf構(gòu)建網(wǎng)絡(luò)框架的時(shí)候,經(jīng)常會(huì)遇到__init__、build 和call這三個(gè)互相搭配著使用,那么它們的區(qū)別主要在哪里呢?

1)__init__主要用來(lái)做參數(shù)初始化用,比如我們要初始化卷積的一些參數(shù),就可以放到這里面

2)call可以把類型的對(duì)象當(dāng)做函數(shù)來(lái)使用,這個(gè)對(duì)象可以是在__init__里面也可以是在build里面

3)build一般是和call搭配使用,這個(gè)時(shí)候,它的功能和__init__很相似,當(dāng)build中存放本層需要初始化的變量,當(dāng)call被第一次調(diào)用的時(shí)候,會(huì)先執(zhí)行build()方法初始化變量,但后面再調(diào)用到call的時(shí)候,是不會(huì)再去執(zhí)行build()方法初始化變量

2.代碼

class RB(tf.keras.layers.Layer): 
 def __init__(self, num_filters, *args, **kwargs):
 self.num_filters = num_filters
 super(RB, self).__init__(*args, **kwargs)
 #按需求添加卷積
 def build(self, input_shape):
 #按需求添加卷積
 self._layers = [
 ]
 super(RB, self).build(input_shape)
 
 def call(self, tensor):
 for layer in self._layers:
  tensor = layer(tensor) 
class DecodeNet(tf.keras.layers.Layer):
 
 def __init__(self, num_filters, *args, **kwargs):
 self.num_filters = num_filters
 super(DecodeNet, self).__init__(*args, **kwargs)
 self.rb_block0 = RB(self.num_filters)
 self.rb_block1 = RB(self.num_filters)
 self.rb_block2 = RB(self.num_filters)
 
 def build(self, input_shape):
 self._layers = [
  RB(self.num_filters),
  RB(self.num_filters),
  RB(self.num_filters),
 ]
 super(DecodeNet, self).build(input_shape)
 
 def call(self, tensor):
 tensor = self.rb_block0(tensor)
 tensor = self.rb_block1(tensor)
 for layer in self._layers:
  tensor = layer(tensor)
 tensor = self.rb_block2(tensor)
 return tensor

補(bǔ)充:Python類中的__init__() 和 self 的解析

1、Python中self的含義

self,英文單詞意思很明顯,表示自己,本身。

此處有幾種潛在含義:

1.這里的自己,指的是,實(shí)例Instance本身。

2.同時(shí), 由于說(shuō)到“自己”這個(gè)詞,都是和相對(duì)而言的“其他”而說(shuō)的;而此處的其他,指的是,類Class,和其他變量,比如局部變量,全局變量等。

此處的self,是個(gè)對(duì)象(Object),是當(dāng)前類的實(shí)例。

因此,對(duì)應(yīng)的self.valueName 和 self.function()中的valueName:表示self對(duì)象,即實(shí)例的變量。與其他的,Class的變量,全局的變量,局部的變量,是相對(duì)應(yīng)的。

function:表示是調(diào)用的是self對(duì)象,即實(shí)例的函數(shù)。與其他的全局的函數(shù),是相對(duì)應(yīng)的。

2、Python中為何要有self

那就是:

在類的代碼(函數(shù))中,需要訪問(wèn)當(dāng)前的實(shí)例中的變量和函數(shù)的,即,訪問(wèn)Instance中的:

對(duì)應(yīng)的變量(屬性,property):Instance.ProperyNam,去讀取之前的值和寫入新的值

調(diào)用對(duì)應(yīng)函數(shù)(function):Instance.function(),即執(zhí)行對(duì)應(yīng)的動(dòng)作

-> 而需要訪問(wèn)實(shí)例的變量和調(diào)用實(shí)例的函數(shù),當(dāng)然需要對(duì)應(yīng)的實(shí)例Instance對(duì)象本身

-> 而Python中就規(guī)定好了,函數(shù)的第一個(gè)參數(shù),就必須是實(shí)例對(duì)象本身,并且建議,約定俗成,把其名字寫為self

-> 所以,我們需要self(需要用到self)

而如果沒有用到self,即代碼中,去掉self后,那種寫法所使用到的變量,實(shí)際上不是你所希望的,不是真正的實(shí)例中的變量和函數(shù),而是的訪問(wèn)到了其他部分的變量和函數(shù)了。甚至?xí)捎跊]有合適的初始化實(shí)例變量,而導(dǎo)致后續(xù)無(wú)法訪問(wèn)的錯(cuò)誤。

下面,就通過(guò)代碼,來(lái)演示,如果去掉self,或者沒有合理的使用self,會(huì)出現(xiàn)哪些錯(cuò)誤。

3、首先來(lái)看一下__init__()和self對(duì)象

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies 
class Person(object):
 def __init__(self, name, lang, website):
  self.name = name
  self.lang = lang
  self.website = website
 
  print('self: ', self)
  print('type of self: ', type(self))
'''
未實(shí)例化時(shí),運(yùn)行程序,構(gòu)造方法沒有運(yùn)行
''' 
p = Person('Tim', 'English', 'www.universal.com') 
'''實(shí)例化后運(yùn)行的結(jié)果
self: <__main__.Person object at 0x00000000021EAF98>
type of self: <class '__main__.Person'>
'''

可以看出self為實(shí)例變量p,是一個(gè)Person類型的對(duì)象。

class Dog(object):  
 def __init__(self,name,dog_type):
  self.name = name
  self.type = dog_type 
 def sayhi(self):
  print("hello,I am a dog, my name is ",self.name) 
 
d = Dog('LiChuang',"京巴")   # 實(shí)例化
d.sayhi()

以下是d = Dog('LiChuang',"京巴")實(shí)例化的示意圖:

4、如果沒有在__init__中初始化對(duì)應(yīng)的實(shí)例變量的話,導(dǎo)致后續(xù)引用實(shí)例變量會(huì)出錯(cuò)

如下代碼,完整的演示了,如果沒有在類Class的最初的__init__函數(shù)中,正確的初始化實(shí)例變量,則會(huì)導(dǎo)致后續(xù)沒有變量可用,因而出現(xiàn)AttributeError的錯(cuò)誤:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies 
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
''' 
class Person(object):
 def __init__(self, newPersonName):
  # self.name = newPersonName
  '''
  如果此處不寫成self.name
  那么此處的name,只是__init__函數(shù)中的局部臨時(shí)變量name而已
  和全局中的name,沒有半毛錢關(guān)系
  '''
  name = newPersonName
  '''
  此處只是為了代碼演示,而使用了局部變量name,
  不過(guò)需要注意的是,此處很明顯,由于接下來(lái)的代碼也沒有利用到此處的局部變量name
  則就導(dǎo)致了,此處的name變量,實(shí)際上被浪費(fèi)了,根本沒有利用到
  '''
 def sayYourName(self):
  '''
  此處由于找不到實(shí)例中的name變量,所以會(huì)報(bào)錯(cuò):
  AttributeError: Person instance has no attribute 'name'
  '''
  print('My name is %s' %self.name)
 
def selfAndInitDemo():
 personInstance = Person('Tim')
 personInstance.sayYourName() 
if __name__ == '__main__':
 selfAndInitDemo()
 
''' 未使用self.name時(shí)拋異常
Traceback (most recent call last):
 File "E:/python14_workspace/s14/day06/test_1.py", line 18, in <module>
 selfAndInitDemo()
 File "E:/python14_workspace/s14/day06/test_1.py", line 15, in selfAndInitDemo
 personInstance.sayYourName()
 File "E:/python14_workspace/s14/day06/test_1.py", line 11, in sayYourName
 print('My name is %s' %self.name)
AttributeError: 'Person' object has no attribute 'name'
'''

從上述代碼可見,由于在類的初始化(實(shí)例化)的__init__函數(shù)中,沒有給self.name設(shè)置值,使得實(shí)例中,根本沒有name這個(gè)變量,導(dǎo)致后續(xù)再去訪問(wèn)self.name,就會(huì)出現(xiàn)AttributeError的錯(cuò)誤了。

對(duì)應(yīng)的,如果寫成self.name,則意思就正確了,就是初始化的時(shí)候,給實(shí)例中新增加,并且正常設(shè)置了正確的值newPersionName了,所以后續(xù)再去通過(guò)self.name,就可以訪問(wèn)到,當(dāng)前實(shí)例中正確的變量name了。

相應(yīng)的正確寫法的代碼如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies 
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
''' 
class Person(object):
 def __init__(self, newPersonName):
  self.name = newPersonName
  '''
  此處正確的,通過(guò)訪問(wèn)self.name的形式,實(shí)現(xiàn)了:
   1.給實(shí)例中,增加了name變量
   2.并且給name賦了初值,為newPersionName
  '''
 def sayYourName(self):
  '''
  此處由于開始正確的初始化了self對(duì)象,使得其中有了name變量,
  所以此處可以正確訪問(wèn)了name值了
  '''
  print('My name is %s' %self.name)
 
def selfAndInitDemo():
 personInstance = Person('Tim')
 personInstance.sayYourName()
 
if __name__ == '__main__':
 selfAndInitDemo() 
'''My name is Tim'''

5、在函數(shù)中,使用對(duì)應(yīng)的變量

雖然代碼是可以運(yùn)行的,但是實(shí)際上卻是使用的,不是實(shí)例中的變量

有時(shí)候,雖然你寫的代碼,可以運(yùn)行,但是使用到的變量,由于沒有加self,實(shí)際上是用到的不是實(shí)例的變量,而是其他的變量。

此類問(wèn)題,主要和Python中的變量的作用域有關(guān),但是此處例子中,也和是否使用self有關(guān):

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies 
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''
class Person(object):
 name = 'class global name' 
 def __init__(self, newPersonName):
  # self.name = newPersonName
  '''
  此處,沒有使用self.name
  而使得此處的name,實(shí)際上仍是局部變量name
  雖然此處賦值了,但是后面沒有被利用到,屬于被浪費(fèi)了的局部變量name
  '''
  name = newPersonName
 def sayYourName(self):
  '''
  此處,之所以沒有像之前一樣出現(xiàn):
  AttributeError: Person instance has no attribute 'name'
  那是因?yàn)?,雖然當(dāng)前的實(shí)例self中,沒有在__init__中初始化對(duì)應(yīng)的name變量,實(shí)例self中沒有對(duì)應(yīng)的name變量
  但是由于實(shí)例所對(duì)應(yīng)的類Person,有對(duì)應(yīng)的name變量,所以也是可以正常執(zhí)行代碼的
  對(duì)應(yīng)的,此處的self.name,實(shí)際上是Person.name
  '''
  print('My name is %s' %self.name)
  print('Name within class Person is actually the global name: %s' %name)
  print("Only access Person's name via Person.name = %s" %(Person.name))
 
def selfAndInitDemo():
 personInstance = Person('Tim')
 personInstance.sayYourName()
 print('whole global name is %s' %name)
 
if __name__ == '__main__':
 selfAndInitDemo()
'''
My name is class global name
Name within class Person is actually the global name: whole global name
Only access Person's name via Person.name = class global name
whole global name is whole global name
'''

其中,可見,此處開始__init__中,沒有給self實(shí)例初始化對(duì)應(yīng)的name,

而后面的函數(shù)sayYourName中,雖然可以調(diào)用到self.name而沒有出現(xiàn)AttributeError錯(cuò)誤,

但是實(shí)際上此處的值,不是所期望的,傳入的name,即"Tim",而是類中的name的值,即"class global name"。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 深入了解Python如何操作MongoDB

    深入了解Python如何操作MongoDB

    MongoDB是由C++語(yǔ)言編寫的非關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫(kù)系統(tǒng)。本文主要介紹了如何通過(guò)Python操作MongoDB,需要的可以參考一下
    2022-01-01
  • Python center()函數(shù)使用方法詳解

    Python center()函數(shù)使用方法詳解

    在python中,center()返回一個(gè)原字符居中,并默認(rèn)使用空格填充至長(zhǎng)度width返回新字符串,默認(rèn)填充字符為空格,本就將通過(guò)代碼示例給大家簡(jiǎn)單的介紹一下Python center()函數(shù)是的使用方法,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • python鼠標(biāo)繪圖附代碼

    python鼠標(biāo)繪圖附代碼

    這篇文章主要為大家介紹了python鼠標(biāo)繪圖的實(shí)現(xiàn)完整示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 圖文詳解牛頓迭代算法原理及Python實(shí)現(xiàn)

    圖文詳解牛頓迭代算法原理及Python實(shí)現(xiàn)

    牛頓迭代法又稱為牛頓-拉夫遜(拉弗森)方法,它是牛頓在17世紀(jì)提出的一種在實(shí)數(shù)域和復(fù)數(shù)域上近似求解方程的方法。本文將利用圖文詳解牛頓迭代算法原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • Tensorflow之梯度裁剪的實(shí)現(xiàn)示例

    Tensorflow之梯度裁剪的實(shí)現(xiàn)示例

    這篇文章主要介紹了Tensorflow之梯度裁剪的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python變量和字符串詳解

    Python變量和字符串詳解

    本篇文章主要介紹了Python變量和字符串的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • django反向解析URL和URL命名空間的方法

    django反向解析URL和URL命名空間的方法

    這篇文章主要介紹了django反向解析URL和URL命名空間,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • python?中的?super詳解

    python?中的?super詳解

    這篇文章主要介紹了python?中的?super,提到 super,最直接的想法就是它代表了父類,替父類執(zhí)行某些方法,但是理解也僅止步于此,下面對(duì) super 做進(jìn)一步理解,需要的朋友可以參考下
    2022-08-08
  • python實(shí)現(xiàn)顏色空間轉(zhuǎn)換程序(Tkinter)

    python實(shí)現(xiàn)顏色空間轉(zhuǎn)換程序(Tkinter)

    這篇文章主要介紹了基于Tkinter利用python實(shí)現(xiàn)顏色空間轉(zhuǎn)換程序,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Python中set方法的使用教程詳解

    Python中set方法的使用教程詳解

    在Python中,set是一種集合數(shù)據(jù)類型,表示一個(gè)無(wú)序且不重復(fù)的集合。本文主要為大家詳細(xì)介紹了Python中set方法的使用,需要的可以參考一下
    2023-04-04

最新評(píng)論