深度学习-02-创建变量的函数


深度学习-02-创建变量的函数

        本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。
        当前笔记内容主要为:步骤2 创建变量的函数 章节的相关理解。

     书籍总共分为5个阶段,每个阶段分很多步骤,最终是一步一步实现一个深度学习框架DeZero 。例如前两个阶段为:

  • 第 1 阶段共包括 10 个步骤 。 在这个阶段,将创建自动微分的机制
  • 第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数

1.什么是函数


在步骤1我们定义了箱子,定义了变量,了解了变量是什么,这一章如何将变量变成魔法箱子,就是如何使用变量。
使用变量,莫过于通过函数去实现,变普通箱子为魔法箱子。初中我们就学会了二次函数 f(x) = ax^2+bx+c 和反比例函数 f(x) = k/x ,再熟悉不过了。

在数学中,函数定义是指将一个或多个输入值(称为自变量)映射到一个输出值(称为因变量)的规则。
函数通常用符号表示,例如 f(x),其中 f 表示函数名称,x 表示自变量。

函数定义的要素

  • 定义域: 函数定义域是指所有可以作为输入值的集合。
  • 值域: 函数值域是指所有可能的输出值的集合。
  • 映射规则: 函数的映射规则描述了如何将输入值映射到输出值。

函数与映射扩展

函数和映射在数学中有着密切的联系,它们之间既有区别又有相似之处。

相似点

  • 对应关系: 映射和函数都是描述集合之间对应关系的概念。它们都将一个集合中的元素与另一个集合中的元素建立起对应关系。
  • 输入输出: 映射和函数都涉及输入和输出。输入是来自定义域的元素,输出是来自值域的元素。

区别

  • 唯一性: 函数要求每个输入值必须对应唯一一个输出值。而映射则允许一个输入值对应多个输出值。
  • 定义域: 函数的定义域是所有可能的输入值的集合,而映射的定义域可以是任何集合,即使是空集。
  • 值域: 函数的值域是所有可能的输出值的集合,而映射的值域可以是任何集合,即使是空集

2.Function 类的实现

具体来说,就是假设变 量iX 和 U 是之前实现的 Variable 实例。然后以 Function 类的形式实现可以处理它们的函数 f。
    在 Function 类中实现的方法,只输入应为 Variable 实例,输出应为 Variable 实例 
    Variable 实例的实际数据存在于实例变:W: data 中
    

class Function:def __call__(self, input):x = input.datay = x ** 2output = Variable(y)return output

说明
问题1:python 里面如何使用另外一个文件里面自定义的类?

方法1

    from step01 import *output = Variable(y)


方法2        

    import step01output = step01.Variable(y)

个人感觉,方法1更简洁,使用更为方便。


问题2:python 类里面 实现了 __call__ 方法,用途是什么,有什么含义?

在 Python 类中实现 __call__ 方法,意味着你将这个类实例化后的对象变成了可调用对象,就像函数一样。换句话说,你可以像调用函数一样直接使用这个对象。

用途和含义

使对象可调用: __call__ 方法允许你像调用函数一样调用对象。当你在代码中使用 object() 的形式调用对象时,实际上是调用了 object.__call__() 方法。

此处是定制对象行为: 你可以通过实现 __call__ 方法来定义对象被调用时的行为。例如,你可以让对象在被调用时执行一些特定的操作,或者返回一些特定的值。

定义了这个方法后,当 f = Function() 时,就可以通过编写 f( . .. ) 来调用 __call__ 方法

3.使用 Function 类


类Function 使用:

    x = Variable(np.array(10))f = Function()y = f(x)print(type(y))print(y.data)


输出结果:

C:\Users\Administrator\AppData\Local\Programs\Python\Python39-32\python.exe D:/pyworkspace/dezero-01/step02.py
<class 'step01.Variable'>
100

4.项目代码

基础版定义
实现的 Function 类是 一 个"对输入值求平方"的具体的数

'''
简单版本函数,求某个数的平方 y = f(x)
'''import numpy as np
from step01 import *class Function:def __call__(self, input):x = input.datay = x ** 2output = Variable(y)return output# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':x = Variable(np.array(10))f = Function()y = f(x)print(type(y))print(y.data)

这里的Fuction 定义的是一个 求平方的函数。可能我们已经发现问题所在。

如果定义一个框架,如果只是求平方,肯定是远远不够的。如何扩展出一个基础的函数对象类,并且支持后续定义所有的函数呢?


高阶版定义
最好把 Function 类 作为基类 来实现,并在这个类的内部实现所有 DeZero 函数都有的功能 。
重新设计Function 类,达到以下目标:

  •     Function 类是基类,实现所有函数通用的功能 
  •     具体函数是在继承 Function 类的类中实现的

