Tensorflow學習筆記day02 + TF損失函數定義和使用正則化

聲明一個損失函數需要將係數**(權重和偏置)定義爲變量**,將數據集定義爲佔位符

設 m 是樣本數量,n 是特徵數量,P 是類別數量

m = 1000
n  = 15
P  = 2

在標準線性迴歸的情況下,只有一個輸入變量和一個輸出變量:

import tensorflow as tf

#定義佔位符 用於訓練數據的輸入
X = tf.placeholder(tf.float32, name='X') 
Y = tf.placeholder(tf.float32, name='Y')

#定義變量 用於承載和更新權重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(0.0)

#線性迴歸模型
Y_hat = X*w1 + w0

#損失函數
loss = tf.square(Y - Y_hat, name='loss') #square 平方

在多元線性迴歸的情況下,輸入變量不止一個,而輸出變量仍爲一個。現在可以定義佔位符X的大小爲 [m,n],其中 m 是樣本數量,n 是特徵數量,代碼如下:

import tensorflow as tf

#定義佔位符 用於訓練數據的輸入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n]) 
Y = tf.placeholder(tf.float32, name='Y')

#定義變量 用於承載和更新權重和偏置
w0 = tf.Variable(0.0)
w1 = tf.Variable(tf.random_normal([n,1]))

#線性迴歸模型
Y_hat = tf.matmul(X, w1) + w0

#多元線性迴歸損失函數
loss = tf.reduce_mean(tf.square(Y - Y_hat , name='loss'))

在邏輯迴歸的情況下,損失函數定義爲交叉熵。輸出 Y 的維數等於訓練數據集中類別的數量,其中 P 爲類別數量:

import tensorflow as tf

#定義佔位符 用於訓練數據的輸入
X = tf.placeholder(tf.float32, name='X' , shape=[m,n]) 
Y = tf.placeholder(tf.float32, name='Y' , shape=[m,P])

#定義變量 用於承載和更新權重和偏置
w0 = tf.Variable(tf.zeros([1,P]), name='bias')
w1 = tf.Variable(tf.random_normal([n,1]), name='weights')

#線性迴歸模型
Y_hat = tf.matmul(X, w1) + w0

#損失函數
#entropy = tf.nn.softmax_cross_entropy_with_logits(Y_hat, Y)
#loss = tf.reduce_mean(entropy)

如果想把 L1 正則化加到損失上,那麼代碼如下:

lamda = tf.constant(0.8)
regularization_param = lamda*tf.reduce_sum(tf.abs(w1))

#New loss
loss +=regularization_param

對於 L2 正則化,代碼如下:

lamda = tf.constant(0.8)
regularization_param = lamda*tf.nn.l2_loss(w1)

#New loss
loss +=regularization_param

你可以選擇相應的損失函數或設計自己的損失函數。在損失項中也可以結合 L1 和 L2 正則化。

正則化:當有大量的輸入特徵時,需要正則化來確保預測模型不會 太複雜。正則化可以幫助防止數據過擬合。它也可以用來獲得一個凸損失函數。有兩種類型的正則化——L1 和 L2 正則化,其描述如下:

當數據高度共線時,L1 正則化也可以工作。在 L1 正則化中,與所有係數的絕對值的和相關的附加懲罰項被添加到損失函數中。L1 正則化的正則化懲罰項如下:

L2 正則化提供了稀疏的解決方案。當輸入特徵的數量非常大時,非常有用。在這種情況下,懲罰項是所有係數的平方之和:

其中,λ是正則化參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章