99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀用OpenCV等構(gòu)建神經(jīng)網(wǎng)絡(luò),這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙希?/a>
用OpenCV等構(gòu)建神經(jīng)網(wǎng)絡(luò),這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙希?/h5>
2020-05-21
收藏
構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
	</div>
	<blockquote class=

作者 | Christopher Dossman

編譯 | ronghuaiyang

在我們的機器學習實驗室,我們在許多高性能的機器已經(jīng)積累了成千上萬個小時的訓練。然而,并不是只有計算機在這個過程中學到了很多東西:我們自己也犯了很多錯誤,修復(fù)了很多錯誤。

在這里,我們根據(jù)我們的經(jīng)驗(主要基于 TensorFlow)提出了一些訓練深度神經(jīng)網(wǎng)絡(luò)的實用技巧。有些建議對你來說可能是顯而易見的,但對我們中的某個人來說卻不是。其他的建議可能不適用,甚至對你的特定任務(wù)來說是不好的建議:謹慎使用!

我們承認這些都是眾所周知的方法。我們也站在巨人的肩膀上!我們這篇文章的目的僅僅是對它們進行高層次的總結(jié),以便在實踐中使用。

通用 Tips

  • 使用 ADAM 優(yōu)化器。它真的很好用。比起傳統(tǒng)的優(yōu)化方法,如原始的梯度下降,我更喜歡它。注意:如果要保存和恢復(fù)權(quán)重,記得在設(shè)置好AdamOptimizer之后設(shè)置Saver ,因為 ADAM 也有需要恢復(fù)的狀態(tài)(即每個權(quán)重的學習率)。
  • ReLU 是最好的非線性(激活函數(shù))。這有點像說 Sublime 是最好的文本編輯器。但實際上,ReLUs 是快速的、簡單的,而且令人驚訝的是,它們能夠工作,并且沒有梯度衰減的問題。雖然 sigmoid 是一種常見的教科書式激活函數(shù),但它不能很好地通過 DNNs 傳播梯度。
  • 不要在輸出層使用激活函數(shù)。這應(yīng)該是顯而易見的,但這是一個很容易犯的錯誤,如果你用一個共享函數(shù)構(gòu)建每個層:一定要在輸出處關(guān)閉激活函數(shù)。
  • 一定要在每一層添加一個偏差。這是 ML 101:偏差本質(zhì)上是將飛機轉(zhuǎn)換成最佳位置。在y=mx+b中,b 是偏差,允許直線向上或向下移動到“最合適”的位置。
  • 使用 variance-scaled 初始化。在 Tensorflow 中,就像tf.contrib.layers.variance_scaling_initializer()。在我們的經(jīng)驗中,這比常規(guī)的高斯分布、截斷的正太分布和 Xavier 更能泛化/縮放。粗略地說, variance scaling 初始化根據(jù)每一層的輸入或輸出的數(shù)量來調(diào)整初始隨機權(quán)重的方差(TensorFlow 中的默認值是輸入的數(shù)量),從而幫助信號更深入地傳播到網(wǎng)絡(luò)中,而不需要額外的“技巧”,比如 clipping 或 batch normalization。Xavier 是很相似的方法,但是 Xavier 的所有層的方差幾乎相同,在那些層的形狀變化很大的網(wǎng)絡(luò)(通常是卷積網(wǎng)絡(luò))中,可能不能很好地處理每一層相同的變化。
構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
			</div>
