tensorflow中的正则化解决过拟合问题
1. 正則化
所謂的過擬合問題指的是當一個模型很復雜時,它可以很好的“記憶”每一個訓練數據中的隨機噪音的部分而忘記了要去“學習”訓練數據中通用的趨勢。
為了避免過擬合問題,一個非常常用的方法就是正則化。也就是在損失函數中加入刻畫模型復雜程度的指標。假設用于損失函數的為J(θ),那此時不直接優化J(θ),而是優化J(θ)+λR(w)。其中R(w)刻畫的是模型的復雜度,而λ表示的是模型復雜損失在總損失中的比例。這里的θ表示的是一個神經網絡中所有的參數,它包括邊上的權重w和偏置項b。一般來說模型復雜度只由權重表示。常用的刻畫模型復雜度的函數R(w)有兩種,一種是L1正則化,另一種是L2正則化。這兩種都是通過限制權重的大小,使得模型不能任意擬合訓練數據中的隨機噪聲。這兩種正則化的區別是首先L1正則化會讓參數變得稀疏(指會有更多參數變為0),而L2正則化則不會(因為參數的平方后會讓小的參數變得更小,大的參數變得更大,同樣起到了特征選取的功能,而不會讓參數變為0)。其次是L1正則化計算不可導,而L2的正則化損失函數可導。
以上是一些簡單的正則花基礎,下面是神經網絡的搭建:
當網絡復雜的時候定義網絡的結構部分和計算損失函數的部分可能不在一個函數中,這樣通過簡單的變量這種計算損失函數就不方便了。此時可以使用Tensorflow中提供的集合,它可以在一個計算圖(tf.Graph)中保存一組實體(比如張量)。以下是通過集合計算一個5層的神經網絡帶L2正則化的損失函數的計算過程。
2. 基于tensorflow的代碼實現
下面都是基于jupyter notebook 的代碼:
結果:
運行結果:
After 0 steps, mse_loss: 0.588501 After 2000 steps, mse_loss: 0.039796 After 4000 steps, mse_loss: 0.018524 After 6000 steps, mse_loss: 0.018494 After 8000 steps, mse_loss: 0.018374 After 10000 steps, mse_loss: 0.018358 After 12000 steps, mse_loss: 0.018356 After 14000 steps, mse_loss: 0.018355 After 16000 steps, mse_loss: 0.016440 After 18000 steps, mse_loss: 0.013988 After 20000 steps, mse_loss: 0.013142 After 22000 steps, mse_loss: 0.012886 After 24000 steps, mse_loss: 0.012700 After 26000 steps, mse_loss: 0.012550 After 28000 steps, mse_loss: 0.006441 After 30000 steps, mse_loss: 0.006439 After 32000 steps, mse_loss: 0.006438 After 34000 steps, mse_loss: 0.006438 After 36000 steps, mse_loss: 0.006445 After 38000 steps, mse_loss: 0.006438 #5. 訓練帶正則項的損失函數loss。 # 定義訓練的目標函數loss,訓練次數及訓練模型 train_op = tf.train.AdamOptimizer(0.001).minimize(loss) TRAINING_STEPS = 40000with tf.Session() as sess:tf.global_variables_initializer().run()for i in range(TRAINING_STEPS):sess.run(train_op, feed_dict={x: data, y_: label})if i % 2000 == 0:print("After %d steps, loss: %f" % (i, sess.run(loss, feed_dict={x: data, y_: label})))# 畫出訓練后的分割曲線 xx, yy = np.mgrid[-1:1:.01, 0:2:.01]grid = np.c_[xx.ravel(), yy.ravel()]probs = sess.run(y, feed_dict={x:grid})probs = probs.reshape(xx.shape)plt.scatter(data[:,0], data[:,1], c=label,cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white") plt.contour(xx, yy, probs, levels=[.5], cmap="Greys", vmin=0, vmax=.1) plt.show()運行結果:
After 0 steps, loss: 0.705000 After 2000 steps, loss: 0.056949 After 4000 steps, loss: 0.045995 After 6000 steps, loss: 0.041472 After 8000 steps, loss: 0.040165 After 10000 steps, loss: 0.039961 After 12000 steps, loss: 0.039916 After 14000 steps, loss: 0.039912 After 16000 steps, loss: 0.039912 After 18000 steps, loss: 0.038334 After 20000 steps, loss: 0.038128 After 22000 steps, loss: 0.037962 After 24000 steps, loss: 0.037932 After 26000 steps, loss: 0.037921 After 28000 steps, loss: 0.037918 After 30000 steps, loss: 0.037910 After 32000 steps, loss: 0.037908 After 34000 steps, loss: 0.037910 After 36000 steps, loss: 0.037907 After 38000 steps, loss: 0.037905
以上是代碼的具體運行過程和運行結果。
3. 筆記
3.1 numpy.random.seed()的使用:
- seed() 方法改變隨機數生成器的種子,可以在調用其他隨機模塊函數之前調用此函數。
- seed( ) 用于指定隨機數生成時所用算法開始的整數值,如果使用相同的seed( )值,則每次生成的隨即數都相同,如果不設置這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。
示例(1):
from numpy import * num=0 while(num<5):random.seed(5)print(random.random())num+=1運行結果:
0.22199317108973948 0.22199317108973948 0.22199317108973948 0.22199317108973948 0.22199317108973948示例(2):
from numpy import * num=0 random.seed(5) while(num<5):print(random.random())num+=1運行結果:
0.22199317108973948 0.8707323061773764 0.20671915533942642 0.9186109079379216 0.48841118879482914示例(3):
import numpy as npnp.random.seed(0) x1 = np.random.uniform(-1,1) print 'x1:',x1 np.random.seed(0) num=0 while(num<5):print(np.random.uniform(-1,1))num+=1運行結果:
x1: 0.0976270078546 0.0976270078546 0.430378732745 0.205526752143 0.0897663659938 -0.152690401322這里要注意的是設置的seed()值僅一次有效,從前兩行的運行結果和以后的運行結果可以看出來。
3.2 Python uniform() 函數
uniform()是不能直接訪問的,需要導入 random 模塊,然后通過 random 靜態對象調用該方法。
import random random.uniform(x, y)uniform() 方法將隨機生成下一個實數,它在 [x, y) 范圍內。
- x – 隨機數的最小值,包含該值。
- y – 隨機數的最大值,不包含該值。
- 返回一個浮點數。
注:
還有一種寫法 :numpy.random.uniform(low,high,size)
從一個均勻分布[low,high)中隨機采樣,注意定義域是左閉右開,即包含low,不包含high。
參數介紹:
3.3 tf.placeholder 與 tf.Variable
tf.Variable:主要在于一些可訓練變量(trainable variables),比如模型的權重(weights,W)或者偏執值(bias);
(1)聲明時,必須提供初始值;
(2)名稱的真實含義,在于變量,也即在真實訓練時,其值是會改變的,自然事先需要指定初始值;tf.placeholder:用于得到傳遞進來的真實的訓練樣本:
(1)不必指定初始值,可在運行時,通過 Session.run 的函數的 feed_dict 參數指定;
(2)這也是其命名的原因所在,僅僅作為一種占位符;
3.4 ImportError: No module named matplotlib.pyplot錯誤
這里給出具體的解決辦法
參考:http://blog.csdn.net/lanchunhui/article/details/61712830
http://blog.csdn.net/linzch3/article/details/58220569
《tensorflow實戰google深度學習框架》
總結
以上是生活随笔為你收集整理的tensorflow中的正则化解决过拟合问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下Tensorflow 报错
- 下一篇: Tensorflow解决MNIST手写体