[Python人工智能] 五.theano实现神经网络正规化Regularization处理
從本系列文章開(kāi)始,作者正式開(kāi)始研究Python深度學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)及人工智能相關(guān)知識(shí)。前四篇文章講解了神經(jīng)網(wǎng)絡(luò)基礎(chǔ)概念、Theano庫(kù)的安裝過(guò)程及基礎(chǔ)用法、theano實(shí)現(xiàn)回歸神經(jīng)網(wǎng)絡(luò)、theano實(shí)現(xiàn)分類(lèi)神經(jīng)網(wǎng)絡(luò),這篇文章講解Overfitting問(wèn)題及正規(guī)化解決方法,采用theano實(shí)現(xiàn)。主要是學(xué)習(xí)"莫煩大神" 網(wǎng)易云視頻的在線筆記,后面隨著深入會(huì)講解具體的項(xiàng)目及應(yīng)用?;A(chǔ)性文章和在線筆記,希望對(duì)您有所幫助,也建議大家一步步跟著學(xué)習(xí),同時(shí)文章中存在錯(cuò)誤或不足之處,還請(qǐng)海涵~
"莫煩大神" 網(wǎng)易云視頻地址:http://study.163.com/provider/1111519/course.html
從2014年開(kāi)始,作者主要寫(xiě)了三個(gè)Python系列文章,分別是基礎(chǔ)知識(shí)、網(wǎng)絡(luò)爬蟲(chóng)和數(shù)據(jù)分析。
- Python基礎(chǔ)知識(shí)系列:Pythonj基礎(chǔ)知識(shí)學(xué)習(xí)與提升
- Python網(wǎng)絡(luò)爬蟲(chóng)系列:Python爬蟲(chóng)之Selenium+Phantomjs+CasperJS
- Python數(shù)據(jù)分析系列:知識(shí)圖譜、web數(shù)據(jù)挖掘及NLP
??
前文參考:
[Python人工智能] 一.神經(jīng)網(wǎng)絡(luò)入門(mén)及theano基礎(chǔ)代碼講解
[Python人工智能] 二.theano實(shí)現(xiàn)回歸神經(jīng)網(wǎng)絡(luò)分析
[Python人工智能] 三.theano實(shí)現(xiàn)分類(lèi)神經(jīng)網(wǎng)絡(luò)及機(jī)器學(xué)習(xí)基礎(chǔ)
[Python人工智能] 四.神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)入門(mén)知識(shí)
一.?正規(guī)化-Regularization
在用神經(jīng)網(wǎng)絡(luò)分析數(shù)據(jù)時(shí),通常會(huì)遇到Overfitting問(wèn)題。如下圖所示,分布了很多黑色的數(shù)據(jù)點(diǎn),如果機(jī)器學(xué)習(xí)能學(xué)到一條黑色直線去代替我們分布的數(shù)據(jù)散點(diǎn),并預(yù)測(cè)我們的數(shù)據(jù)分布,那這條直線就是學(xué)習(xí)得到的一條很好的線條。但是Overfitting會(huì)產(chǎn)生一個(gè)問(wèn)題:在學(xué)習(xí)過(guò)程中會(huì)不斷減小與真實(shí)值的誤差,得到這條藍(lán)色的線條,它能非常完美的預(yù)測(cè)這些點(diǎn),與真實(shí)值的誤差非常小,誤差cost甚至為0,而黑色的直線的會(huì)與真實(shí)值產(chǎn)生誤差。例如,x為-4這個(gè)點(diǎn),藍(lán)色線對(duì)應(yīng)值為-7,基本吻合,而黑色線預(yù)測(cè)值為-12,存在一定誤差。
但真實(shí)預(yù)測(cè)時(shí),我們會(huì)覺(jué)得黑色線比藍(lán)色線更為準(zhǔn)確,因?yàn)槿绻衅渌麛?shù)據(jù)點(diǎn)時(shí),將來(lái)的數(shù)據(jù)用黑色的線能更好的進(jìn)行預(yù)測(cè)或概括。比如x為2.5時(shí),藍(lán)色線這個(gè)點(diǎn)的誤差可能會(huì)比黑色線更大。Overfitting后的誤差會(huì)非常小,但是測(cè)試數(shù)據(jù)時(shí)誤差會(huì)突然變得很大,并且沒(méi)有黑線預(yù)測(cè)的結(jié)果好。
這就是回歸中Overfitting的一種形式 ,那么如果是分類(lèi)問(wèn)題,Overfitting又怎么體現(xiàn)呢?
分類(lèi)問(wèn)題,看下面這張圖。第一張圖通過(guò)一條曲線將data分割開(kāi)來(lái),注意有兩個(gè)X在class2里面;第二張圖是Over-fitting完全把數(shù)據(jù)點(diǎn)分離開(kāi)來(lái),一堆點(diǎn)為class1、另一堆點(diǎn)為class2。雖然訓(xùn)練時(shí)圖2誤差更小,但是使用圖2去預(yù)測(cè)時(shí),其誤差可能會(huì)更大,而圖1的誤差會(huì)更小,更傾向于用圖1的方法。
避免Over-fitting的方法主要是正規(guī)化,包括Regularization L1和L2,下面開(kāi)始講解。
二. 定義Layer類(lèi)及增加數(shù)據(jù)集
1.定義Layer類(lèi)
神經(jīng)網(wǎng)絡(luò)首先需要添加神經(jīng)層,將層(Layer)定義成類(lèi),通過(guò)類(lèi)來(lái)添加神經(jīng)層。神經(jīng)層是相互鏈接,并且是全連接,從第一層輸入層傳入到隱藏層,最后傳輸至輸出層。假設(shè)接下來(lái)需要定義兩層內(nèi)容:
? ? L1 = Layer(inputs, in_size=13, out_size=50, activation_function)
? ??參數(shù)包括輸入值,輸入節(jié)點(diǎn)數(shù),輸出節(jié)點(diǎn)數(shù)和激勵(lì)函數(shù)
? ??L2 = Layer(L1.outputs, 50, 1, None)
? ? 參數(shù)中L1的輸出作為輸入值,L1的輸出10個(gè)節(jié)點(diǎn)作為輸入節(jié)點(diǎn),輸出節(jié)點(diǎn)1個(gè),激勵(lì)函數(shù)為None。
定義類(lèi)的代碼如下,包括權(quán)重和bias,其中參數(shù)為隨機(jī)變量更有利于我們后面的更新,亂序更能促進(jìn)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)。
#coding:utf-8 import numpy as np import theano.tensor as T import theano from theano import function from sklearn.datasets import load_boston import matplotlib.pyplot as plt#首先定義神經(jīng)網(wǎng)絡(luò)Layer類(lèi) class Layer(object):def __init__(self, inputs, in_size, out_size, activation_function=None):#權(quán)重: 平均值為0 方差為1 行數(shù)為in_size 列數(shù)為out_sizeself.W = theano.shared(np.random.normal(0,1,(in_size,out_size)))#biasself.b = theano.shared(np.zeros((out_size,) ) + 0.1)#乘法加biasself.Wx_plus_b = T.dot(inputs, self.W) + self.b #dot乘法#激勵(lì)函數(shù)self.activation_function = activation_function#默認(rèn)為None,否則進(jìn)行激活if activation_function is None: self.outputs = self.Wx_plus_belse: self.outputs = self.activation_function(self.Wx_plus_b)2.增加數(shù)據(jù)集
需要注意,機(jī)器學(xué)習(xí)通常將數(shù)據(jù)data劃分為兩組,train data-訓(xùn)練神經(jīng)網(wǎng)絡(luò)、test data-檢驗(yàn)預(yù)測(cè)神經(jīng)網(wǎng)絡(luò)。這里所采用的數(shù)據(jù)集是sklearn中的波士頓房?jī)r(jià)數(shù)據(jù)集(load_boston),該數(shù)據(jù)集包括500多個(gè)數(shù)據(jù)點(diǎn),每個(gè)sample有13個(gè)特征去描述房?jī)r(jià)。
再導(dǎo)入數(shù)據(jù)集之前,作者補(bǔ)充一個(gè)知識(shí)點(diǎn)——Nnormalization。
通過(guò) "x_data = load_boston().data" 代碼導(dǎo)入波士頓房?jī)r(jià)數(shù)據(jù)集,但是x_data變化范圍非常之廣,比如有一個(gè)特征是占地面積,其范圍從0到500,而另一個(gè)特征到市中心的距離,值為1、2公里,由于0到500和0到2取值范圍變化幅度較大,這里使用機(jī)器學(xué)習(xí)機(jī)器一種技巧 Normalization 進(jìn)行處理。將x的特征進(jìn)行正常化,把每個(gè)特征的取值范圍都濃縮到0-1的范圍,這樣能使機(jī)器學(xué)習(xí)更方便的學(xué)習(xí)東西,這里我主要通過(guò)自定義函數(shù)minmax_normalization()實(shí)現(xiàn)。代碼如下:
#coding:utf-8 import numpy as np import theano.tensor as T import theano from theano import function from sklearn.datasets import load_boston import matplotlib.pyplot as plt#首先定義神經(jīng)網(wǎng)絡(luò)Layer類(lèi) class Layer(object):def __init__(self, inputs, in_size, out_size, activation_function=None):#權(quán)重: 平均值為0 方差為1 行數(shù)為in_size 列數(shù)為out_sizeself.W = theano.shared(np.random.normal(0,1,(in_size,out_size)))#biasself.b = theano.shared(np.zeros((out_size,) ) + 0.1)#乘法加biasself.Wx_plus_b = T.dot(inputs, self.W) + self.b #dot乘法#激勵(lì)函數(shù)self.activation_function = activation_function#默認(rèn)為None,否則進(jìn)行激活if activation_function is None: self.outputs = self.Wx_plus_belse: self.outputs = self.activation_function(self.Wx_plus_b)#正常化處理 數(shù)據(jù)降為0-1之間 def minmax_normalization(data):xs_max = np.max(data, axis=0)xs_min = np.min(data, axis=0)xs = (1-0) * (data - xs_min) / (xs_max - xs_min) + 0return xs #導(dǎo)入sklearn中的波士頓房?jī)r(jià)數(shù)據(jù)集 #500多個(gè)數(shù)據(jù)點(diǎn) 每個(gè)sample有13個(gè)特征去描述房?jī)r(jià) np.random.seed(100) x_data = load_boston().data #數(shù)據(jù)集#minmax normalization, rescale the inputs x_data = minmax_normalization(x_data) print(x_data) #增加一個(gè)維度 定義成矩陣的形式 y_data = load_boston().target[:, np.newaxis] print(y_data)#cross validation, train test data split #劃分訓(xùn)練集和測(cè)試集 #前400個(gè)sameple或樣本行作為訓(xùn)練集, 剩余的作為預(yù)測(cè)集 x_train, y_train = x_data[:400], y_data[:400] x_test, y_test = x_data[400:], y_data[400:] print(x_train.shape, y_train.shape) print(x_test.shape, y_test.shape)輸出結(jié)果如下圖所示,包括13個(gè)特征Normalization后的結(jié)果,y類(lèi)標(biāo)及劃分為訓(xùn)練集和預(yù)測(cè)集的形狀。
[[0.00000000e+00 1.80000000e-01 6.78152493e-02 ... 2.87234043e-011.00000000e+00 8.96799117e-02][2.35922539e-04 0.00000000e+00 2.42302053e-01 ... 5.53191489e-011.00000000e+00 2.04470199e-01][2.35697744e-04 0.00000000e+00 2.42302053e-01 ... 5.53191489e-019.89737254e-01 6.34657837e-02]...[6.11892474e-04 0.00000000e+00 4.20454545e-01 ... 8.93617021e-011.00000000e+00 1.07891832e-01][1.16072990e-03 0.00000000e+00 4.20454545e-01 ... 8.93617021e-019.91300620e-01 1.31070640e-01][4.61841693e-04 0.00000000e+00 4.20454545e-01 ... 8.93617021e-011.00000000e+00 1.69701987e-01]] [[24. ][21.6][34.7][33.4][36.2]...[16.8][22.4][20.6][23.9][22. ][11.9]] (400, 13) (400, 1) (106, 13) (106, 1)三. theano實(shí)現(xiàn)回歸神經(jīng)網(wǎng)絡(luò)正規(guī)化
1.定義變量和Layer
包括兩個(gè)Layer,如下:
L1: 13個(gè)屬性,神經(jīng)層有50個(gè)神經(jīng)元,激活函數(shù)用tanh
? ? L1 = Layer(x, 13, 50, T.tanh)
L2: 輸入為L(zhǎng)1輸出,輸入個(gè)數(shù)為50,輸出為1即房?jī)r(jià)
? ? L2 = Layer(L1.outputs, 50, 1, None)
2.計(jì)算誤差
(1)普通方法
定義cost變量計(jì)算誤差,即預(yù)測(cè)值與真實(shí)值的差別。常用的方法如下,通過(guò)計(jì)算輸出結(jié)果(預(yù)測(cè)值)和真實(shí)結(jié)果誤差的平方平均自實(shí)現(xiàn)。
? ? cost = T.mean(T.square(L2.outputs-y))
但是該方法會(huì)產(chǎn)生Overfitting問(wèn)題。為了解決Overfitting,在計(jì)算cost時(shí),我要做一些手腳,加上一個(gè)東西。
(2)L2 Regularization
? ??cost = T.mean(T.square(L2.outputs-y)) + 0.1*((L1.W**2).sum() + (L2.W**2).sum())
它是0.1乘以L1的權(quán)重平方求和加上L2的權(quán)重平方和,注意盡量用一個(gè)小于1的值來(lái)乘,如這里的0.1。
上面這個(gè)就是L2 Regularization方法,相當(dāng)于有一個(gè) 0.1乘以所有的weight平方和,它稱為懲罰機(jī)制。快要進(jìn)入Overfitting時(shí),通過(guò)這個(gè)機(jī)制來(lái)懲罰,不進(jìn)入Overfitting,另一種方法是L1 Regularization。
(3)L1 Regularization
? ??cost = T.mean(T.square(L2.outputs-y)) + 0.1*(abs(L1.W).sum() + abs(L2.W).sum())
根據(jù)流行程度來(lái)看,L2比L1更普及,這篇文章也主要使用L2進(jìn)行實(shí)驗(yàn),0.1可以取不同值,去分別測(cè)試對(duì)比實(shí)驗(yàn)。
3.梯度下降更新
再定義梯度下降變量,其誤差越大,降低趨勢(shì)越大,通過(guò)梯度下降讓預(yù)測(cè)值更接近真實(shí)值。代碼中通過(guò)theano.function()函數(shù)更新神經(jīng)網(wǎng)絡(luò)的四個(gè)參數(shù),計(jì)算公式如下啊:
? ? L1.W, L1.W-learnging_rate*gW1:
(原始的權(quán)重-學(xué)習(xí)效率*下降幅度)并且更新為L(zhǎng)1.W,通過(guò)該方法將L1.W、L1.b、L2.W、L2.b更新。
4.預(yù)測(cè)結(jié)果
最后是預(yù)測(cè)結(jié)果,訓(xùn)練時(shí)會(huì)給出x和y求cost,而預(yù)測(cè)時(shí)只給出輸入x,用來(lái)做預(yù)測(cè)。最后每隔50步輸出err,如果err不斷減小,說(shuō)明神經(jīng)網(wǎng)絡(luò)在學(xué)到東西,因?yàn)轭A(yù)測(cè)值與真實(shí)值誤差在不斷減小。
#coding:utf-8 import numpy as np import theano.tensor as T import theano from theano import function from sklearn.datasets import load_boston import matplotlib.pyplot as plt#首先定義神經(jīng)網(wǎng)絡(luò)Layer類(lèi) class Layer(object):def __init__(self, inputs, in_size, out_size, activation_function=None):#權(quán)重: 平均值為0 方差為1 行數(shù)為in_size 列數(shù)為out_sizeself.W = theano.shared(np.random.normal(0,1,(in_size,out_size)))#biasself.b = theano.shared(np.zeros((out_size,) ) + 0.1)#乘法加biasself.Wx_plus_b = T.dot(inputs, self.W) + self.b #dot乘法#激勵(lì)函數(shù)self.activation_function = activation_function#默認(rèn)為None,否則進(jìn)行激活if activation_function is None: self.outputs = self.Wx_plus_belse: self.outputs = self.activation_function(self.Wx_plus_b)#正?;幚?數(shù)據(jù)降為0-1之間 def minmax_normalization(data):xs_max = np.max(data, axis=0)xs_min = np.min(data, axis=0)xs = (1-0) * (data - xs_min) / (xs_max - xs_min) + 0return xs #導(dǎo)入sklearn中的波士頓房?jī)r(jià)數(shù)據(jù)集 #500多個(gè)數(shù)據(jù)點(diǎn) 每個(gè)sample有13個(gè)特征去描述房?jī)r(jià) np.random.seed(100) x_data = load_boston().data #數(shù)據(jù)集#minmax normalization, rescale the inputs x_data = minmax_normalization(x_data) print(x_data) #增加一個(gè)維度 定義成矩陣的形式 y_data = load_boston().target[:, np.newaxis] #print(y_data)#cross validation, train test data split #劃分訓(xùn)練集和測(cè)試集 #前400個(gè)sameple或樣本行作為訓(xùn)練集, 剩余的作為預(yù)測(cè)集 x_train, y_train = x_data[:400], y_data[:400] x_test, y_test = x_data[400:], y_data[400:] print(x_train.shape, y_train.shape) print(x_test.shape, y_test.shape)#定義x和y x = T.dmatrix("x") y = T.dmatrix("y")#定義兩個(gè)Layer #L1: 13個(gè)屬性,神經(jīng)層有50個(gè)神經(jīng)元,激活函數(shù)用tanh L1 = Layer(x, 13, 50, T.tanh) #L2: 輸入為L(zhǎng)1輸出,輸入個(gè)數(shù)為50,輸出為1即房?jī)r(jià) L2 = Layer(L1.outputs, 50, 1, None)#the way to compute cost #計(jì)算誤差 但該方法的結(jié)果會(huì)產(chǎn)生Overfitting問(wèn)題 cost = T.mean(T.square(L2.outputs-y))#L2 regularization #0.1乘以L1的權(quán)重平方求和加上L2的權(quán)重平方和 #懲罰機(jī)制: 快要進(jìn)入Overfitting時(shí),通過(guò)這個(gè)機(jī)制來(lái)懲罰不進(jìn)入Overfitting cost = T.mean(T.square(L2.outputs-y)) + 0.1*((L1.W**2).sum() + (L2.W**2).sum())#L1 regularization cost = T.mean(T.square(L2.outputs-y)) + 0.1*(abs(L1.W).sum() + abs(L2.W).sum())#對(duì)比正規(guī)化和沒(méi)有正規(guī)化的區(qū)別 #梯度下降定義 gW1, gb1, gW2, gb2 = T.grad(cost, [L1.W, L1.b, L2.W, L2.b])#學(xué)習(xí)率 learning_rate = 0.01#訓(xùn)練 updates train = theano.function(inputs=[x,y],updates=[(L1.W, L1.W - learning_rate * gW1),(L1.b, L1.b - learning_rate * gb1),(L2.W, L2.W - learning_rate * gW2),(L2.b, L2.b - learning_rate * gb2)])#計(jì)算誤差 compute_cost = theano.function(inputs=[x,y], outputs=cost) print(compute_cost)#存儲(chǔ)cost誤差 train_err_list =[] test_err_list = [] learning_time = [] #計(jì)算每一步的i#訓(xùn)練1000次 每隔10次輸出 for i in range(1000):train(x_train, y_train)if i % 10 == 0:#訓(xùn)練誤差cost1 = compute_cost(x_train, y_train)train_err_list.append(cost1)#預(yù)測(cè)誤差cost2 = compute_cost(x_test, y_test)test_err_list.append(cost2) learning_time.append(i) #對(duì)應(yīng)iprint(cost1)print(cost2)print(i)注意:cost前面定義了三次,我們注釋掉其他兩個(gè),分別進(jìn)行對(duì)比實(shí)驗(yàn),結(jié)果每隔10步輸出。
76.95290841879309 64.23189302430346 050.777745719854 32.325523689775714 1037.604371357212884 20.74023271455164 20 ...
5.繪制圖形對(duì)比
紅色線為訓(xùn)練誤差,藍(lán)色虛線為測(cè)試結(jié)果。完整代碼如下所示:
#coding:utf-8 import numpy as np import theano.tensor as T import theano from theano import function from sklearn.datasets import load_boston import matplotlib.pyplot as plt#首先定義神經(jīng)網(wǎng)絡(luò)Layer類(lèi) class Layer(object):def __init__(self, inputs, in_size, out_size, activation_function=None):#權(quán)重: 平均值為0 方差為1 行數(shù)為in_size 列數(shù)為out_sizeself.W = theano.shared(np.random.normal(0,1,(in_size,out_size)))#biasself.b = theano.shared(np.zeros((out_size,) ) + 0.1)#乘法加biasself.Wx_plus_b = T.dot(inputs, self.W) + self.b #dot乘法#激勵(lì)函數(shù)self.activation_function = activation_function#默認(rèn)為None,否則進(jìn)行激活if activation_function is None: self.outputs = self.Wx_plus_belse: self.outputs = self.activation_function(self.Wx_plus_b)#正?;幚?數(shù)據(jù)降為0-1之間 def minmax_normalization(data):xs_max = np.max(data, axis=0)xs_min = np.min(data, axis=0)xs = (1-0) * (data - xs_min) / (xs_max - xs_min) + 0return xs #導(dǎo)入sklearn中的波士頓房?jī)r(jià)數(shù)據(jù)集 #500多個(gè)數(shù)據(jù)點(diǎn) 每個(gè)sample有13個(gè)特征去描述房?jī)r(jià) np.random.seed(100) x_data = load_boston().data #數(shù)據(jù)集#minmax normalization, rescale the inputs x_data = minmax_normalization(x_data) print(x_data) #增加一個(gè)維度 定義成矩陣的形式 y_data = load_boston().target[:, np.newaxis] #print(y_data)#cross validation, train test data split #劃分訓(xùn)練集和測(cè)試集 #前400個(gè)sameple或樣本行作為訓(xùn)練集, 剩余的作為預(yù)測(cè)集 x_train, y_train = x_data[:400], y_data[:400] x_test, y_test = x_data[400:], y_data[400:] print(x_train.shape, y_train.shape) print(x_test.shape, y_test.shape)#定義x和y x = T.dmatrix("x") y = T.dmatrix("y")#定義兩個(gè)Layer #L1: 13個(gè)屬性,神經(jīng)層有50個(gè)神經(jīng)元,激活函數(shù)用tanh L1 = Layer(x, 13, 50, T.tanh) #L2: 輸入為L(zhǎng)1輸出,輸入個(gè)數(shù)為50,輸出為1即房?jī)r(jià) L2 = Layer(L1.outputs, 50, 1, None)#the way to compute cost #計(jì)算誤差 但該方法的結(jié)果會(huì)產(chǎn)生Overfitting問(wèn)題 cost = T.mean(T.square(L2.outputs-y))#L2 regularization #0.1乘以L1的權(quán)重平方求和加上L2的權(quán)重平方和 #懲罰機(jī)制: 快要進(jìn)入Overfitting時(shí),通過(guò)這個(gè)機(jī)制來(lái)懲罰不進(jìn)入Overfitting #cost = T.mean(T.square(L2.outputs-y)) + 0.1*((L1.W**2).sum() + (L2.W**2).sum())#L1 regularization #cost = T.mean(T.square(L2.outputs-y)) + 0.1*(abs(L1.W).sum() + abs(L2.W).sum())#對(duì)比正規(guī)化和沒(méi)有正規(guī)化的區(qū)別 #梯度下降定義 gW1, gb1, gW2, gb2 = T.grad(cost, [L1.W, L1.b, L2.W, L2.b])#學(xué)習(xí)率 learning_rate = 0.01#訓(xùn)練 updates train = theano.function(inputs=[x,y],updates=[(L1.W, L1.W - learning_rate * gW1),(L1.b, L1.b - learning_rate * gb1),(L2.W, L2.W - learning_rate * gW2),(L2.b, L2.b - learning_rate * gb2)])#計(jì)算誤差 compute_cost = theano.function(inputs=[x,y], outputs=cost) print(compute_cost)#存儲(chǔ)cost誤差 train_err_list =[] test_err_list = [] learning_time = [] #計(jì)算每一步的i#訓(xùn)練1000次 每隔10次輸出 for i in range(1000):train(x_train, y_train)if i % 10 == 0:#訓(xùn)練誤差cost1 = compute_cost(x_train, y_train)train_err_list.append(cost1)#預(yù)測(cè)誤差cost2 = compute_cost(x_test, y_test)test_err_list.append(cost2) learning_time.append(i) #對(duì)應(yīng)iprint(cost1)print(cost2)print(i)#plot cost history plt.plot(learning_time, train_err_list, 'r-') #紅色線為訓(xùn)練誤差 plt.plot(learning_time, test_err_list, 'b--') #藍(lán)色虛線為測(cè)試結(jié)果 plt.show() (1)Overfitting問(wèn)題對(duì)應(yīng)曲線,紅色線為訓(xùn)練誤差,藍(lán)色虛線為測(cè)試結(jié)果,會(huì)發(fā)現(xiàn)預(yù)測(cè)的誤差在不斷變大。? ? cost = T.mean(T.square(L2.outputs-y))
參考莫煩大神視頻原圖,對(duì)應(yīng)的藍(lán)色曲線就沒(méi)有黑色直線預(yù)測(cè)效果好,也看看大神風(fēng)貌吧,也推薦大家去學(xué)習(xí),哈哈!
(2)L2 Regularization,通過(guò)正規(guī)化處理后的結(jié)果,發(fā)現(xiàn)預(yù)測(cè)結(jié)果和訓(xùn)練結(jié)果的誤差變化基本一致,其效果更好。
? ? cost = T.mean(T.square(L2.outputs-y)) + 0.1*((L1.W**2).sum() + (L2.W**2).sum())
這里輸出了1000個(gè),而輸出100個(gè)值如下所示:
(3)L1 regularization輸出結(jié)果如下圖所示:
? ? cost = T.mean(T.square(L2.outputs-y)) + 0.1*(abs(L1.W).sum() + abs(L2.W).sum())
一個(gè)人如果總是自己說(shuō)自己厲害,那么他就已經(jīng)再走下坡路了,最近很浮躁,少發(fā)點(diǎn)朋友圈和說(shuō)說(shuō)吧,更需要不忘初心,砥礪前行。珍惜每一段學(xué)習(xí)時(shí)光,也享受公交車(chē)的視頻學(xué)習(xí)之路,加油,最近興起的傲嬌和看重基金之心快離去吧,平常心才是更美,當(dāng)然娜最美,早安。
(By:Eastmount 2018-06-01 下午5點(diǎn)??http://blog.csdn.net/eastmount/?)
總結(jié)
以上是生活随笔為你收集整理的[Python人工智能] 五.theano实现神经网络正规化Regularization处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Python人工智能] 三.thean
- 下一篇: [Python人工智能] 七.加速神经网