1. 程式人生 > >79、tensorflow計算一個五層神經網路的正則化損失係數、防止網路過擬合、正則化的思想就是在損失函式中加入刻畫模型複雜程度的指標

79、tensorflow計算一個五層神經網路的正則化損失係數、防止網路過擬合、正則化的思想就是在損失函式中加入刻畫模型複雜程度的指標

'''
Created on Apr 20, 2017

@author: P0079482
'''
import tensorflow as tf
#獲取一層神經網路邊上的權重,並將這個權重的L2正則化損失加入名稱為'losses'的集合中
def get_weight(shape,lambda1):
    #生成一個變數
    var = tf.Variable(tf.random_normal(shape),dtype=tf.float32)
    #add_to_collection函式將這個新生成變數的L2正則化損失項加入集合
    #這個函式的第一個引數'losses'是集合的名字,第二個引數是要加入這個集合的內容
tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lambda1)(var)) #返回生成的變數 return var x = tf.placeholder(tf.float32,shape=(None,2)) y_= tf.placeholder(tf.float32,shape=(None,1)) batch_size=8 #定義了每一層網路中節點的個數、 layer_dimension=[2,10,10,10,1] #神經網路的層數 n_layers=len(layer_dimension) #
這個變數維護前向傳播時最深層的節點,開始的時候就是輸入層 cur_layer=x #當前層的節點個數 in_dimension=layer_dimension[0] #通過一個迴圈來生成5層全連線的神經網路結構 for i in range(1,n_layers): #layer_dimension[i]為下一層的節點個數 out_dimension=layer_dimension[i] #生成當前層中權重的變數,並將這個變數的L2正則化損失加入計算圖上的集合 weight=get_weight([in_dimension,out_dimension],0.001) bias=tf.Variable(tf.constant(0.1,shape=[out_dimension])) #
使用ReLU啟用函式 cur_layer=tf.nn.relu(tf.matmul(cur_layer,weight)+bias) #進入下一層之前將下一層的節點個數更新為當前層節點個數 in_dimension=layer_dimension[i] #在定義神經網路前向傳播的同時已經將所有的L2正則化損失加入了圖上的集合 #這裡只需要計算刻畫模型在訓練資料上表現的損失函式 mse_loss=tf.reduce_mean(tf.square(y_-cur_layer)) #將均方誤差損傷函式加入損傷集合 tf.add_to_collection('losses',mse_loss) #get_collection返回一個列表,這個列表是所有這個集合中的元素。在這個樣例中 #這些元素就是損失函式的不同部分,將它們加起來就可以得到最終的損失函式 loss=tf.add_n(tf.get_collection('losses'))