深度学习-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.data
        y = x ** 2
        output = Variable(y)
        return output

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

方法1

    from step01 import *

    output = Variable(y)


方法2        

    import step01

    output = 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.data
        y = x ** 2
        output = 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.data
        y = self.forward(x)  # 具体函数在forward 中调用,这样就可以用户自己定义自己的函数
        output = Variable(y)
        return output
    def 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.data
        y = self.forward(x)
        output = Variable(y)
        return output
    def 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.data
        y = x ** 2
        output = 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__  即可修复此问题。    
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机离线翻译哪个好?断网翻译也能超丝滑

有时在异国他乡&#xff0c;面对语言不通的窘境&#xff0c;即便是简单的对话也变得异常困难&#xff0c;真是挑战满满&#xff01; 然而&#xff0c;能离线翻译的软件让语言障碍不再是问题&#xff0c;不必依赖网络也能轻松进行翻译啦~ 只需下载所需的语言包&#xff0c;选择…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图&#xff0c;队列 构件图&#xff0c;直接从target出发&#xff0c;扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus&#xff0c;成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌&#xff0c;Claude3发布方Anthropic公司的联合创始人兼CEO&#xff0c;达里奥阿莫迪&#xff08;DarioAmodei&#xff09;承诺&#xff1a;在能够制…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似&#xff0c;只不过这这里不需要劣等马去抵消掉优等马&#xff0c;直接上贪心策略&#xff1a; 先将两个数组排序。针对胃口较小的孩子&#xff0c;从小到大挑选饼干: i. 如果当前饼干能满足&#xff0c;直接喂(最小…

【CPP】栈简介及简化模拟实现

CPP栈和队列简单模拟实现 目录 1. 栈的简介2. 栈简化模拟实现3. 栈练习题 1. 栈的简介 栈 是一种 特殊的线性表&#xff0c;具有数据 先进后出 特点。 具体参考&#xff1a;【数据结构】栈 CPP库参考文档&#xff1a;stl_stack 注意&#xff1a; 1.stack本身 不支持迭代器操…

C++之构造函数总结

1、构造函数定义 在C中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建一个类的对象时自动被调用。构造函数的主要目的是初始化类对象的成员变量&#xff0c;为对象分配资源&#xff0c;以及执行任何其他必要的初始化任务。 构造函数具有以下特点&#xff1a; …

WinApp自动化测试之辅助工具介绍

前篇文章中&#xff0c;我们简单介绍了部分WinApp自动化测试脚本常规操作&#xff0c;今天我们来讲剩余的部分。 文件批量上传 文件批量上传和文件单个上传原理是相同的&#xff0c;单个上传直接传入文件路径即可&#xff0c;批量上传需要进入批量上传的文件所在目录&#xf…

python-双胞胎字符串

[问题描述]&#xff1a;给定两个字符串s和t&#xff0c;每次可以任意交换s的奇数位和偶数位的字符&#xff0c;即奇数位的字符可以与任意其它奇数位的字符交换&#xff0c;偶数位的字符同样也可以与任意偶数位的字符的字符交换&#xff0c;问能否在有限的次数的交换下使s变为t?…

0基础学习Elasticsearch-Quick start

文章目录 1 背景2 前言3 快速部署ES4 快速部署Kibana5 发送请求给ES5.1 打开Kibana控制台5.2 通过REST API发送请求5.3 通过curl发送请求5.4 添加数据5.4.1 添加单个document5.4.2 添加多个document 5.5 搜索数据5.5.1 搜索所有documents5.5.2 match查询 6 总结 1 背景 因电商项…

【算法】模拟算法——外观数组(medium)

题解&#xff1a;模拟算法——外观数组(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 首先应该理解题意&#xff1a; 就是开始给你一个字符串&#xff0c;然后你对其进行描述。 描述规则是&#xff1a;连续的数字为一组&#xff0c;…

大学生社团活动平台系统基于springboot+vue的社团管理系统java项目sprignboot项目

文章目录 大学生社团活动平台一、项目介绍二、部分功能截图三、部分代码展示四、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 大学生社团活动平台 一、项目介绍 基于springbootvue的前后端分离大学生社团活动平台 系统角色 : 学生、社长、管理员 1、学生…

自学 Java 怎么入门?

关于自学 Java 如何入门这一重要课题&#xff0c;在此为大家进行详细阐述。 在此之前&#xff0c;如果大家有兴趣的话&#xff0c;可以看看我自己精心整理的嵌入式入门资料&#xff0c;这些资料将全部免费送给大家。其中包含了编程教学内容、详细的视频讲解、实用的数据库资料…

Java项目:92 基于SSM的办公管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 基于SSM的办公管理系统 1、项目介绍 基于SSM的办公管理系统主要是对于办公用品的申领进行管理&#xff0c;系统分为三种角色&#xff0c;超级管理员、企业 职…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块&#xff1f;1.2 为什么不使用Encoder模块&#xff1f; 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中&#xff0c;深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…

C++匿名对象

struct&#xff1a;结构体内默认访问权限&#xff1a;public公共->哪里都能用 class&#xff1a;结构体内默认访问权限&#xff1a;private私有->只能在类里使用 简单版本&#xff1a; class SV { public:SV(int dt 520):_data1(dt){};int R_num(){return _data1;}priv…

易语言本地IP一键切换程序(附带源码)

易语言本地IP一键切换程序 效果图部分源码源码领取下期更新预报 效果图 部分源码 .判断开始 (单选框1.选中 &#xff1d; 真)标签5.标题 &#xff1d; #换行符 &#xff0b; “正在切换IP.”.如果真 (运行 (“netsh interface ip set address ” &#xff0b; #引号 &#xff…

yxc图示“链式前向星”核心操作

【知识点&#xff1a;链式前向星】 ● 大佬 yxc 指出“链式前向星”就是“多单链表”&#xff0c;并基于“头插法”给出了所涉及到的 e[]、ne[]、h[] 等数组的独特解释&#xff0c;更易理解。其中&#xff1a;h[a]&#xff1a;存储单链表表头结点 a 的编号e[idx]&#xff1a;存…

vue-el-steps 使用1(上一步、下一步)

vue代码 <template> <div class"app-container"> <el-steps :active"active" finish-status"success" simple style"margin-top: 20px"> <el-step title"选择分类"></el-step> <el-step t…

Linux实验报告(一)——Linux系统安装与简单配置

目录 一、实验名称&#xff1a; 二、仪器、设备&#xff1a; 三、参考资料&#xff1a; 四、实验目的&#xff1a; 五、实验内容&#xff08;步骤&#xff09;&#xff1a; 六、实验数据&#xff08;程序&#xff09;记录&#xff1a; 七、实验结果分析&#xff1a; 八、…