python中__call()__函数和TensorFlow中call()函数的区别

2023-10-30

在使用python的时候,经常用到python中的特殊函数:__call()__函数,但是学习TensorFlow的时候,又会看到自定义模型的时候,经常用call()函数,不懂他们之间的区别。

python中的__call()__函数和TensorFlow中的call()函数是两个完全不同的函数,但是又有一定的联系。

1.python中的__call__()函数:

该方法是对基类的重载函数,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。

比如:

class CLanguage:
    # 定义__call__方法
    def __call__(self,name,add):
        print("调用__call__()方法",name,add)

clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")

程序执行结果为:

调用__call__()方法 C语言中文网 http://c.biancheng.net

可以看到,通过在 CLanguage 类中实现 __call__() 方法,使的 clangs 实例对象变为了可调用对象。Python 中,凡是可以将 () 直接应用到自身并执行,都称为可调用对象。可调用对象包括自定义的函数、Python 内置函数以及本节所讲的类实例对象。
对于可调用对象,实际上“名称()”可以理解为是“名称.__call__()”的简写。仍以上面程序中定义的 clangs 实例对象为例,其最后一行代码还可以改写为如下形式:

clangs.__call__("C语言中文网","http://c.biancheng.net")

运行程序会发现,其运行结果和之前完全相同。

def say():
    print("Python教程:http://c.biancheng.net/python")
say()
say.__call__()

程序执行结果为:

Python教程:http://c.biancheng.net/python
Python教程:http://c.biancheng.net/python

用 __call__() 弥补 hasattr() 函数的短板:前面章节介绍了 hasattr() 函数的用法,该函数的功能是查找类的实例对象中是否包含指定名称的属性或者方法,但该函数有一个缺陷,即它无法判断该指定的名称,到底是类属性还是类方法。要解决这个问题,我们可以借助可调用对象的概念。要知道,类实例对象包含的方法,其实也属于可调用对象,但类属性却不是。举个例子:

