次要選擇顏色的時候,我總是會從眾多配色工具找一兩個自己喜歡的,無論從中尋找靈感或挑選合適的顏色都很好用,例如:Coolors快速選色器,后來改版后界面稍微有變得復(fù)雜一些;另外還有Colordot更人性化的選色工具服務(wù),在移動鼠標(biāo)搖標(biāo)時輕松找出配色靈感;我也喜歡NIPPON COLORS代表日本的250種顏色,這是找尋日本傳統(tǒng)色系配色的絕佳網(wǎng)站。
越簡單的工具越深得我心,至少可快速解決問題而不用花太多時間摸索,本文要推薦的「ColorSpark」是一款非常易用的選色器,開啟網(wǎng)站按下「生成」按鈕,每次都會隨機出現(xiàn)一種顏色,同時也會顯示十六進(jìn)制顏色代碼可快速復(fù)制。
除此之外,ColorSpark還提供漸層色(梯度)產(chǎn)生器,之前在WebGradients和CoolHue有介紹過收錄漸層背景免費下載的網(wǎng)站,現(xiàn)在你也可以在這項服務(wù)上隨機產(chǎn)生漸層色,一鍵快速復(fù)制CSS3語法,將它加入你的網(wǎng)站設(shè)計。
站點名稱:ColorSpark
網(wǎng)站連接:HTTPS://colorspark.app/
使用教學(xué)
步驟1
開啟ColorSpark會隨機出現(xiàn)一個顏色,下方會有十六進(jìn)制色碼,點選「生成」重新產(chǎn)生一個顏色,每個顏色之間沒什么關(guān)連,可以多按幾次看看有沒有讓自己賞心悅目的顏色。
STEP 2
點選上方的「漸變」切換成漸層色模式,會顯示兩種顏色及偏移角度。
點擊右下角的「復(fù)制CSS」可快速復(fù)制CSS3代碼,將它放進(jìn)CSS檔就能成為背景顏色使用。當(dāng)然還有其他使用方法,可以自己研究一下語法,總之ColorSpark主要用途就是讓使用者找到配色靈感。
STEP 3
此外,ColorSpark還提供夜間模式,從右上角點選月亮圖標(biāo)切換,夜間模式底色會變深色,但功能一樣沒變,蠻有趣的功能。
依照ColorSpark說明表示這項服務(wù)是為了讓設(shè)計師找到獨特的顏色和漸層組合,通過這個可產(chǎn)生隨機顏色和漸變顏色的工具,可以找到一些原本不知道的顏色,這是一個有趣的實驗,或許可以為你的下一個設(shè)計項目激發(fā)出靈感。
67運營推薦值得一試的三個理由:
1、可隨機產(chǎn)生顏色或漸層色組合
2、 一鍵復(fù)制十六進(jìn)制色碼或CSS3代碼
3、 界面簡單易用,內(nèi)置夜間模式降低亮度
文約11000字,建議閱讀15+分鐘
本文詳細(xì)對比了各種超參數(shù)對CNN模型性能的影響。
使用沒有 batchnorm 的 ELU 非線性或者有 batchnorm 的 ReLU。
用類似1*1的網(wǎng)絡(luò)結(jié)構(gòu)預(yù)訓(xùn)練RGB數(shù)據(jù),能得到更好的效果。
使用線性學(xué)習(xí)率衰退策略。
使用平均和最大池化層的和。
使用大約 128(0.005) 到 256 (0.01)的 mini-batch 大小。如果這對你的 GPU 而言太大,將學(xué)習(xí)率按比例降到這個大小就行。
使用卷積層代替之前的MLP中的線性層,并用平均池化層預(yù)測。
當(dāng)研究增加訓(xùn)練集大小的時候,需要確定數(shù)據(jù)集對性能提升的平衡點。
數(shù)據(jù)的質(zhì)量要比數(shù)據(jù)大小更重要。
如果你不能增加輸入圖像的大小,在隨后的層上減少步幅(stride),這樣做有同樣的效果。
如果你的網(wǎng)絡(luò)有復(fù)雜和高度優(yōu)化的架構(gòu),像是 GoogLeNet,那修改一定要謹(jǐn)慎。
其他可以詳細(xì)看看論文,作者很辛苦的對比了各種超參數(shù)對CNN模型性能的影響,非常值得一看。
這個列表里提到的思路并完全,但是一個好的開始。
我的目的是給出很多可以嘗試的思路,希望其中的一或兩個你之前沒有想到。你經(jīng)常只需要一個好的想法就能得到性能提升。
如果你能從其中一個思路中得到結(jié)果,請在評論區(qū)告訴我。我很高興能得知這些好消息。
如果你有更多的想法,或者是所列思路的拓展,也請告訴我,我和其他讀者都將受益!
有時候僅僅是一個想法或許就能使他人得到突破。
我將此博文分為四個部分:
通常來講,隨著列表自上而下,性能的提升也將變小。例如,對問題進(jìn)行新的架構(gòu)或者獲取更多的數(shù)據(jù),通常比調(diào)整最優(yōu)算法的參數(shù)能帶來更好的效果。雖然并不總是這樣,但是通常來講是的。
我已經(jīng)把相應(yīng)的鏈接加入了博客的教程中,相應(yīng)網(wǎng)站的問題中,以及經(jīng)典的Neural Net FAQ中。
部分思路只適用于人工神經(jīng)網(wǎng)絡(luò),但是大部分是通用的。通用到足夠你用來配合其他技術(shù)來碰撞出提升模型性能的方法。
OK,現(xiàn)在讓我們開始吧。
1. 通過數(shù)據(jù)提升性能
對你的訓(xùn)練數(shù)據(jù)和問題定義進(jìn)行適當(dāng)改變,你能得到很大的性能提升。或許是最大的性能提升。
以下是我將要提到的思路:
你能獲取更多訓(xùn)練數(shù)據(jù)嗎?
你的模型的質(zhì)量通常受到你的訓(xùn)練數(shù)據(jù)質(zhì)量的限制。為了得到最好的模型,你首先應(yīng)該想辦法獲得最好的數(shù)據(jù)。你也想盡可能多的獲得那些最好的數(shù)據(jù)。
有更多的數(shù)據(jù),深度學(xué)習(xí)和其他現(xiàn)代的非線性機器學(xué)習(xí)技術(shù)有更全的學(xué)習(xí)源,能學(xué)得更好,深度學(xué)習(xí)尤為如此。這也是機器學(xué)習(xí)對大家充滿吸引力的很大一個原因(世界到處都是數(shù)據(jù))。
更多的數(shù)據(jù)并不是總是有用,但是確實有幫助。于我而言,如果可以,我會選擇獲取更多的數(shù)據(jù)。
可以參見以下相關(guān)閱讀:
Datasets Over Algorithms
(www.edge.org/response-detail/26587)
2) 創(chuàng)造更多數(shù)據(jù)
上一小節(jié)說到了有了更多數(shù)據(jù),深度學(xué)習(xí)算法通常會變的更好。有些時候你可能無法合理地獲取更多數(shù)據(jù),那你可以試試創(chuàng)造更多數(shù)據(jù)。
這通常被稱作數(shù)據(jù)擴增(data augmentation)或者數(shù)據(jù)生成(data generation)。
你可以利用一個生成模型。你也可以用一些簡單的技巧。例如,針對圖片數(shù)據(jù),你可以通過隨機地平移或旋轉(zhuǎn)已有圖片獲取性能的提升。如果新數(shù)據(jù)中包含了這種轉(zhuǎn)換,則提升了模型的泛化能力。
這也與增加噪聲是相關(guān)的,我們習(xí)慣稱之為增加擾動。它起到了與正則化方法類似的作用,即抑制訓(xùn)練數(shù)據(jù)的過擬合。
以下是相關(guān)閱讀:
這是一個快速獲得性能提升的方法。
當(dāng)應(yīng)用神經(jīng)網(wǎng)絡(luò)時,一個傳統(tǒng)的經(jīng)驗法則是:重縮放(rescale)你的數(shù)據(jù)至激活函數(shù)的邊界。
如果你在使用sigmoid激活函數(shù),重縮放你的數(shù)據(jù)到0和1的區(qū)間里。如果你在使用雙曲正切(tanh)激活函數(shù),重縮放數(shù)據(jù)到-1和1的區(qū)間里。
這種方法可以被應(yīng)用到輸入數(shù)據(jù)(x)和輸出數(shù)據(jù)(y)。例如,如果你在輸出層使用sigmoid函數(shù)去預(yù)測二元分類的結(jié)果,應(yīng)當(dāng)標(biāo)準(zhǔn)化y值,使之成為二元的。如果你在使用softmax函數(shù),你依舊可以通過標(biāo)準(zhǔn)化y值來獲益。
這依舊是一個好的經(jīng)驗法則,但是我想更深入一點。我建議你可以參考下述方法來創(chuàng)造一些訓(xùn)練數(shù)據(jù)的不同的版本:
然后對每一種方法,評估你的模型的性能,選取最好的進(jìn)行使用。如果你改變了你的激活函數(shù),重復(fù)這一過程。
在神經(jīng)網(wǎng)絡(luò)中,大的數(shù)值累積效應(yīng)(疊加疊乘)并不是好事,除上述方法之外,還有其他的方法來控制你的神經(jīng)網(wǎng)絡(luò)中數(shù)據(jù)的數(shù)值大小,譬如歸一化激活函數(shù)和權(quán)重,我們會在以后討論這些技術(shù)。
以下為相關(guān)閱讀:
這里的數(shù)據(jù)變換與上述的重縮放方法類似,但需要更多工作。
你必須非常熟悉你的數(shù)據(jù)。通過可視化來考察離群點。
猜測每一列數(shù)據(jù)的單變量分布。
依靠你的直覺,嘗試以下方法。
神經(jīng)網(wǎng)層擅長特征學(xué)習(xí)(feature engineering)。它(自己)可以做到這件事。但是如果你能更好的發(fā)現(xiàn)問題到網(wǎng)絡(luò)中的結(jié)構(gòu),神經(jīng)網(wǎng)層會學(xué)習(xí)地更快。你可以對你的數(shù)據(jù)就不同的轉(zhuǎn)換方式進(jìn)行抽樣調(diào)查,或者嘗試特定的性質(zhì),來看哪些有用,哪些沒用。
以下是相關(guān)閱讀:
一般說來,神經(jīng)網(wǎng)絡(luò)對不相關(guān)的特征是具有魯棒的(校對注:即不相關(guān)的特征不會很大影響神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和效果)。它們會用近似于0的權(quán)重來弱化那些沒有預(yù)測能力的特征的貢獻(xiàn)。
盡管如此,這些無關(guān)的數(shù)據(jù)特征,在訓(xùn)練周期依舊要耗費大量的資源。所以你能去除數(shù)據(jù)里的一些特征嗎?
有許多特征選擇的方法和特征重要性的方法,這些方法能夠給你提供思路,哪些特征該保留,哪些特征該剔除。最簡單的方式就是對比所有特征和部分特征的效果。
同樣的,如果你有時間,我建議在同一個網(wǎng)絡(luò)中嘗試選擇不同的視角來看待你的問題,評估它們,來看看分別有怎樣的性能。
以下是相關(guān)閱讀:
有時候要試試從你當(dāng)前定義的問題中跳出來,想想你所收集到的觀察值是定義你問題的唯一方式嗎?或許存在其他方法。或許其他構(gòu)建問題的方式能夠更好地揭示待學(xué)習(xí)問題的結(jié)構(gòu)。
我真的很喜歡這個嘗試,因為它迫使你打開自己的思路。這確實很難,尤其是當(dāng)你已經(jīng)對當(dāng)前的方法投入了大量的時間和金錢時。
但是咱們這么想想,即使你列出了3-5個可供替代的建構(gòu)方案,而且最終還是放棄了它們,但這至少說明你對當(dāng)前的方案更加自信了。
仔細(xì)思考你的問題,最好在你選定工具之前就考慮用不同方法構(gòu)建你的問題,因為此時你對解決方案并沒有花費太多的投入。除此之外,如果你在某個問題上卡住了,這樣一個簡單的嘗試能釋放更多新的想法。
而且,這并不代表你之前的工作白干了,關(guān)于這點你可以看看后續(xù)的模型嵌套部分。
以下為相關(guān)閱讀:
機器學(xué)習(xí)當(dāng)然是用算法解決問題。
所有的理論和數(shù)學(xué)都是描繪了應(yīng)用不同的方法從數(shù)據(jù)中學(xué)習(xí)一個決策過程(如果我們這里只討論預(yù)測模型)。
你已經(jīng)選擇了深度學(xué)習(xí)來解釋你的問題。但是這真的是最好的選擇嗎?在這一節(jié)中,我們會在深入到如何最大地發(fā)掘你所選擇的深度學(xué)習(xí)方法之前,接觸一些算法選擇上的思路。
下面是一個簡要列表:
下面我解釋下上面提到的幾個方法。
其實你事先無法知道,針對你的問題哪個算法是最優(yōu)的。如果你知道,你可能就不需要機器學(xué)習(xí)了。那有沒有什么數(shù)據(jù)(辦法)可以證明你選擇的方法是正確的?
讓我們來解決這個難題。當(dāng)從所有可能的問題中平均來看各算法的性能時,沒有哪個算法能夠永遠(yuǎn)勝過其他算法。所有的算法都是平等的,下面是在no free lunch theorem中的一個總結(jié)。
或許你選擇的算法不是針對你的問題最優(yōu)的那個
我們不是在嘗試解決所有問題,算法世界中有很多新熱的方法,可是它們可能并不是針對你數(shù)據(jù)集的最優(yōu)算法。
我的建議是收集(證據(jù))數(shù)據(jù)指標(biāo)。接受更好的算法或許存在這一觀點,并且給予其他算法在解決你的問題上“公平競爭”的機會。
抽樣調(diào)查一系列可行的方法,來看看哪些還不錯,哪些不理想。
選取性能最好的算法,然后通過進(jìn)一步的調(diào)參和數(shù)據(jù)準(zhǔn)備來提升。尤其注意對比一下深度學(xué)習(xí)和其他常規(guī)機器學(xué)習(xí)方法,對上述結(jié)果進(jìn)行排名,比較他們的優(yōu)劣。
很多時候你會發(fā)現(xiàn)在你的問題上可以不用深度學(xué)習(xí),而是使用一些更簡單,訓(xùn)練速度更快,甚至是更容易理解的算法。
以下為相關(guān)閱讀:
方法選擇的一個捷徑是借鑒已有的文獻(xiàn)資料。可能有人已經(jīng)研究過與你的問題相關(guān)的問題,你可以看看他們用的什么方法。
你可以閱讀論文,書籍,博客,問答網(wǎng)站,教程,以及任何能在谷歌搜索到的東西。
寫下所有的想法,然后用你的方式把他們研究一遍。
這不是復(fù)制別人的研究,而是啟發(fā)你想出新的想法,一些你從沒想到但是卻有可能帶來性能提升的想法。
發(fā)表的研究通常都是非常贊的。世界上有非常多聰明的人,寫了很多有趣的東西。你應(yīng)當(dāng)好好挖掘這個“圖書館”,找到你想要的東西。
以下為相關(guān)閱讀:
你必須知道你的模型效果如何。你對模型性能的估計可靠嗎?
深度學(xué)習(xí)模型在訓(xùn)練階段非常緩慢。這通常意味著,我們無法用一些常用的方法,例如k層交叉驗證,去估計模型的性能。
而有時候另外的方式,或許你能夠讓數(shù)據(jù)集變得更小,以及使用更強的重采樣方法。
以下為相關(guān)閱讀:
這通常是工作的關(guān)鍵所在。你經(jīng)常可以通過抽樣調(diào)查快速地發(fā)現(xiàn)一個或兩個性能優(yōu)秀的算法。但是如果想得到最優(yōu)的算法可能需要幾天,幾周,甚至幾個月。
為了獲得更優(yōu)的模型,以下是對神經(jīng)網(wǎng)絡(luò)算法進(jìn)行參數(shù)調(diào)優(yōu)的幾點思路:
你可能需要訓(xùn)練一個給定“參數(shù)配置”的神經(jīng)網(wǎng)絡(luò)模型很多次(3-10次甚至更多),才能得到一個估計性能不錯的參數(shù)配置。這一點幾乎適用于這一節(jié)中你能夠調(diào)參的所有方面。
關(guān)于超參數(shù)優(yōu)化請參閱博文:
如果你能知道為什么你的模型性能不再提高了,你就能獲得擁有更好性能的模型。
你的模型是過擬合還是欠擬合?永遠(yuǎn)牢記這個問題。永遠(yuǎn)。
模型總是會遇到過擬合或者欠擬合,只是程度不同罷了。一個快速了解模型學(xué)習(xí)行為的方法是,在每個周期,評估模型在訓(xùn)練集和驗證集上的表現(xiàn),并作出圖表。
經(jīng)常畫一畫這些圖表,學(xué)習(xí)它們來了解不同的方法,你能夠提升模型的性能。這些圖表可能是你能創(chuàng)造的最有價值的(模型狀態(tài))診斷信息。
另一個有用的診斷是網(wǎng)絡(luò)模型判定對和判定錯的觀察值。
以下為相關(guān)閱讀:
經(jīng)驗法則通常是:用小的隨機數(shù)進(jìn)行初始化。
在實踐中,這可能依舊效果不錯,但是對于你的網(wǎng)絡(luò)來說是最佳的嗎?對于不同的激活函數(shù)也有一些啟發(fā)式的初始化方法,但是在實踐應(yīng)用中并沒有太多不同。
固定你的網(wǎng)絡(luò),然后嘗試多種初始化方式。
記住,權(quán)重是你的模型真正的參數(shù),你需要找到他們。有很多組權(quán)重都能有不錯的性能表現(xiàn),但我們要盡量找到最好的。
需要提醒的一點是,改變權(quán)重初始化方法和激活函數(shù),甚至優(yōu)化函數(shù)/損失函數(shù)緊密相關(guān)。
以下為相關(guān)閱讀:
調(diào)整學(xué)習(xí)率很多時候也是行之有效的時段。
以下是可供探索的一些想法:
越大的網(wǎng)絡(luò)需要越多的訓(xùn)練,反之亦然。如果你添加了太多的神經(jīng)元和層數(shù),適當(dāng)提升你的學(xué)習(xí)速率。同時學(xué)習(xí)率需要和訓(xùn)練周期,batch size大小以及優(yōu)化方法聯(lián)系在一起考慮。
以下為相關(guān)閱讀:
你或許應(yīng)該使用修正激活函數(shù)(rectifier activation functions)。他們也許能提供更好的性能。
在這之前,最早的激活函數(shù)是sigmoid和tanh,之后是softmax, 線性激活函數(shù),或者輸出層上的sigmoid函數(shù)。我不建議嘗試更多的激活函數(shù),除非你知道你自己在干什么。
嘗試全部三種激活函數(shù),并且重縮放你的數(shù)據(jù)以滿足激活函數(shù)的邊界。
顯然,你想要為輸出的形式選擇正確的傳遞函數(shù),但是可以考慮一下探索不同表示。例如,把在二元分類問題上使用的sigmoid函數(shù)切換到回歸問題上使用的線性函數(shù),然后后置處理你的輸出。這可能需要改變損失函數(shù)使之更合適。詳情參閱數(shù)據(jù)轉(zhuǎn)換那一節(jié)。
以下為相關(guān)閱讀:
網(wǎng)絡(luò)結(jié)構(gòu)的改變能帶來好處。
你需要多少層以及多少個神經(jīng)元?抱歉沒有人知道。不要問這種問題…
那怎么找到適用你的問題的配置呢?去實驗吧。
選擇總是很困難的。通常說來越大的網(wǎng)絡(luò)有越強的代表能力,或許你需要它。越多的層數(shù)可以提供更強的從數(shù)據(jù)中學(xué)到的抽象特征的能力。或許需要它。
深層的神經(jīng)網(wǎng)絡(luò)需要更多的訓(xùn)練,無論是訓(xùn)練周期還是學(xué)習(xí)率,都應(yīng)該相應(yīng)地進(jìn)行調(diào)整。
以下為相關(guān)閱讀:
這些鏈接會給你很多啟發(fā)該嘗試哪些事情,至少對我來說是的。
batch size大小會決定最后的梯度,以及更新權(quán)重的頻度。一個周期(epoch)指的是神經(jīng)網(wǎng)絡(luò)看一遍全部訓(xùn)練數(shù)據(jù)的過程。
你是否已經(jīng)試驗了不同的批次batch size和周期數(shù)?
之前,我們已經(jīng)討論了學(xué)習(xí)率,網(wǎng)絡(luò)大小和周期之間的關(guān)系。
在很深的網(wǎng)絡(luò)結(jié)構(gòu)里你會經(jīng)常看到:小的batch size配以大的訓(xùn)練周期。
下面這些或許能有助于你的問題,也或許不能。你要在自己的數(shù)據(jù)上嘗試和觀察。
考慮一個接近無窮的周期值(持續(xù)訓(xùn)練),去記錄到目前為止能得到的最佳的模型。
一些網(wǎng)絡(luò)結(jié)構(gòu)對batch size更敏感。我知道多層感知器(Multilayer Perceptrons)通常對batch size是魯棒的,而LSTM和CNNs比較敏感,但是這只是一個說法(僅供參考)。
以下為相關(guān)閱讀:
正則化是一個避免模型在訓(xùn)練集上過擬合的好方法。
神經(jīng)網(wǎng)絡(luò)里最新最熱的正則化技術(shù)是dropout方法,你是否試過?dropout方法在訓(xùn)練階段隨機地跳過一些神經(jīng)元,驅(qū)動這一層其他的神經(jīng)元去捕捉松弛。簡單而有效。你可以從dropout方法開始。
也可以嘗試其他更傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)正則化方法,例如:
你也可以試驗懲罰不同的方面,或者使用不同種類的懲罰/正則化(L1, L2, 或者二者同時)
以下是相關(guān)閱讀:
最常見是應(yīng)用隨機梯度下降法(stochastic gradient descent),但是現(xiàn)在有非常多的優(yōu)化器。你試驗過不同的優(yōu)化(方法)過程嗎?
隨機梯度下降法是默認(rèn)的選擇。先好好利用它,配以不同的學(xué)習(xí)率和動量。
許多更高級的優(yōu)化方法有更多的參數(shù),更復(fù)雜,也有更快的收斂速度。好與壞,是不是需要用,取決于你的問題。
為了更好的利用好一個給定的(優(yōu)化)方法,你真的需要弄明白每個參數(shù)的意義,然后針對你的問題通過格點搜索不同的的取值。困難,消耗時間,但是值得。
我發(fā)現(xiàn)了一些更新更流行的方法,它們可以收斂的更快,并且針對一個給定網(wǎng)絡(luò)的容量提供了一個快速了解的方式,例如:
你還可以探索其他優(yōu)化算法,例如,更傳統(tǒng)的(Levenberg-Marquardt)和不那么傳統(tǒng)的(genetic algorithms)。其他方法能夠為隨機梯度下降法和其他類似方法提供好的出發(fā)點去改進(jìn)。
要被優(yōu)化的損失函數(shù)與你要解決的問題高度相關(guān)。然而,你通常還是有一些余地(可以做一些微調(diào),例如回歸問題中的均方誤(MSE)和平均絕對誤差(MAE)等),有時候變換損失函數(shù)還有可能獲得小的性能提升,這取決于你輸出數(shù)據(jù)的規(guī)模和使用的激活函數(shù)。
以下是相關(guān)閱讀:
一旦訓(xùn)練過程中出現(xiàn)(驗證集)性能開始下降,你可以停止訓(xùn)練與學(xué)習(xí)。這可以節(jié)省很多時間,而且甚至可以讓你使用更詳盡的重采樣方法來評估你的模型的性能。
早停法是一種用來避免模型在訓(xùn)練數(shù)據(jù)上的過擬合的正則化方式,它需要你監(jiān)測模型在訓(xùn)練集以及驗證集上每一輪的效果。一旦驗證集上的模型性能開始下降,訓(xùn)練就可以停止。
如果某個條件滿足(衡量準(zhǔn)確率的損失),你還可以設(shè)置檢查點(Checkpointing)來儲存模型,使得模型能夠繼續(xù)學(xué)習(xí)。檢查點使你能夠早停而非真正的停止訓(xùn)練,因此在最后,你將有一些模型可供選擇。
以下是相關(guān)閱讀:
你可以組合多個模型的預(yù)測能力。剛才提到了算法調(diào)參可以提高最后的性能,調(diào)參之后這是下一個可以提升的大領(lǐng)域。
事實上,你可以經(jīng)常通過組合多個“足夠好的”模型來得到優(yōu)秀的預(yù)測能力,而不是通過組合多個高度調(diào)參的(脆弱的)模型。
你可以考慮以下三個方面的嵌套方式:
有時候我們干脆不做模型選擇,而是直接組合它們。
如果你有多個不同的深度學(xué)習(xí)模型,在你的研究問題上每一個都表現(xiàn)的還不錯,你可以通過取它們預(yù)測的平均值來進(jìn)行組合。
模型差異越大,最終效果越好。例如,你可以應(yīng)用非常不同的網(wǎng)絡(luò)拓?fù)浠蛘卟煌募夹g(shù)。
如果每個模型都效果不錯但是不同的方法/方式,嵌套后的預(yù)測能力將更加魯棒。
每一次你訓(xùn)練網(wǎng)絡(luò),你初始化不同的權(quán)重,然后它會收斂到不同的最終權(quán)重。你可以多次重復(fù)這一過程去得到很多網(wǎng)絡(luò),然后把這些網(wǎng)絡(luò)的預(yù)測值組合在一起。
它們的預(yù)測將會高度相關(guān),但是在那些難以預(yù)測的特征上,它會給你一個意外的小提升。
以下是相關(guān)閱讀:
同上述類似,但是從不同視角重構(gòu)你的問題,訓(xùn)練你的模型。
同樣,目標(biāo)得到的是效果不錯但是不同的模型(例如,不相關(guān)的預(yù)測)。得到不同的模型的方法,你可以依賴我們在數(shù)據(jù)那一小節(jié)中羅列的那些非常不同的放縮和轉(zhuǎn)換方法。
你用來訓(xùn)練模型的轉(zhuǎn)換方法越不同,你構(gòu)建問題的方式越不同,你的結(jié)果被提升的程度就越高。
簡單使用預(yù)測的均值將會是一個好的開始。
你還可以學(xué)習(xí)如何最佳地組合多個模型的預(yù)測。這稱作堆疊泛化(stacked generalization),或者簡短來說就叫堆疊。
通常上,你使用簡單線性回歸方法就可以得到比取預(yù)測平均更好的結(jié)果,像正則化的回歸(regularized regression),就會學(xué)習(xí)如何給不同的預(yù)測模型賦權(quán)重。基線模型是通過取子模型的預(yù)測均值得到的,但是應(yīng)用學(xué)習(xí)了權(quán)重的模型會提升性能。
別的地方有很多很好的資源,但是幾乎沒有能將所有想法串聯(lián)在一起的。如果你想深入研究,我列出了如下資源和相應(yīng)的博客,你能發(fā)現(xiàn)很多有趣的東西。
產(chǎn)品說要讓前端用 JavaScript 畫一棵樹出來,但是這難道不能直接讓 UI 給一張圖片嗎?
后來一問才知道,產(chǎn)品要的是一顆 隨機樹,也就是樹的茂盛程度、長度、枝干粗細(xì)都是隨機的,那這確實沒辦法叫 UI 給圖,畢竟 UI 不可能給我 10000 張樹的圖片吧?
所以第一時間想到的就是 Canvas,用它來畫這棵隨機樹(文末有完整代碼)
接下來使用 Canvas 去畫這棵隨機樹
基礎(chǔ)頁面
我們需要在頁面上寫一個 canvas 標(biāo)簽,并設(shè)置好寬高,同時需要獲取它的 Dom 節(jié)點、繪制上下文,以便后續(xù)的繪制
坐標(biāo)調(diào)整
默認(rèn)的 Canvas 坐標(biāo)系是這樣的
但是我們現(xiàn)在需要從中間去向上去畫一棵樹,所以坐標(biāo)得調(diào)整成這樣:
這些操作可以使用 Canvas 的方法
繪制一棵樹的要素
繪制一棵樹的要素是什么呢?其實就是樹枝和果實,但是其實樹枝才是第一要素,那么樹枝又有哪些要素呢?無非就這幾個點
開始繪制
所以我們可以寫一個 drawBranch 來進(jìn)行繪制,并且初始調(diào)用肯定是繪制樹干,樹干的參數(shù)如下:
這個終點應(yīng)該怎么算呢?其實很簡單,根據(jù)樹枝長度、生長角度就可以算出來了,這是初高中的知識
于是我們可以使用 Canvas 的繪制方法,去繪制線段,其實樹枝就是一個一個的線段
到現(xiàn)在我繪制出了一個樹干 出來
但是我們是想讓這棵樹開枝散葉,所以需要繼續(xù)遞歸繼續(xù)去繪制更多的樹枝出來~
遞歸繪制
其實往哪開枝散葉呢?無非就是往左或者往右
所以需要遞歸畫左邊和右邊的樹枝,并且子樹枝肯定要比父樹枝更短、比父樹枝更細(xì),比如我們可以定義一個比例
而子樹枝的生長角度,其實可以隨機,我們可以在 0° - 30° 之間隨機選一個角度,于是增加了遞歸調(diào)用的代碼
但是這個時候會發(fā)現(xiàn),報錯了,爆棧了,因為我們只遞歸開始,但卻沒有在某個時刻遞歸停止
我們可以自己定義一個停止規(guī)則(規(guī)則可以自己定義,這會決定你這棵樹的茂盛程度):
現(xiàn)在可以看到我們已經(jīng)大致繪制出一棵樹了
不過還少了樹的果實
繪制果實
繪制果實很簡單,只需要在繪制樹枝結(jié)束的時候,去把果實繪制出來就行,其實果實就是一個個的白色實心圓
至此這棵樹完整繪制完畢
繪制部分的代碼如下
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。