深度学习-10-测试

深度学习-10-测试

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

当前笔记内容主要为:步骤 10  测试 章节的相关理解。

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

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

1.Python 的单元测试

软件开发中测试必不可少,有时候测试都会占用项目流程中很大一段时间。为了保证项目质量,更是要求测试进行相关自动化,以便加速。而且分为sit uat 测试不同阶段,来保证投产质量。

不同的变成语言,有不同测试框架,例如java 里面有junit 框架支持。python 语言里面有 unittest 库来支持。 这里我们以unittest 库来说明。

编写代码

class SquareTest(unittest.TestCase):def test_forward(self):x = Variable(np.array(2.0))y = square(x)expected = np.array(4.0)self.assertEquals(y.data, expected)

执行命令运行测试:

python -m unittest step10.py


注意如果你用的是创建了虚拟venv ,则需要先激活此环境,然后再执行命令

查看输出结果:

(venv) PS C:\pyworkspace\Dezero> python -m unittest step10.py  
C:\pyworkspace\Dezero\step10.py:97: DeprecationWarning: Please use assertEqual instead.        self.assertEquals(y.data, expected)
.
----------------------------------------------------------------------
Ran 1 test in 0.002sOK


我们可以看到测试通过了,并且有汇总信息。这个测试案例是测试-平方函数,我们知道 2的平方等于4 ,结果确实等于4。


2.square 函数反向传播的测试

对square 函数进行反向传播测试, 增加一下代码:

class SquareTest(unittest.TestCase):def test_forward(self):x = Variable(np.array(2.0))y = square(x)expected = np.array(4.0)self.assertEquals(y.data, expected)def test_backward(self):x = Variable(np.array(3.0))y = square(x)y.backward()expected = np.array(6.0)self.assertEquals(x.grad, expected)

其中 test_backward 函数是本次新加的代码        


查看测试结果:

(venv) PS C:\pyworkspace\Dezero>
(venv) PS C:\pyworkspace\Dezero> python -m unittest step10.py
C:\pyworkspace\Dezero\step10.py:104: DeprecationWarning: Please use assertEqual instead.self.assertEquals(x.grad, expected)                                                           
..                                                                    
----------------------------------------------------------------------
Ran 2 tests in 0.002s                                                 OK                                                                    
(venv) PS C:\pyworkspace\Dezero> 

结果正向传播,反向传播的两个测试案例都通过了。y=x^2 的导函数是 y=2x 在x = 3.0 的时候,导函数的值为 2*3.0 = 6.0 正确。


3.通过梯度检验来自动测试

在上面的第二步骤中,我们是手动定义x = 3.0  并且我们手动求导发现导函数是 2x ,并且求得值是  6.0 ,这一步骤是否可以自动化呢?

这里引入一个方法:梯度检验 ,代替手动计算的测试方法。达到高效测试的目的。

# 求导公式计算任意函数倒数
def numberical_diff(f, x, eps= 13-4) :x0= Variable(x.data -eps)x1 = Variable(x.data + eps)y0 = f(x0)y1 = f(x1)return (y1.data -y0.data) /(2*eps)class SquareTest(unittest.TestCase):def test_forward(self):x = Variable(np.array(2.0))y = square(x)expected = np.array(4.0)self.assertEquals(y.data, expected)def test_backward(self):x = Variable(np.array(3.0))y = square(x)y.backward()expected = np.array(6.0)self.assertEquals(x.grad, expected)def test_gradient(self):x = Variable(np.random.random(1))   # 随机生成x 值y = square(x)y.backward()num_grad = numberical_diff(square, x)flg = np.allclose(x.grad, num_grad)   #判断 ndarray 实例的a,b 值是否接近#如果 a 和 b 的所有元素满足以 下条件,则返回 Trueself.assertTrue(flg)


再次执行测试案例:

python -m unittest step10.py 

查看执行结果:

