深度學習-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.pswp.cn/web/24534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24534.shtml
英文地址,請注明出處:http://en.pswp.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;一定要從 云…