代码如下:
 


import numpy as np
from step01 import *class Function:def __call__(self, input):x = input.datay = self.forward(x)  # 具体函数在forward 中调用,这样就可以用户自己定义自己的函数output = Variable(y)return outputdef forward(self, x):raise NotImplementedError()class Square(Function):def forward(self, x):return x ** 2

高阶版本函数Function 类使用

'''
实现的 Function 类是 一 个基础类
其他函数继承Function
'''
import numpy as np
from step01 import *class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)return outputdef forward(self, x):raise NotImplementedError()class Square(Function):def forward(self, x):return x ** 2# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':x = Variable(np.array(10))f = Square()y = f(x)print(type(y))print(y.data)

输出结果:

5.总结

本节主要实现了函数的定义,以及基础函数的定义,并以基础版,高阶版,一步一步进行扩展函数的定义,使得其更灵活,对于定义函数来说。

6.遇到问题

问题代码如下:


'''
实现的 Function 类是 一 个"对输入值求平方"的具体的数
'''
import numpy as np
from step01 import *class Function:def __init__(self, input):x = input.datay = x ** 2output = Variable(y)return output# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':print("hello world")x = Variable(np.array(10))f = Function()y = f(x)print(type(y))print(y.data)


提示报错信息:


Traceback (most recent call last):File "D:\pyworkspace\dezero-01\step02.py", line 20, in <module>f = Function()
TypeError: __init__() missing 1 required positional argument: 'input'
hello world

后来我发现我此处是定义一个类,定义了他的构造函数方法,而不是一个函数对象类,将 __init__ 改为  __call__  即可修复此问题。    
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go-Admin后台管理系统源码(GO+VUE)编译与部署

1.克隆源码: # Get backend code git clone https://github.com/go-admin-team/go-admin.git# Get the front-end code git clone https://github.com/go-admin-team/go-admin-ui.git3.下载并安装GO开发环境: 3.编译管理后台后端 # Enter the go-admin backend project cd ./…

Pytorch索引、切片、连接

