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