(venv) PS C:\pyworkspace\Dezero> python -m unittest step10.py
C:\pyworkspace\Dezero\step10.py:111: DeprecationWarning: Please use assertEqual instead.self.assertEquals(x.grad, expected)                                                           
...                                                                   
----------------------------------------------------------------------
Ran 3 tests in 0.002s                                                 OK                                                                    
(venv) PS C:\pyworkspace\Dezero> 
4.本节所有代码
'''
step10.py
测试,使用unittest 库自动进行测试
'''import numpy as np
import unittestclass Variable:def __init__(self, data):if data is not None:  # 新增if not isinstance(data, np.ndarray):raise TypeError('{} is not supported'.format(type(data)))self.data = dataself.grad = Noneself.creator = Nonedef set_creator(self, func):self.creator = funcdef backward(self):if self.grad is None:self.grad = np.ones_like(self.data)funcs = [self.creator]while funcs:f = funcs.pop()x, y = f.input, f.outputx.grad = f.backward(y.grad)if x.creator is not None:funcs.append(x.creator)class Function:def __call__(self, input):x = input.datay = self.forward(x)  # 新增output = Variable(as_array(y))  # 转成 ndarray 类型output.set_creator(self)  # 输出者保存创造者对象self.input = inputself.output = output  # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()class Square(Function):def forward(self, x):y = x ** 2return ydef backward(self, gy):x = self.input.datagx = 2 * x * gy  # 方法的参数 gy 是 一个 ndarray 实例 , 它是从输出传播而来的导数 。return gxclass Exp(Function):def forward(self, x):y = np.exp(x)return ydef backward(self, gy):x = self.input.datagx = np.exp(x) * gyreturn gxdef square(x):f = Square()return f(x)def exp(x):f = Exp()return f(x)def as_array(x):  # 新增if np.isscalar(x):  # 使用 np.isscalar 函数来检查 numpy.float64 等属于标量return np.array(x)return x# 求导公式计算任意函数倒数
def numberical_diff(f, x, eps= 13-4) :x0= Variable(x.data -eps)x1 = Variable(x.data + eps)y0 = f(x0)y1 = f(x1)return (y1.data -y0.data) /(2*eps)class SquareTest(unittest.TestCase):def test_forward(self):x = Variable(np.array(2.0))y = square(x)expected = np.array(4.0)self.assertEquals(y.data, expected)def test_backward(self):x = Variable(np.array(3.0))y = square(x)y.backward()expected = np.array(6.0)self.assertEquals(x.grad, expected)def test_gradient(self):x = Variable(np.random.random(1))y = square(x)y.backward()num_grad = numberical_diff(square, x)flg = np.allclose(x.grad, num_grad)   #判断 ndarray 实例的a,b 值是否接近#如果 a 和 b 的所有元素满足以 下条件,则返回 Trueself.assertTrue(flg)if __name__ == '__main__':x = Variable(np.array(0.5))a = square(x)b = exp(a)y = square(b)y.grad = np.array(1.0)y.backward()print(x.grad)# 优化ones_like 初始化后# 不需要定义 y.grad = np.array(1.0) 这个了x = Variable(np.array(0.5))y = square(exp(square(x)))y.backward()print(x.grad)# 错误使用x = Variable(np.array(1.0))x = Variable(None)# x = Variable(1.0)  # 错误使用# Numpy 特性问题x = np.array([1.0])y = x ** 2print(type(x), x.ndim)print(type(y))x = np.array(1.0)y = x ** 2print(type(x), x.ndim)print(type(y))
5.测试小结

通过本节,可以学习如果使用 unittest 这个库进行代码测试。

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

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

相关文章

Web前端ES6-ES13笔记合集(下)

#### 五.ES10新特性 ##### 1. Object.fromEntries > Object.fromEntries()方法允许你轻松地将键值对列表转换为对象 js const arr [["name", "kerwin"], ["age", 100]]; console.log(Object.fromEntries(arr))//{name: kerwin, age: 100} …

pytorch 笔记:pytorch 优化内容(更新中)

1 Tensor创建类 1.1 直接创建Tensor,而不是从Python或Numpy中转换 不要使用原生Python或NumPy创建数据,然后将其转换为torch.Tensor直接用torch.Tensor创建或者直接:torch.empty(), torch.zeros(), torch.full(), torch.ones(), torch.…

树莓派【Raspberry Pi-64位】3b+,Pi4J 2.0入门

一.前言: 前面的文章讲解了树莓派在centos7 arm64版本下的使用,用一款智能小车为例子,做了代码实践。 由于centos7不再维护,且Pi4J 1.x版本也因为WiringPi 的局限,Pi4J从1.x升级为2.x.所以本专栏的技术栈也将进行调整,A.从centos7系统回到Raspberry Pi-64位系统。B.Pi4…

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的,如果修改其值会导致…

《青少年编程与数学》课程方案:4、课程策略

《青少年编程与数学》课程方案:4、课程策略 一、工程师思维二、使命感驱动三、价值观引领四、学习现代化五、工作生活化六、与时代共进 《青少年编程与数学》课程策略强调采用工程师思维,避免重复造轮子,培养使命感,通过探索兴趣、…

编程语言有哪些?这些希望你都知道

编程语言有哪些 编程语言有很多种,包括但不限于以下几种: Java:当今最普遍使用的开发语言之一,简单易学,且跨平台性非常强,对网络开发的支持令人称赞。Python:语法清楚,干净&#…

【Vue】如何提供访问vuex的数据