class CLanguage:
    def __init__ (self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    def say(self):
        print("我正在学Python")

clangs = CLanguage()
if hasattr(clangs,"name"):
    print(hasattr(clangs.name,"__call__"))
print("**********")
if hasattr(clangs,"say"):
    print(hasattr(clangs.say,"__call__"))

程序执行结果为:

False
**********
True

可以看到,由于 name 是类属性,它没有以 __call__ 为名的 __call__() 方法;而 say 是类方法,它是可调用对象,因此它有 __call__() 方法。

关于python中特殊函数的使用,可以看http://c.biancheng.net/view/2380.html中对部分特殊函数的详细介绍。

2.TensorFlow中call()

利用网络层类对象进行前向计算时,只需要调用类的 __call__ 方法即可,即写成 model(x) 方式便可,它会自动调用类的 __call__ 方法,在 __call__ 方法中会自动调用 call()方法,这一 设定由 TensorFlow 框架自动完成,因此用户只需要将网络层的 前向计算逻辑实现在 call() 方 法 中即可。
 
class Network(keras.Model):
     # 回归网络模型
     def __init__(self):
         super(Network, self).__init__()
         # 创建 3 个全连接层
         self.fc1 = layers.Dense(64, activation='relu')
         self.fc2 = layers.Dense(64, activation='relu')
         self.fc3 = layers.Dense(1)

     def call(self, inputs, training=None, mask=None):
         # 依次通过 3 个全连接层
         x = self.fc1(inputs)
         x = self.fc2(x)
         x = self.fc3(x)
         return x


model = Network() # 创建网络类实例
# 通过 build 函数完成内部张量的创建,其中 4 为任意设置的 batch 数量,9 为输入特征长度
model.build(input_shape=(4, 9))
model.summary() # 打印网络信息
optimizer = tf.keras.optimizers.RMSprop(0.001) # 创建优化器,指定学习率
接下来实现网络训练部分。通过 Epoch 和 Step 组成的双层循环训练网络,共训练 200
个 Epoch,代码如下:
for epoch in range(200): # 200 个 Epoch
    for step, (x,y) in enumerate(train_db): # 遍历一次训练集
         # 梯度记录器,训练时需要使用它
         with tf.GradientTape() as tape:
             out = model(x) # 通过网络获得输出
             loss = tf.reduce_mean(losses.MSE(y, out)) # 计算 MSE
             mae_loss = tf.reduce_mean(losses.MAE(y, out)) # 计算 MAE
         if step % 10 == 0: # 间隔性地打印训练误差
             print(epoch, step, float(loss))
         # 计算梯度,并更新
         grads = tape.gradient(loss, model.trainable_variables)
         optimizer.apply_gradients(zip(grads, model.trainable_variables))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中__call()__函数和TensorFlow中call()函数的区别 的相关文章

  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 如何解释tf.map_fn的结果?

    看代码 import tensorflow as tf import numpy as np elems tf ones 1 2 3 dtype tf int64 alternates tf map fn lambda x x x x el

随机推荐

  • 【大模型系列 06】LLaMA-7B/13B for PyTorch 昇腾迁移

    源码链接 https gitee com ascend ModelZoo PyTorch tree master PyTorch built in foundation LLaMA 13B LLaMA 7B 13B for PyTorch
  • WIN10+Darknet自建简单数据集训练YOLOv3识别特定物体

    1 在darknet master build darknet x64 新建yolo obj cfg文件 可以直接复制yolov3 cfg 然后重命名为yolo obj cfg 然后就是修改这个文件内容了 将batch 改成64 batch
  • 类别不平衡

    类别不平衡产生原因 类别不平衡 class imbalance 是指分类任务中不同类别的训练样例数目差别很大的情况 产生原因 通常分类学习算法都会假设不同类别的训练样例数目基本相同 如果不同类别的训练样例数目差别很大 则会影响学习结果 测试
  • (八)BaseTableView的简单使用

    BaseTableView的简单使用 现在来说说另一个我封装比较重的UI组件 这个组件要实现什么效果呢 当你使用继承了BaseTableView的子类tableView后 只需要在使用这个类的控制器中传递给tableView一个数据数组 并
  • Vue3回到顶部(BackTop)

    效果如下图 在线预览 APIs 参数 说明 类型 默认值 必传 bottom BackTop 距离页面底部的高度 number string 40 false right BackTop 距离页面右侧的宽度 number string 40
  • 【Three.js】第六章 Animations 动画

    06 Animations动画 介绍 我们创建了一个场景 我们在代码末尾渲染了一次 这已经是不错的进步了 但大多数时候 您会想要为您的作品制作一些动态效果动画 使用 Three js 时 动画效果类似于定格动画 您移动对象 然后进行渲染 然
  • 3、OC运算符优先级

    OC运算符有以下几种 1 算术运算符 2 赋值运算符 lt lt gt gt 3 比较运算符 gt lt gt lt 4 逻辑运算符 5 位运算符 lt lt gt gt 6 类型相关运算符 运算符优先级如下 优先级 运算符 名称或含义
  • QML(一):自定义圆角按钮的处理

    设计自己的按钮作为组件使用 1 设置相关属性 供外部组件调用时 直接更改属性改变组件样式 定义不同圆角状态下的按钮 enum Style NormalButton LowRoundCornerButton HighRoundCornerBu
  • 分页页码的前端显示的实现

    分页页码的前端显示实现 效果说明 准备做分页的时候滚回去找了一下之前写过的demo结果被自己写的丑哭了 大概长这样 主要是不符合现在一般网站的跳转习惯 自己用着都觉得不方便 所以重新写了一下新的分页的前端 顿时觉得舒服了许多 js思路 首先
  • 用python爬取网站小说,帮你们省下会费

    第一步 导库 import requests from lxml import etree 第二步 请求头 headers User Agent Mozilla 5 0 Windows NT 6 1 Win64 x64 AppleWebKi
  • androidstudio无法真机安装debug包 android无法安装debug包 oppo vivo

    1 adb 无法安装debug包 adb install t apk path 绝对路径 2 android stduio 连接设备 点击run 安装失败 1 在application 节点下新增android testOnly true
  • 腾讯mini项目-【指标监控服务重构】2023-07-19

    今日已办 OpenTelemetry Logs 通过日志记录 API 支持日志收集 集成现有的日志记录库和日志收集工具 Overview 日志记录 API Logging API 允许您检测应用程序并生成结构化日志 旨在与其他 teleme
  • 输入IP使用JDBC读取数据库信息并返回具体地址

    思路分析 定义连接类 连接数据库 定义properties 存放mysql信息 读取properties 注册驱动 获取连接 定义测试类 运行主程序 定义输入类 检测控制台输入 定义正则表达式 对输入的ip进行判断 判断通过则调用核心逻辑
  • c++利用libcurl获取http网页的 response headers 等信息

    参考 http www update8 com Program C 26438 html libcurl 7 32 0下载地址 http download csdn net detail chuanyu 9226175 demo下载地址 h
  • 摘要(Hash)算法总结

    数据摘要算法具有不可逆性 其主要功能有数据签名 数据完整性校验等 下面介绍常见的数据摘要算法 一 CRC8 CRC16 CRC32 CRC Cyclic Redundancy Check 循环冗余校验 算法出现时间较长 应用广泛 尤其是通讯
  • 机考[21-30]

    华为机考 021 喊7的次数重排 022 猴子爬山 023 滑动窗口最大和 024 火星文计算 025 计算面积 026 计算最大乘积 027 检查是否存在满足条件的数字组合 028 矩阵扩散 029 矩阵最大值 030 考勤信息 021
  • Vue3子组件向父组件传值

    需要用到emit 举个栗子 比如希望子组件 newHeader vue 向父组件 news vue 传labelId 子组件中先定义一个函数 用于传值 以下是写在子组件 newHeader vue 中的代码 其中 getLabelId是在子
  • unity更改帧率的方法

    介绍 unity更改帧率的方法 方法一 通过编辑器更改帧率 a 在Unity编辑器中 选择 Edit 编辑 菜单 然后选择 Project Settings 项目设置 b 在 Project Settings 中选择 Time 时间 选项卡
  • Python解释器以及PyCharm的安装

    通过CSDN上 大神写的教程 安装了PyCharm 现自己总结Python解释器安装以及PyCharm安装过程 一 Python解释器安装 解释器 英语 Interpreter 又译为直译器 是一种电脑程序能够把高级编程语言一行一行直接转译
  • python中__call()__函数和TensorFlow中call()函数的区别

    在使用python的时候 经常用到python中的特殊函数 call 函数 但是学习TensorFlow的时候 又会看到自定义模型的时候 经常用call 函数 不懂他们之间的区别 python中的 call 函数和TensorFlow中的c