<ul class=
  • 白化(歸一化)你的輸入數(shù)據(jù)。訓練時,減去數(shù)據(jù)集的均值,然后除以其標準差。你需要向各個方向拉伸和拉伸的幅度越少,你的網(wǎng)絡(luò)學習就會越快、越容易。保持輸入數(shù)據(jù)的均值以不變的方差為中心有助于解決這個問題。你還必須對每個測試輸入執(zhí)行相同的標準化,因此要確保你的訓練集與真實數(shù)據(jù)相似。
  • 以合理保留其動態(tài)范圍的方式縮放輸入數(shù)據(jù)。這與歸一化有關(guān),但應(yīng)該在歸一化之前進行。例如,實際范圍為[0,140000000]的數(shù)據(jù)“x”通??梢杂胻anh(x)或tanh(x/C)來處理,其中 C是某個常數(shù),它拉伸曲線以適應(yīng) tanh 函數(shù)動態(tài)的、傾斜的部分中的更多輸入范圍。特別是在輸入數(shù)據(jù)的一端或兩端可能是無界的情況下,神經(jīng)網(wǎng)絡(luò)在(0,1)之間可以更好地學習。
  • 不要費心降低學習速度(通常)。學習率下降在 SGD 中更為常見,但 ADAM 自然地處理了這個問題。如果你絕對想要榨干每一盎司的表現(xiàn):在訓練結(jié)束后短時間內(nèi)降低學習速度,你可能會看到一個突然的,非常小的誤差下降,然后它會再次變平。
  • 如果你的卷積層有 64 或 128 個濾波器,那可能就足夠了。特別是對于深度網(wǎng)絡(luò)。實際上,128 已經(jīng)很多了。如果你已經(jīng)有了大量的濾波器,那么添加更多的濾波器可能不會改善性能。
  • 池化用于轉(zhuǎn)換不變性。池化本質(zhì)上是讓網(wǎng)絡(luò)學習圖像“那部分”的“大意”。例如,最大池可以幫助卷積網(wǎng)絡(luò)對圖像中特征的平移、旋轉(zhuǎn)和縮放變得健壯。
  • 調(diào)試神經(jīng)網(wǎng)絡(luò)

    如果你的網(wǎng)絡(luò)沒有學習(意思是:在訓練過程中,損失沒有收斂,或者你沒有得到你期望的結(jié)果),試試下面的建議:

    • 過擬合 !如果你的網(wǎng)絡(luò)沒有在學習,首先要做的就是在單個數(shù)據(jù)樣本上讓網(wǎng)絡(luò)過擬合。這樣的話,準確度應(yīng)該是 100%或 99.99%,或者接近于 0 的誤差。如果你的神經(jīng)網(wǎng)絡(luò)不能對單個數(shù)據(jù)點進行過擬合,那么可能是體系結(jié)構(gòu)出現(xiàn)嚴重問題,但問題可能很微妙。如果你可以過擬合一個數(shù)據(jù)點,但是在更大的集合上的訓練仍然不收斂,請嘗試以下建議。
    • 降低學習率。你的網(wǎng)絡(luò)學習速度會變慢,但它可能會進入一個以前無法進入的最小值,因為之前它的步長太大了。(直覺上,當你真正想進入溝底時,你的錯誤是最低的,想象一下跨過路邊的水溝。)
    • 提高學習率。這將加快訓練,幫助收緊反饋回路,這意味著你會更早知道你的網(wǎng)絡(luò)是否在工作。雖然網(wǎng)絡(luò)應(yīng)該更快地收斂,但它的結(jié)果可能不會很好,而且“收斂”的過程實際上可能會跳來跳去。(使用 ADAM 的時候,我們發(fā)現(xiàn)~0.001 是一個非常好的值,在許多實驗中都是這樣。)
    • 減小 minibatch 大小。將 minibatch 大小減少到 1 可以提供與權(quán)重更新相關(guān)的更細粒度的反饋,你可以使用 TensorBoard(或其他調(diào)試/可視化工具)報告這些更新。
    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
		</div>
<ul class=
  • 去掉 batch normalization。隨著批大小減少到 1,這樣做可以梯度消失或梯度爆炸。幾個星期以來,我們的網(wǎng)絡(luò)都沒有收斂,當我們刪除了 batch normalization 之后,我們意識到在第二次迭代時輸出都是 NaN。Batch norm 的作用是給需要止血帶的東西貼上創(chuàng)可貼。它有它用的位置,但只有在你網(wǎng)絡(luò)是沒有 bug 的情況下才可以用。
  • 增加 minibatch 大小。更大的 minibatch — 如果可以的話,使用整個訓練集 — 減少梯度更新中的方差,使每次迭代更精確。換句話說,讓權(quán)重更新的方向是正確的。但是!它的有用性有一個有效的上限,物理內(nèi)存的限制。通常,我們發(fā)現(xiàn)這不如前兩個建議那么有用,這兩個建議將 minibatch 大小減少到 1 并刪除 batch normalization。
  • 檢查一下 reshaping。劇烈的 reshaping(比如改變圖像的 X、Y 維度)會破壞空間的局部性,使得網(wǎng)絡(luò)更難學習,因為它也必須學習 reshaping。(自然景觀變得支離破碎。自然特征在空間上是局部的,這就是為什么 conv 網(wǎng)如此有效的原因。如果使用多個圖像/通道進行 reshape,要特別小心,使用numpy.stack()進行適當?shù)膶R。
  • 仔細檢查你的損失函數(shù)。如果使用復(fù)合函數(shù),嘗試將其簡化為 L1 或 L2。我們發(fā)現(xiàn) L1 對異常值的敏感度較低,當遇到有噪聲的批處理或訓練點時,L1 的調(diào)整幅度較小。
  • 仔細檢查你的可視化效果,如果適用的話。你的可視化庫(matplotlib, OpenCV 等)是調(diào)整數(shù)值的比例,還是剪切它們?還可以考慮使用一種感覺上一致的配色方案。
  • 用一個例子來學習一下

    為了使上面描述的過程更接近實際,這里有一些損失圖(通過 TensorBoard 畫出來的),用于我們構(gòu)建的卷積神經(jīng)網(wǎng)絡(luò)的一些實際回歸實驗。

    起初,這個網(wǎng)絡(luò)根本沒有學習:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
			</div>
