tensorflow框架學習 (四)—— DNN神經網絡的正則化

1、DNN全鏈接層的正則化

 

說明:對於DNN神經網絡的正則化的瞭解能夠參考DNN神經網絡正則化,這裏主要講怎麼利用tensorflow實現正則化。html

 


 

 

2、tensorflow實現L一、L2正則化的內置函數

 

函數介紹:

在tensorflow裏面實現L一、L2的正則化有專門的函數,下面介紹四種函數:python

一、L1正則化:tf.contrib.layers.l1_regularizer(scale,scope)(weights);L2正則化:tf.contrib.layers.l2_regularizer(scale,scope)(weights)git

參數說明:github

  • scale:正則表達式的超參數\lambda ,即懲罰係數。
  • scope:做用域的名字scope name,做用是在名字後面加個命名域(後續內容會說明)。
  • weights:須要正則化的參數,如神經網絡的權重矩陣。

函數說明:正則表達式

  這裏有兩個傳參括號,由於這裏是函數的多層調用,調用tf.contrib.layers.l1_regularizer()會返回用於計算正則化的一個函數l1(weights, name=None),而調用l1函數返回一個計算weights正則化後的tensor。詳情查看官方文檔網絡

 

三、tfc.layers.l1_l2_regularizer(scale_l1,scale_l2,float=1.0,scope=None) (weights)dom

參數說明:函數

  • scale_l一、scale_l2:一個正則化超參數\lambda。
  • scope:做用域的名字scope name,做用是在名字後面加個命名域(後續內容會說明)。
  • weights:須要正則化的參數,如神經網絡的權重矩陣。

函數說明:優化

  這裏是同時使用L一、L2正則化方法。spa

 

四、tfc.layers.sum_regularizer(regularizer_list,scope)(weights)

參數說明:

  • regularizer_list:定義的正則化方法的函數列表,注意是函數列表,不是tensor列表。
  • scope:做用域的名字scope name,做用是在名字後面加個命名域(後續內容會說明)。

函數說明:

  這裏是一個正則化方法的混合體,regularizer_list列表中正則化方法的混合。

 


 

3、實現L一、L2正則化的示例

 

import tensorflow as tf
import tensorflow.contrib as tfc
import numpy as np
#創造數據集 x_data=np.linspace(-1,1,10000,dtype=np.float).reshape(10000,1) y_data=2*x_data*x_data+3 #佔位符 x_p=tf.placeholder(tf.float32,[None,1]) y_p=tf.placeholder(tf.float32,[None,1]) #定義第一個隱藏層Layer1,輸入爲x有5個神經元,無激活函數 weights1=tf.Variable(tf.random_normal([1,5])) biases1=tf.Variable(tf.zeros([1,5])+0.001) input1=tf.matmul(x_p,weights1)+biases1 weights1_reg=tfc.layers.l2_regularizer(0.1)(weights1) #構建正則項,這裏是直接獲得計算正則化後的tensor值 #定義輸出層,輸入爲input1,激活函數爲tahn weights2=tf.Variable(tf.random_normal([5,1])) biases2=tf.Variable(tf.zeros([1,5])+0.001) prediction=tf.nn.tanh(tf.matmul(input1,weights2)+biases2) #定義損失函數,loss=均方差+正則化項 loss=tf.reduce_mean(tf.square(y_p-prediction)) + weights1_reg #定義優化方式爲梯度降低 train=tf.train.GradientDescentOptimizer(0.1).minimize(loss) init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) #訓練200次,每隔10次輸出一次loss for i in range(200): sess.run(train,feed_dict={x_p:x_data,y_p:y_data}) if i % 9 == 0: print(sess.run(loss,feed_dict={x_p:x_data,y_p:y_data}))

 


 

 

4、tensorflow實現drop正則化的函數

 

函數介紹:

tensorflow自帶的drop的函數方法:tf.nn.frop_out(x,keep_prop)

參數說明:

  • x:須要drop的權重矩陣(建議對對過擬合影響大的才進行drop處理,能夠根據與需求選擇)。
  • keep_prop:保留的神經元的比重(建議選0.5)。

 

代碼示例:

簡單的示例:

#定義第一個隱藏層Layer1,輸入爲x有5個神經元,無激活函數
weights1=tf.Variable(tf.random_normal([1,5]))
biases1=tf.Variable(tf.zeros([1,5])+0.001)
weights1_drop=tf.nn.dropout(weights1,0.5)   #實現drop正則化,通常對過擬合影響高的才使用drop
input1=tf.matmul(x_p,weights1_drop)+biases1  #使用定義的drop處理的weight

完整示例:

import tensorflow as tf
import tensorflow.contrib as tfc
import numpy as np


#創造數據集
x_data=np.linspace(-1,1,10000,dtype=np.float).reshape(10000,1)
y_data=2*x_data*x_data+3

#佔位符
x_p=tf.placeholder(tf.float32,[None,1])
y_p=tf.placeholder(tf.float32,[None,1])

#定義第一個隱藏層Layer1,輸入爲x有5個神經元,無激活函數
weights1=tf.Variable(tf.random_normal([1,5]))
biases1=tf.Variable(tf.zeros([1,5])+0.001)
weights1_drop=tf.nn.dropout(weights1,0.5)   #實現drop正則化,通常對過擬合影響高的才使用drop
input1=tf.matmul(x_p,weights1_drop)+biases1  #使用定義的drop處理的weight

#定義輸出層,輸入爲input1,激活函數爲tahn
weights2=tf.Variable(tf.random_normal([5,1]))
biases2=tf.Variable(tf.zeros([1,5])+0.001)
prediction=tf.nn.tanh(tf.matmul(input1,weights2)+biases2)

#定義損失函數,loss=均方差+正則化項
loss=tf.reduce_mean(tf.square(y_p-prediction))

#定義優化方式爲梯度降低
train=tf.train.GradientDescentOptimizer(0.1).minimize(loss)


init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    #訓練200次,每隔10次輸出一次loss
    for i in range(200):
        sess.run(train,feed_dict={x_p:x_data,y_p:y_data})
        if i % 9 == 0:
            print(sess.run(loss,feed_dict={x_p:x_data,y_p:y_data}))
相關文章
相關標籤/搜索