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'))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM