W!o+ 的《小伶鼬工坊演義》︰神經網絡【MNIST】六

所謂的

軟體測試

軟體測試英語:software testing),描述一種用來促進鑑定軟體正確性完整性安全性品質的過程。據此,您可能會想,軟體測試永遠不可能完整的確立任意電腦軟體的正確性。然而,在可計算理論(計算機科學的一個支派)一個簡單的數學證明推斷出下列結果:不可能完全解決所謂「當機」,指任意電腦程式是否會進入無窮迴圈,或者罷工並產生輸出問題。換句話說,軟體測試是一種實際輸出與預期輸出間的稽核或者比較過程。

軟體測試的經典定義是:在規定的條件下對程式進行操作,以發現程式錯誤,衡量軟體品質,並對其是否能滿足設計要求進行評估的過程。

軟體測試有許多方法,但對複雜的產品執行有效測試不僅僅是研究過程,更是創造並嚴格遵守某些呆板步驟的大事。測試的其中一個定義:為了評估而質疑產 品的過程;這裡的「質疑」是測試員試著對產品做的事,而產品以測試者腳本行為反應作為回答。雖然大部分測試的智力過程不外乎回顧、檢查,然而「測試」這個 詞意味著產品動態分析──讓產品流暢運行。程式品質可能,而且通常會,隨系統不同而有差異;不過某些公認特性是共通的:可靠性穩定性輕便性易於維護、以及實用性。請參照至ISO標準ISO 9126有更詳盡的說明。

軟體測試介紹

軟體測試一度被認為是編程能力偏低的員工的工作,直到今天,仍然有許多公司把優秀的人才放在編碼上,也有更多公司讓優秀的人才進行設計,可是很少公司讓優秀的人才進行測試工作。實際的軟體工程實踐證明,讓對軟體思想有深刻理解的工程師進行軟體測試的,可以大幅度的提高軟體品質。

───

 

常是個倍受誤解的領域!?或因錯讀孫子兵法的『攻守之道』︰

220px-Inscribed_bamboo-slips_of_Art_of_War

一九七二年

銀雀山出土的

《孫子兵法》竹簡

孫子兵法‧軍形第四

孫子曰:昔之善戰者,先為不可勝,以待敵之可勝。不可勝在己,可勝在敵。故善戰者,能為不可勝,不能使敵之必可勝。故曰:勝可知,而不可為。

不可勝者,守也;可勝者,攻也。守則有餘,攻則不足。善守者,藏於九地之下;善攻者,動於九天之上,故能自保而全勝也。

不過眾人之所知,非善之善者也;戰勝而天下曰善,非善之善者也。故舉秋毫不為多力,見日月不為明目,聞雷霆不為聰耳。

古之所謂善戰者,勝於易勝者也。故善戰者之勝也,無智名,無勇功。故其戰勝不忒。不忒者,其所措必勝,勝已敗者也。故善戰者,立於不敗之地,而不失敵之敗也。是故勝兵先勝而後求戰,敗兵先戰而後求勝。善用兵者,修道而保法,故能為勝敗之政。

兵法:一曰度,二曰量,三曰數,四曰稱,五曰勝。地生度,度生量,量生數,數生稱,稱生勝。故勝兵若以鎰稱銖,敗兵若以銖稱鎰。勝者之戰民也,若決積水於千仞之溪者,也。

俗話說︰勝敗乃兵家常事。兵無常形,水無常勢,觀其『』,從其『』,先讓自己『不可勝』── 敵打不敗也 ── 以待敵對者所給的『可勝』之『』。如果將兵法用於『軟體開發』,那個『敵對者』就是可能的各種『錯誤』 Bugs。因此對於『原型機』上所用的各個『裝置』以及開發『軟體』,都必須要先確定它們『工作正常』。『錯誤』是可敬的對手,這個『敵友』通常比我們更了解自己的吧,所以常能『打敗』我們!因而一個有智慧的人不只能從『自己』的『錯誤中學習』,也能從『他人』的『錯誤中學習』,記取教訓,『善補』思慮不周之『』,走上『不貳過』的大道。

軟體測試』 software testing 的典型定義是:在特定的環境條件下對指定『程式』進行『種種操作』,藉以發現『程式』的『錯誤』,用此衡量它的『軟體品質』,同時對其是否能夠滿足『設計要求』進行『評估』的一套整體程序。

通常人們認為『軟體測試』比『程式設計』簡單,這或許是誤解了『善攻者』之不易,以至於會有『通過測試』,上線後卻發現『程式』不管用之事。實際上『善守者』才容易是『善攻者』,他深知『攻其所必救』與『固其所難攻』之理。

BugsLifeWallpaper800

A Bug’s Life

82_P_1364427653119

─── 摘自《音樂播放器之 CD 轉成 mp3《三》上

 

為求更全面的『評估』 Michael Nielsen 先生首章首選派生程式 network.py 的『辨識率』之問題,我們需要『創想』一種『攻錯』之方法。心想何不就借用『子之矛、子之盾』的耶?

對人來說手寫阿拉伯數字『轉』個小角度,依然很容易辨讀,不知對那個小程式來說是否也如此的呢??於是乎使用

Image Module

The Image module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including functions to load images from files, and to create new images.

Examples

The following script loads an image, rotates it 45 degrees, and displays it using an external viewer (usually xv on Unix, and the paint program on Windows).

Open, rotate, and display an image (using the default viewer)

from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).show()

───

 

先來個『牛刀小試』︰

>>> from PIL import Image, ImageDraw
>>> im = Image.fromarray(img_5)
>>> imr15 = im.rotate(15,Image.BILINEAR )
>>> ima15 = network.np.asarray(imr15)
>>> plt.imshow(ima15,cmap='Greys', interpolation='nearest')
<matplotlib.image.AxesImage object at 0x5a4dcd0>
>>> plt.show()

 

Figure 5_r15

 

果然『辨識成功』的哩!

>>> net.feedforward(ima15)
>>> ima15c = ima15.reshape(784,1)
>>> net.feedforward(ima15c)
array([[  1.54467619e-07],
       [  1.54321744e-07],
       [  1.69959013e-10],
       [  2.03378588e-04],
       [  3.62250580e-06],
       [  5.89892288e-01],
       [  1.64095697e-09],
       [  9.64460480e-05],
       [  1.24254821e-06],
       [  1.58833585e-03]])
>>> network.np.argmax(net.feedforward(ima15c))
5
>>>

 

難道可以這樣一個一個的『驗證』的嗎??因此設想怎不借著

List comprehension

A list comprehension is a syntactic construct available in some programming languages for creating a list based on existing lists. It follows the form of the mathematical set-builder notation (set comprehension) as distinct from the use of map and filter functions.

───

 

翻轉整個『測試資料庫』的呢!這樣才有個『比較標準』的吧!!

>>> test_data_28x28 = [(item.reshape(28,28),dummy) for (item,dummy) in test_data]
>>> im_test_data = [(Image.fromarray(item),dummy) for (item,dummy) in test_data_28x28] 
>>> im_test_data_r15 = [(item.rotate(15,Image.BILINEAR ),dummy) for (item,dummy) in im_test_data]
>>> np_test_data_r15 = [(network.np.asarray(item),dummy) for (item,dummy) in im_test_data_r15]
>>> np_test_data_r15c = [(item.reshape(784,1), dummy) for (item,dummy) in np_test_data_r15]
>>> net.evaluate(test_data=np_test_data_r15c)
8548
>>>

 

AH!HA!! 結果從之前的 9499 / 10000 掉到了 8548 / 10000 ,還當真是給打了折扣的也???