xi'su字典学习
目錄:
- 目錄:
- 第一部分 字典學習以及稀疏表示的概要
- 問題1:我們為什么需要字典學習?
- 問題2:我們為什么需要稀疏表示?
- 第二部分 稀疏字典學習的Python實現
- 用Python實現稀疏字典學習需要三個前提條件
- 樣例一:圖片的稀疏字典學習
- 參考文獻:
第一部分 字典學習以及稀疏表示的概要
字典學習(Dictionary Learning)和稀疏表示(Sparse Representation)在學術界的正式稱謂應該是稀疏字典學習(Sparse Dictionary Learning)。該算法理論包含兩個階段:字典構建階段(Dictionary Generate)和利用字典(稀疏的)表示樣本階段(Sparse coding with a precomputed dictionary)。這兩個階段(如下圖)的每個階段都有許多不同算法可供選擇,每種算法的誕生時間都不一樣,以至于稀疏字典學習的理論提出者已變得不可考。筆者嘗試找了Wikipedia和Google Scolar都無法找到這一系列理論的最早發起人。
這里有兩個問題是必須要預先解釋清楚:
問題1:我們為什么需要字典學習?
回答這個問題實際上就是要回答“稀疏字典學習 ”中的字典是怎么來的。做一個比喻,句子是人類社會最神奇的東西,人類社會的一切知識無論是已經發現的還是沒有發現的都必然要通過句子來表示出來(從某種意義上講,公式也是句子)。這樣說來,人類懂得的知識可要算是極為浩繁的。有人統計過人類每天新產生的知識可以裝滿一個2T(2048G)大小的硬盤。但無論有多少句子需要被書寫,對于一個句子來說它最本質的特征是什么呢?毫無疑問,是一個個構成這個句子的單詞(對英語來說)或字(對漢語來說)。所以我們可以很傲嬌的這樣認為,無論人類的知識有多么浩繁,也無論人類的科技有多么發達,一本長不過20厘米,寬不過15厘米,厚不過4厘米的新華字典或牛津字典足以表達人類從古至今乃至未來的所有知識,那些知識只不過是字典中字的排列組合罷了!直到這里,我相信相當一部分讀者或許在心中已經明白了字典學習的第一個好處——它實質上是對于龐大數據集的一種降維表示。第二,正如同字是句子最質樸的特征一樣,字典學習總是嘗試學習蘊藏在樣本背后最質樸的特征(假如樣本最質樸的特征就是樣本最好的特征),這兩條原因同時也是這兩年深度學習之風日盛的情況下字典學習也開始隨之升溫的原因。題外話:現代神經科學表明,哺乳動物大腦的初級視覺皮層干就事情就是圖像的字典表示。
深度學習中一類非常強大的網絡,自編碼機就是來源于此,它的效果非常好。
對自編碼機感興趣的可以參考這篇:自編碼器
問題2:我們為什么需要稀疏表示?
回答這個問題毫無疑問就是要回答“稀疏字典學習”中稀疏兩字的來歷。不妨再舉一個例子。相信大部分人都有這樣一種感覺,當我們在解涉及到新的知識點的數學題時總有一種累心(累腦)的感覺。但是當我們通過艱苦卓絕的訓練將新的知識點牢牢掌握時,再解決與這個知識點相關的問題時就不覺得很累了。這是為什么呢?意大利羅馬大學的Fabio Babiloni教授曾經做過一項實驗,他們讓新飛行員駕駛一架飛機并采集了他們駕駛狀態下的腦電,同時又讓老飛行員駕駛飛機并也采集了他們駕駛狀態下的腦電。如下圖所示:
隨后Fabio教授計算出了兩類飛行員的大腦的活躍狀態,如下圖:
左圖是新飛行員(不熟練的飛行員)的大腦。圖中黃色的部分,是被認為活躍的腦區。右圖是老飛行員(熟練的飛行員)的大腦,黃色區域相比左邊的圖有明顯的減少。換言之,針對某一特定任務(這里是飛行),熟練者的大腦可以調動盡可能少的腦區消耗盡可能少的能量進行同樣有效的計算(所以熟悉知識點的你,大腦不會再容易覺得累了),并且由于調動的腦區很少,大腦計算速度也會變快,這就是我們稱熟練者為熟練者的原理所在。站在我們所要理解的稀疏字典學習的角度上來講就是大腦學會了知識的稀疏表示。
稀疏表示的本質:用盡可能少的資源表示盡可能多的知識,這種表示還能帶來一個附加的好處,即計算速度快。
在懂得“字典”和“稀疏”各自的那點事兒以后,我們還要再講講稀疏和字典共同的那點兒事。或許在大腦中“字典”和“稀疏”是兩個不怎么想干的階段,畢竟“字典”涉及初級視覺皮層,而“稀疏”涉及前額葉皮層。但是在計算機中,“字典”和“稀疏”卻是一堆孿生兄弟。在學習樣本字典之初的時候,稀疏條件就已經被加入了。我們希望字典里的字可以盡能的少,但是卻可以盡可能的表示最多的句子。這樣的字典最容易滿足稀疏條件。也就是說,這個“字典”是這個“稀疏”私人訂制的。
第二部分 稀疏字典學習的Python實現
用Python實現稀疏字典學習需要三個前提條件
1.安裝NumPy
2.安裝SciPy
3.安裝Python機器學習工具包sklearn
為了避免過于麻煩的安裝,這里我干脆建議諸位讀者安裝Python的商業發行版Anaconda,內含python集成開發環境和數百個常用的python支持包。具體安裝過程和使用細節參見我的博客Anaconda debug
Anaconda 安裝
樣例一:圖片的稀疏字典學習
這段代碼來源于Python的Dictionary Learning的官方文獻教材,主要用途是教會用戶通過字典學習對圖片進行濾波處理。
step1:首先是各種工具包的導入和測試樣例的導入
“`
第3行:讀入的face大小在0~255之間,所以通過除以255將face的大小映射到0~1上去
第6~7行:對圖形進行采樣,把圖片的長和寬各縮小一般。記住array矩陣的訪問方式 array[起始點:終結點(不包括):步長]
第8行:圖片的長寬大小
第12行:將face的內容復制給distorted,這里不用等號因為等號在python中其實是地址的引用。
第13行:對照片的右半部分加上噪聲,之所以左半部分不加是因為教材想要產生一個對比的效果
第17行:開始計時,并保存在t0中
第18行:tuple格式的pitch大小
第19行:對圖片的左半部分(未加噪聲的部分)提取pitch
第20行:用reshape函數對data(94500,7,7)進行整形,reshape中如果某一位是-1,則這一維會根據(元素個數/已指明的維度)來計算這里經過整形后data變成(94500,49)
第21~22行:每一行的data減去均值除以方差,這是zscore標準化的方法
第26行:初始化MiniBatchDictionaryLearning類,并按照初始參數初始化類的屬性
第27行:調用fit方法對傳入的樣本集data進行字典提取,components_返回該類fit方法的運算結果,也就是我們想要的字典V
第31~41行:畫出V中的字典,下面逐行解釋
第31行:figsize方法指明圖片的大小,4.2英寸寬,4英寸高。其中一英寸的定義是80個像素點
第32行:循環畫出100個字典V中的字
第41行:6個參數與注釋后的6個屬性對應
運行程序,查看輸出結果:
step3:畫出標準圖像和真正的噪聲,方便同之后字典學習學到的噪聲相比較
程序輸出如下圖所示:
step4:測試不同的字典學習方法和參數對字典學習的影響
“`
print(‘Extracting noisy patches… ‘)
t0 = time()
data = extract_patches_2d(distorted[:, width // 2:], patch_size)
data = data.reshape(data.shape[0], -1)
intercept = np.mean(data, axis=0)
data -= intercept
print(‘done in %.2fs.’ % (time() - t0))
transform_algorithms = [
(‘Orthogonal Matching Pursuit\n1 atom’, ‘omp’,
{‘transform_n_nonzero_coefs’: 1}),
(‘Orthogonal Matching Pursuit\n2 atoms’, ‘omp’,
{‘transform_n_nonzero_coefs’: 2}),
(‘Least-angle regression\n5 atoms’, ‘lars’,
{‘transform_n_nonzero_coefs’: 5}),
(‘Thresholding\n alpha=0.1’, ‘threshold’, {‘transform_alpha’: .1})]
reconstructions = {}
for title, transform_algorithm, kwargs in transform_algorithms:
print(title + ‘…’)
reconstructions[title] = face.copy()
t0 = time()
dico.set_params(transform_algorithm=transform_algorithm, **kwargs)
code = dico.transform(data)
patches = np.dot(code, V)
patches += intercept
patches = patches.reshape(len(data), *patch_size)
if transform_algorithm == ‘threshold’:
patches -= patches.min()
patches /= patches.max()
reconstructions[title][:, width // 2:] = reconstruct_from_patches_2d(
patches, (height, width // 2))
dt = time() - t0
print(‘done in %.2fs.’ % dt)
show_with_diff(reconstructions[title], face,
title + ’ (time: %.1fs)’ % dt)
plt.show()
“`
第3行:提取照片中被污染過的右半部進行字典學習。
第10~16行:四中不同的字典表示策略
第23行:通過set_params對第二階段的參數進行設置
第24行:transform根據set_params對設完參數的模型進行字典表示,表示結果放在code中。code總共有100列,每一列對應著V中的一個字典元素,所謂稀疏性就是code中每一行的大部分元素都是0,這樣就可以用盡可能少的字典元素表示回去。
第25行:code矩陣乘V得到復原后的矩陣patches
第28行:將patches從(94500,49)變回(94500,7,7)
第32行:通過reconstruct_from_patches_2d函數將patches重新拼接回圖片
該程序輸出為四中不同轉換算法下的降噪效果:
/70)
參考文獻:
1字典學習
2稀疏表示
總結
- 上一篇: mysql log 记录报错 sql语句
- 下一篇: php隐藏做上传图片,php做图片上传功