xi'su字典学习
目錄:
- 目錄:
- 第一部分 字典學(xué)習(xí)以及稀疏表示的概要
- 問題1:我們?yōu)槭裁葱枰值鋵W(xué)習(xí)?
- 問題2:我們?yōu)槭裁葱枰∈璞硎?#xff1f;
- 第二部分 稀疏字典學(xué)習(xí)的Python實現(xiàn)
- 用Python實現(xiàn)稀疏字典學(xué)習(xí)需要三個前提條件
- 樣例一:圖片的稀疏字典學(xué)習(xí)
- 參考文獻:
第一部分 字典學(xué)習(xí)以及稀疏表示的概要
字典學(xué)習(xí)(Dictionary Learning)和稀疏表示(Sparse Representation)在學(xué)術(shù)界的正式稱謂應(yīng)該是稀疏字典學(xué)習(xí)(Sparse Dictionary Learning)。該算法理論包含兩個階段:字典構(gòu)建階段(Dictionary Generate)和利用字典(稀疏的)表示樣本階段(Sparse coding with a precomputed dictionary)。這兩個階段(如下圖)的每個階段都有許多不同算法可供選擇,每種算法的誕生時間都不一樣,以至于稀疏字典學(xué)習(xí)的理論提出者已變得不可考。筆者嘗試找了Wikipedia和Google Scolar都無法找到這一系列理論的最早發(fā)起人。
這里有兩個問題是必須要預(yù)先解釋清楚:
問題1:我們?yōu)槭裁葱枰值鋵W(xué)習(xí)?
回答這個問題實際上就是要回答“稀疏字典學(xué)習(xí) ”中的字典是怎么來的。做一個比喻,句子是人類社會最神奇的東西,人類社會的一切知識無論是已經(jīng)發(fā)現(xiàn)的還是沒有發(fā)現(xiàn)的都必然要通過句子來表示出來(從某種意義上講,公式也是句子)。這樣說來,人類懂得的知識可要算是極為浩繁的。有人統(tǒng)計過人類每天新產(chǎn)生的知識可以裝滿一個2T(2048G)大小的硬盤。但無論有多少句子需要被書寫,對于一個句子來說它最本質(zhì)的特征是什么呢?毫無疑問,是一個個構(gòu)成這個句子的單詞(對英語來說)或字(對漢語來說)。所以我們可以很傲嬌的這樣認為,無論人類的知識有多么浩繁,也無論人類的科技有多么發(fā)達,一本長不過20厘米,寬不過15厘米,厚不過4厘米的新華字典或牛津字典足以表達人類從古至今乃至未來的所有知識,那些知識只不過是字典中字的排列組合罷了!直到這里,我相信相當(dāng)一部分讀者或許在心中已經(jīng)明白了字典學(xué)習(xí)的第一個好處——它實質(zhì)上是對于龐大數(shù)據(jù)集的一種降維表示。第二,正如同字是句子最質(zhì)樸的特征一樣,字典學(xué)習(xí)總是嘗試學(xué)習(xí)蘊藏在樣本背后最質(zhì)樸的特征(假如樣本最質(zhì)樸的特征就是樣本最好的特征),這兩條原因同時也是這兩年深度學(xué)習(xí)之風(fēng)日盛的情況下字典學(xué)習(xí)也開始隨之升溫的原因。題外話:現(xiàn)代神經(jīng)科學(xué)表明,哺乳動物大腦的初級視覺皮層干就事情就是圖像的字典表示。
深度學(xué)習(xí)中一類非常強大的網(wǎng)絡(luò),自編碼機就是來源于此,它的效果非常好。
對自編碼機感興趣的可以參考這篇:自編碼器
第二部分 稀疏字典學(xué)習(xí)的Python實現(xiàn)
用Python實現(xiàn)稀疏字典學(xué)習(xí)需要三個前提條件
1.安裝NumPy
2.安裝SciPy
3.安裝Python機器學(xué)習(xí)工具包sklearn
為了避免過于麻煩的安裝,這里我干脆建議諸位讀者安裝Python的商業(yè)發(fā)行版Anaconda,內(nèi)含python集成開發(fā)環(huán)境和數(shù)百個常用的python支持包。具體安裝過程和使用細節(jié)參見我的博客Anaconda debug
Anaconda 安裝
樣例一:圖片的稀疏字典學(xué)習(xí)
這段代碼來源于Python的Dictionary Learning的官方文獻教材,主要用途是教會用戶通過字典學(xué)習(xí)對圖片進行濾波處理。
step1:首先是各種工具包的導(dǎo)入和測試樣例的導(dǎo)入
“`
第3行:讀入的face大小在0~255之間,所以通過除以255將face的大小映射到0~1上去
第6~7行:對圖形進行采樣,把圖片的長和寬各縮小一般。記住array矩陣的訪問方式 array[起始點:終結(jié)點(不包括):步長]
第8行:圖片的長寬大小
第12行:將face的內(nèi)容復(fù)制給distorted,這里不用等號因為等號在python中其實是地址的引用。
第13行:對照片的右半部分加上噪聲,之所以左半部分不加是因為教材想要產(chǎn)生一個對比的效果
第17行:開始計時,并保存在t0中
第18行:tuple格式的pitch大小
第19行:對圖片的左半部分(未加噪聲的部分)提取pitch
第20行:用reshape函數(shù)對data(94500,7,7)進行整形,reshape中如果某一位是-1,則這一維會根據(jù)(元素個數(shù)/已指明的維度)來計算這里經(jīng)過整形后data變成(94500,49)
第21~22行:每一行的data減去均值除以方差,這是zscore標準化的方法
第26行:初始化MiniBatchDictionaryLearning類,并按照初始參數(shù)初始化類的屬性
第27行:調(diào)用fit方法對傳入的樣本集data進行字典提取,components_返回該類fit方法的運算結(jié)果,也就是我們想要的字典V
第31~41行:畫出V中的字典,下面逐行解釋
第31行:figsize方法指明圖片的大小,4.2英寸寬,4英寸高。其中一英寸的定義是80個像素點
第32行:循環(huán)畫出100個字典V中的字
第41行:6個參數(shù)與注釋后的6個屬性對應(yīng)
運行程序,查看輸出結(jié)果:
step3:畫出標準圖像和真正的噪聲,方便同之后字典學(xué)習(xí)學(xué)到的噪聲相比較
程序輸出如下圖所示:
step4:測試不同的字典學(xué)習(xí)方法和參數(shù)對字典學(xué)習(xí)的影響
“`
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行:提取照片中被污染過的右半部進行字典學(xué)習(xí)。
第10~16行:四中不同的字典表示策略
第23行:通過set_params對第二階段的參數(shù)進行設(shè)置
第24行:transform根據(jù)set_params對設(shè)完參數(shù)的模型進行字典表示,表示結(jié)果放在code中。code總共有100列,每一列對應(yīng)著V中的一個字典元素,所謂稀疏性就是code中每一行的大部分元素都是0,這樣就可以用盡可能少的字典元素表示回去。
第25行:code矩陣乘V得到復(fù)原后的矩陣patches
第28行:將patches從(94500,49)變回(94500,7,7)
第32行:通過reconstruct_from_patches_2d函數(shù)將patches重新拼接回圖片
該程序輸出為四中不同轉(zhuǎn)換算法下的降噪效果:
/70)
參考文獻:
1字典學(xué)習(xí)
2稀疏表示
總結(jié)
- 上一篇: mysql log 记录报错 sql语句
- 下一篇: 超强包管理器:Anaconda 安装