文章目录 一、提供数据二、访问Vuex中的数据通过$store访问的语法1)模板中使用2)组件逻辑中使用3)js文件中使用 三、通过辅助函数 - mapState获取 state中的数据 一、提供数据 State提供唯一的公共数据源,所有共享的数据都要统一…

[office] 快速删除excel中的空行和列的方法 #其他#学习方法#经验分享

快速删除excel中的空行和列的方法 用户在网上下载好的Excel表格打开之后发现有很多空白行,怎么样将这些空白行或单元格一次性删除掉呢?下面教大家在Excel中用定位一次性可以把空白行删除 用户在网上下载好的Excel表格打开之后发现有很多空白行,怎么样将…

Vue3 使用audio播放语音+监听播放语音完成事件

需求&#xff1a;输入一段文字&#xff0c;点击语音框&#xff0c;将本地语音&#xff08;提前准备好的&#xff09; 播放出来 播放中效果 代码 <div class"listConAI" click"handleOpenSpeech" ><imgsrc"../../../../assets/images/blueo…

web前端 孙俏:深度探索与实战之路

web前端 孙俏&#xff1a;深度探索与实战之路 在这个数字化、信息化的时代&#xff0c;web前端技术以其独特的魅力&#xff0c;吸引着越来越多的开发者投身其中。今天&#xff0c;我们将跟随孙俏的脚步&#xff0c;一同探索web前端的深度与广度&#xff0c;揭开其神秘的面纱。…

中文文案写作有哪些合适的AIGC工具?

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

【Vue】开启严格模式及Vuex的单项数据流

文章目录 一、引出问题二、开启严格模式 一、引出问题 目标 明确 vuex 同样遵循单向数据流&#xff0c;组件中不能直接修改仓库的数据 这样数据的流向才会更加清晰&#xff0c;将来对数据的修改&#xff0c;都在仓库内部实现的&#xff0c;更易于维护 直接在组件中修改Vuex中…

Git:版本控制的艺术与GitLab实战指南

在当今快速发展的软件开发领域&#xff0c;高效、协同的代码管理是项目成功的关键。Git&#xff0c;作为一款分布式版本控制系统&#xff0c;凭借其强大的功能和灵活性&#xff0c;成为了众多开发者首选的版本控制工具。本文将带您深入探索Git的核心概念、基础操作&#xff0c;…

B3870 [GESP202309 四级] 变长编码

[GESP202309 四级] 变长编码 题目描述 小明刚刚学习了三种整数编码方式&#xff1a;原码、反码、补码&#xff0c;并了解到计算机存储整数通常使用补码。但他总是觉得&#xff0c;生活中很少用到 2 31 − 1 2^{31}-1 231−1 这么大的数&#xff0c;生活中常用的 0 ∼ 100 0…

Spring进阶技巧:利用AOP提前介入的巧妙实践

Spring框架中的面向切面编程&#xff08;AOP&#xff09;是一种强大的机制&#xff0c;它允许开发者在不修改原有代码的情况下&#xff0c;对程序进行横向切面的功能扩展。AOP提供了一种方式&#xff0c;可以在目标Bean的生命周期早期阶段就实施切面逻辑&#xff0c;这为我们在…

Python 中如何使用 lambda 函数

在 Python 中&#xff0c;可以使用 lambda 函数来创建匿名函数。lambda 函数的语法是&#xff1a;lambda 参数: 表达式。以下是一些使用 lambda 函数的例子&#xff1a; 通过 lambda 函数来计算两个数的和&#xff1a; add lambda x, y: x y print(add(2, 3)) # 输出 5通过…

Oracle 日志挖掘

oracle 11g 日志挖掘测试 需要开启补充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用户下执行一些删除&#xff0c;插入等操作 SQL> create table zxy( …

LLM评测数据集

1. C-Eval 数据集源地址: C-Eval Official Repository 数据范围: 该数据集包括学科类知识测试&#xff0c;涵盖广泛的学科知识&#xff0c;例如数学、物理、化学等。 数据集大小及数据形式: 数据集包含13,948道单选题&#xff0c;题目均为中文。 论文地址: C-Eval: A Multi-…

【一百一十】【算法分析与设计】[SDOI2009] HH的项链,树状数组应用,查询区间的种类数,树状数组查询区间种类数

P1972 [SDOI2009] HH的项链 [SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一段贝壳&#xff0c;思考它们所表达的含义。HH 不断地收集新的贝壳&#xff0c;因此&am…

SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)

目录 SMS 环境调试 从阿里云云市场中购买第三方短信服务 调试短信验证码功能 实战开发 封装组件 对外接口 调用演示 SMS 环境调试 从阿里云云市场中购买第三方短信服务 a&#xff09;进入阿里云首页&#xff0c;然后从云市场中找到 “短信” &#xff08;一定要从 云…