文章目录 1.torch.cat()2.torch.column_stack()3.torch.gather()4.torch.hstack()5.torch.vstack()6.torch.index_select()7.torch.masked_select()8.torch.reshape9.torch.stack()10.torch.where()11.torch.tile()12.torch.take()13.torch.scatter() 1.torch.cat() torch.cat(…

基于排队理论的客户结账等待时间MATLAB模拟仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 排队系统的组成 4.2 基本概念 4.3 常见的排队模型 5.完整程序 1.程序功能描述 基于排队理论的客户结账等待时间MATLAB模拟仿真&#xff0c;分析平均队长&#xff0c;平均等待时长&…

智慧交通视频AI监控识别解决方案

背景分析 随着社会的进步和科技的不断发展&#xff0c;互联网技术和AI视觉分析技术日益成熟&#xff0c;为传统交通监控领域带来了新的发展机遇。AI视觉分析技术的引入&#xff0c;不仅提升了交通监控的智能化和自动化水平&#xff0c;还显著减轻了交管部门的工作负担&#xf…

雷卯解析AECQ101与AECQ200

AEC&#xff08;汽车电子委员会&#xff09;推出了AECQ101和AECQ200这两项行业标准&#xff0c;作为汽车电子元件的“品质通行证”。上海雷卯已率先申请AECQ101证书。 鉴于有些客户不清楚AECQ101和AECQ200的区别&#xff0c;哪些供应商应该提供什么类别证书。本文将带您解析这…

本地知识库开源框架Fastgpt、MaxKB产品体验

本地知识库开源框架Fastgpt、MaxKB产品体验 背景fastgpt简介知识库共享部署 MaxKB总结 背景 上一篇体验了Quivr、QAnything两个开源知识库模型框架&#xff0c;这次介绍两款小众但是体验比较好的产品。 fastgpt 简介 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&am…

第四范式Q1业务进展:驰而不息 用科技锻造不朽价值

5月28日&#xff0c;第四范式发布今年前三个月的核心业务进展&#xff0c;公司坚持科技创新&#xff0c;业务稳步拓展&#xff0c;用人工智能为千行万业贡献价值。 今年前三个月&#xff0c;公司总收入人民币8.3亿元&#xff0c;同比增长28.5%&#xff0c;毛利润人民币3.4亿元&…

python猜数字游戏

猜数字游戏 计算机随机产生一个1~100的随机数&#xff0c;人输入自己猜的数字&#xff0c; 计算机给出对应的提示“大一点”&#xff0c;”小一点“或”恭喜你猜对了“&#xff0c;直到猜中为止。 如果猜的次数超过7次&#xff0c;计算机温馨提示“智商余额明显不足” import …

SLAM精度评估—evo

evo是一款用于SLAM轨迹精度的评估工具。核心功能是&#xff08;1&#xff09;能够绘制&#xff08;传感器运动&#xff09;轨迹&#xff0c;&#xff08;2&#xff09;评估估计轨迹与真值&#xff08;ground truth&#xff09;的误差。evo支持多种数据集的轨迹格式(TUM、KITT、…

用户购物性别模型标签(USG)之决策树模型

一、USG模型引入: 首先了解一下&#xff0c;如何通过大数据来确定用户的真实性别&#xff0c; 经常谈论的用户精细化运营&#xff0c;到底是什么? 简单来讲&#xff0c;就是将网站的每个用户标签化&#xff0c;制作一个属于用户自己的网络身份证。然后&#xff0c;运营人员 通…

D3D 顶点格式学习

之前D3D画三角形的代码中有这一句&#xff0c; device.VertexFormat CustomVertex.TransformedColored.Format; 这是设置顶点格式&#xff1b; 画出的三角形如下&#xff0c; 顶点格式是描述一个三维模型的顶点信息的格式&#xff1b;可以包含以下内容&#xff0c; 位置…

Xcode设置cocoapods库的最低兼容版本

目录 前言 1.使用cocoapods遇到的问题 2.解决办法 1.用法解释 1. config.build_settings: 2.IPHONEOS_DEPLOYMENT_TARGET 2.使用实例 3.注意事项 1.一致性 2.pod版本 前言 这篇文章主要是介绍如何设置cocoapods三方库如何设置最低兼容的版本。 1.使用cocoapods遇到的…

qt学习笔记

qt的对象树 在 Qt中创建对象的时候会提供一个 Parent 对象指针&#xff0c;Q0bject是以对象树的形式组织起来的。 当你创建一个 Q0biect 对象时&#xff0c;会看到 Q0biect 的构造函数接收一个Q0b.ject指针作为参数&#xff0c;这个参数就是 parent&#xff0c;也就是父对象指…

三次样条插值的实现(Matlab)

一、问题描述 三次样条插值的实现。 二、实验目的 掌握三次样条插值方法的原理&#xff0c;能够编写代码获得自然、抛物线端点以及非纽结三次样条。 三、实验内容及要求 找出并画出三次样条S&#xff0c;满足S(0) 1, S(1) 3, S(2) 3, S(3) 4, S(4) 2&#xff0c;其中…

Spring Boot 开发 -- 过滤器与拦截器详解

引言 在Web开发中&#xff0c;经常需要对请求进行预处理或在响应后进行后处理&#xff0c;Spring Boot提供了过滤器和拦截器两种机制来实现这一需求。虽然它们都可以用来处理HTTP请求和响应&#xff0c;但在使用场景、执行顺序和配置方式上存在明显的差异。本文将详细讲解Spri…

LeetCode 2928.给小朋友们分糖果 I:Java提交的运行时间超过了61%的用户

【LetMeFly】2928.给小朋友们分糖果 I&#xff1a;Java提交的运行时间超过了61%的用户 力扣题目链接&#xff1a;https://leetcode.cn/problems/distribute-candies-among-children-i/ 给你两个正整数 n 和 limit 。 请你将 n 颗糖果分给 3 位小朋友&#xff0c;确保没有任何…

易语言贪吃蛇游戏(附带源码)

易语言贪吃蛇游戏 效果图源码说明源码领取下期更新预报 效果图 源码说明 本源码用易语言来编写&#xff0c;供大家研究&#xff0c;保留版权&#xff0c;谢谢&#xff01; 源码领取 易语言贪吃蛇游戏源码领取地址&#xff1a;https://www.123pan.com/s/ji8kjv-TKPU3.html提取…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后&#xff0c;开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原&#xff0c;增量的备份还原就相对简单。本实践教程直接上操作&#xff0c;还是回归到一个问题&#xff0c;就是关于两个数据库创建时候&#xff0c;必须保持or…

泄漏libc基地址

拿libc基地址 方法一&#xff1a;格式化字符串 格式化字符串&#xff0c;首先确定输入的 AAAA 在栈上的位置&#xff08;x&#xff09;。使用 elf.got[fun] 获得got地址。利用格式化字符串&#xff0c;构造payload泄漏got地址处的值&#xff0c;recv接受到的字符串中&#xf…

linux部署运维1——centos7.9离线安装部署web或java项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中&#xff0c;如果是云服务器&#xff0c;基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的&#xff1b;但是对于一些特殊场合&#xff0c;在没有外部网络的情况下&#xff0c;就无法使用yum命令联网操作&#xff0c;只能通过编…