<p style= 我們嘗試對值進行 clipping,以防止它們超出界限:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
					</div>
<p style= 嗯??纯催@些沒做平滑的值有多瘋狂。學習率太高?我們試著降低學習速度,只對一個輸入進行訓練:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
							</div>
<p style= 你可以看到學習率的最初幾個變化發(fā)生在什么地方(大約在第 300 步和第 3000 步)。顯然,我們衰減得太快了。所以,在衰減之前給它更多的時間,它可以做得更好:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
									</div>
<p style= 你可以看到我們在 2000 步和 5000 步時衰減。這個更好,但仍然不是很好,因為它沒有趨近于 0。

    然后,我們禁用了學習率衰減,并嘗試將值移動到一個更窄的范圍內(nèi),不過不是通過輸入 tanh。雖然這明顯使錯誤值低于 1,但我們?nèi)匀徊荒?a href='/map/guonihe/' style='color:#000;font-size:inherit;'>過擬合訓練集:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
								</div>
<p style= 通過刪除 batch normalization,我們發(fā)現(xiàn),在經(jīng)過一兩次迭代之后,網(wǎng)絡(luò)可以快速輸出 NaN。我們禁用了 batch normalization,并將初始化更改為 variance scaling。這些改變了一切!我們能夠過擬合我們的測試集,只是一個或兩個輸入。雖然底部的圖表蓋住了 Y 軸,但初始誤差值遠遠高于 5,表明誤差減少了近 4 個數(shù)量級:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
						</div>
<p style= 上面的圖表非常平滑,但是你可以看到它與測試輸入過擬合的速度非???,隨著時間的推移,整個訓練集的損失降到了 0.01 以下。這并沒有降低學習率。在學習率下降一個數(shù)量級后,我們繼續(xù)訓練,得到了更好的結(jié)果:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
				</div>
<p style= 這些結(jié)果好多了!但是如果我們以幾何的方式衰減學習率而不是把訓練分成兩部分呢?

    將每一步的學習率乘以 0.9995,結(jié)果并不好:

    構(gòu)建<a href='/map/shenjingwangluo/' style='color:#000;font-size:inherit;'>神經(jīng)網(wǎng)絡(luò)</a>,這些實戰(zhàn)經(jīng)驗?zāi)憧隙ㄓ玫蒙? /> 
					</div>
<p style= 大概是因為衰減太快了,乘數(shù)為 0.999995 的情況要好一些,但結(jié)果幾乎等于完全不衰減。我們從這個特殊的實驗序列中得出結(jié)論,batch normalization 隱藏了糟糕的初始化所導致的急劇變化的梯度,降低學習率對 ADAM 優(yōu)化器并沒有特別的幫助,除了在最后可能會故意降低。與 batch normalization 一起,clipping 只是掩蓋了真正的問題。我們還通過將高方差輸入值放入 tanh 來處理它們。

    我們希望隨著你對構(gòu)建深度神經(jīng)網(wǎng)絡(luò)越來越熟悉,你會發(fā)現(xiàn)這些基本技巧非常有用。通常,只是一些簡單的事情就能改變一切。

    數(shù)據(jù)分析咨詢請掃描二維碼

    若不方便掃碼,搜微信號:CDAshujufenxi

    數(shù)據(jù)分析師資訊
    更多

    OK
    客服在線
    立即咨詢
    客服在線
    立即咨詢
    ') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }