TensorFlow——dropout和正則化的相關方法

1.dropout網絡

dropout是一種經常使用的手段,用來防止過擬合的,dropout的意思是在訓練過程當中每次都隨機選擇一部分節點不要去學習,減小神經元的數量來下降模型的複雜度,同時增長模型的泛化能力。雖然會使得學習速度下降,於是須要合理的設置保留的節點數量。dom

在TensorFlow中dropout的函數原型以下:def dropout(x, keep_prob, noise_shape=None, seed=None, name=None),各個參數的意義以下:函數

x:輸入的模型節點學習

keep_prob:保持節點的比率,若是爲1,則表示所有節點參與學習,若是爲0.8,則表示丟棄20%的節點。測試

noise_shape:設置指定的x中參與dropout計算的維度,若是爲None,則表示全部的維度都參與計算,也能夠設定某個維度,例如:x的形狀爲[ n, len, w, ch],使用noise_shape爲[n, 1, 1, ch],這代表會對x中的第二維度和第三維度進行dropout。spa

dropout改變了神經網絡的網絡結構,它僅僅是屬於訓練時的方法,因此在進行測試時要將dropout的keep_porb的值爲1。code

x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])

keep_prob = tf.placeholder(tf.float32)

w1 = tf.Variable(tf.random_normal([784, 30]))
b1 = tf.Variable(tf.zeros([30]))
w_h_1 = tf.add(tf.matmul(x, w1), b1)
w_h_r_1 = tf.nn.sigmoid(w_h_1)
w_h_r_drop_1 = tf.nn.dropout(w_h_r_1, keep_prob=keep_prob)

w2 = tf.Variable(tf.random_normal([30, 30]))
b2 = tf.Variable(tf.zeros([30]))
w_h_2 = tf.add(tf.matmul(w_h_r_drop_1, w2), b2)
w_h_r_2 = tf.nn.sigmoid(w_h_2)
w_h_r_drop_2 = tf.nn.dropout(w_h_r_2, keep_prob=keep_prob)

w3 = tf.Variable(tf.random_normal([30, 30]))
b3 = tf.Variable(tf.zeros([30]))
w_h_3 = tf.add(tf.matmul(w_h_r_drop_2, w3), b3)
w_h_r_3 = tf.nn.sigmoid(w_h_3)
w_h_r_drop_3 = tf.nn.dropout(w_h_r_3, keep_prob=keep_prob)

w4 = tf.Variable(tf.random_normal([30, 10]))
b4 = tf.Variable(tf.zeros([10]))
w_h_4 = tf.add(tf.matmul(w_h_r_drop_3, w4), b4)
w_h_r_4 = tf.nn.softmax(w_h_4)
pred = tf.nn.dropout(w_h_r_4, keep_prob=keep_prob)


cost = tf.reduce_mean(tf.reduce_sum(tf.square(pred - y)))
feed_dict={x:batch_xs, y:batch_ys, keep_prob:0.7}

2.正則化orm

正則化是在神經網絡計算損失值的過程當中,在損失後面再加上一項。這樣損失值所表明的輸出與標準結果間的偏差就會受到干擾,致使學習參數w 和 b沒法按照目標方向來調整,實現模型沒法與樣本徹底擬合,從而達到防止過擬合的效果。正則化主要有L1和L2正則,以下:blog

L1:全部學習參數w的絕對值的和原型

L2:全部學習參數w的平方和而後求平方根。

如此,損失函數表達式以下:

在TensorFlow中,已經封裝好了相應的函數,L2的正則化函數爲:tf.nn.l2_loss(t, name=None),L1的正則化函數須要本身組合,tf.reduce_sum(tf.abs(w))

L2 = tf.nn.l2_loss(w1) + tf.nn.l2_loss(w2) + tf.nn.l2_loss(w3) +tf.nn.l2_loss(w4)

cost = tf.reduce_mean(tf.reduce_sum(tf.square(pred - y))) + L2*0.01

在使用正則化的時候,咱們爲正則化項設置一個權重的係數,注意這個權重係數的值,能夠經過不斷嘗試來肯定權重係數的值。

相關文章
相關標籤/搜索