Tensorflow 筆記: 神經網絡優化-損失函數


 √ 神經元模型: 用數學公式表示為: 𝐟(∑xw +b), , f  為激活函數。 神經網絡 是 以神經元為基本單元構成的.
√ 激活函數: 引入 非線性 激 活因素,提高模型表達力

常用的激活 函數有  relu 、 sigmoid 、 tanh  等。

 激活函數  relu: : 在  tensorflow  中, 用  tf.nn.relu()

 

激活函數 激活函數  sigmoid :在  Tensorflow  中,用  tf.nn.sigmoid() 表示

 

激活函數 激活函數  tanh :在 Tensorflow  中,用  tf.nn.tanh()

    

 

 

神經網絡的復雜度:可用神經網絡的層數和神經網絡中待優化參數個數表示
√ 神經網路的 層數:一般不計入輸入層,層數  = n 個隱藏層 + 1 個輸出層
√ 神經網路待優化的 參數:神經網絡中所有參數  w 的個數 + 所有參數b 的個數

損失函數( loss): 用來表示預測值( y)與已知答案( y_)的差距。 在訓練神經網絡時,通過不斷
改變神經網絡中所有參數,使損失函數不斷減小,從而訓練出更高准確率的神經網絡模型。

√ 常用的 損失函數有均方誤差、自定義和交叉熵 等

 √ 均方誤差  mse : n  個樣本的 預測值  y 與已知 答案  y_之差的 平方和,再求平均值。

在 Tensorflow  中用  loss_mse = tf.reduce_mean(tf.square(y_ - y))

 

# coding:utf-8
# 0導入模塊,生成模擬數據集。
import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
SEED = 23455

# 基於seed產生隨機數
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y_ = [[x1 + x2 +(rdm.rand()/10.0-0.05)] for (x1, x2) in X]

print(X)
print(Y_)

# 1定義神經網絡的輸入、參數和輸出,定義前向傳播過程。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))

w = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))

y = tf.matmul(x, w)

# 2定義損失函數及反向傳播方法。
loss_mse = tf.reduce_mean(tf.square(y_ - y))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

# 3生成會話,訓練STEPS輪
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)

# 訓練模型。
STEPS = 20000
for i in range(STEPS):
start = (i * BATCH_SIZE) % 32
end = (i * BATCH_SIZE) % 32 + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
if i % 500 == 0:
print("After %d training step(s)" % (i))
print("w1:\n", sess.run(w))

# 輸出訓練后的參數取值。
print("\n")
print("w1:\n", sess.run(w))

√ 自定義損失函數:根據 問題的實際情況,定制 合理的損失函數 。
例如:
對於預測酸奶日銷量問題,如果預測銷量大於實際銷量則會損失成本;如果預測銷量小於實際銷量則
會損失利潤。在實際生活中,往往制造一盒酸奶的成本和銷售一盒酸奶的利潤是不等價的。因此,需
要使用符合該問題的自定義損失函數。
自定義損失函數為: loss = ∑ 𝑛 𝑓(y_,y)
其中,損失定義成分段函數:
f(y_,y) = { 𝑄𝑆𝑃𝐹𝐼𝑈 ∗ (𝑦_ − 𝑦) 𝑦 < 𝑦_
𝐶𝑃𝑇𝑈 ∗ (𝑦 − 𝑦_) 𝑦 >= 𝑦_
損失函數表示,若預測結果 y 小於標准答案 y_,損失函數為利潤乘以預測結果 y 與標准答案 y_之差;
若預測結果 y 大於標准答案 y_,損失函數為成本乘以預測結果 y 與標准答案 y_之差。
用 Tensorflow 函數表示為:
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))
① 若酸奶成本為 1 元,酸奶銷售利潤為 9 元,則制造成本小於酸奶利潤,因此希望預測的結果 y 多
一些。采用上述的自定義損失函數,訓練神經網絡模型。

 

# coding:utf-8
# 0導入模塊,生成模擬數據集。
import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
SEED = 23455
COST=1
PROFIT=9

# 基於seed產生隨機數
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y_ = [[x1 + x2 +(rdm.rand()/10.0-0.05)] for (x1, x2) in X]

print(X)
print(Y_)

# 1定義神經網絡的輸入、參數和輸出,定義前向傳播過程。
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))

w = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))

y = tf.matmul(x, w)

# 2定義損失函數及反向傳播方法。
loss_mse = tf.reduce_sum(tf.where(tf.greater(y,y_),COST*(y-y_),PROFIT*(y_-y)))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss_mse)

# 3生成會話,訓練STEPS輪
with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)

# 訓練模型。
STEPS = 3000
for i in range(STEPS):
start = (i * BATCH_SIZE) % 32
end = (i * BATCH_SIZE) % 32 + BATCH_SIZE
sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})
if i % 500 == 0:
print("After %d training step(s)" % (i))
print("w1:\n", sess.run(w))

# 輸出訓練后的參數取值。
print("\n")
print("w1:\n", sess.run(w))

√ 交叉熵(Cross Entropy): : 表示 兩個概率分布之間的距離。交叉熵越大,兩個概率分布 距離 越遠, 兩
個概率分布越 相異 ; 交叉熵越小,兩個概率分布 距離 越近 ,兩個概率分布越相似。 。
交叉熵計算公式: :𝐇(𝐳_ , 𝐳) = −∑𝐳_ ∗ 𝒍𝒑𝒈 𝒛
用 用 T Tw ensorflow 函數表示 為
ce= - - tf.reduce_mean(y_* tf.log(tf.clip_by_value(y, 1e- - 12, 1.0)))
例如:
兩個神經網絡模型解決二分類問題中,已知標准答案為 y_ = (1, 0),第一個神經網絡模型預測結果為
7
y1=(0.6, 0.4),第二個神經網絡模型預測結果為 y2=(0.8, 0.2),判斷哪個神經網絡模型預測的結果更接
近標准答案。
根據交叉熵的計算公式得:
H1((1,0),(0.6,0.4)) = -(1*log0.6 + 0*log0.4) ≈ -(-0.222 + 0) = 0.222
H2((1,0),(0.8,0.2)) = -(1*log0.8 + 0*log0.2) ≈ -(-0.097 + 0) = 0.097
由於 0.222>0.097,所以預測結果 y2 與標准答案 y_更接近,y2 預測更准確。
√ √softmax 函數 :將 將 n 分類的 n 個輸出( (y1,y2…yn) ) 變 為 滿足以下概率分布要求的函數。 。

softmax 函數應用:在 n 分類中,模型會有 n 個輸出,即 y1,y2…yn,其中 yi 表示第 i 種情況出現的可
能性大小。將 n 個輸出經過 softmax 函數,可得到符合概率分布的分類結果。
√在 在 Tensorflow 中,一般讓 模型 的過 輸出經過 sofemax 函數 , 以 獲得輸出分類的 概率分布,再與標准
答案 對比, 求 出 交叉熵 , 得到損失函數,用如下函數 實現: :
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cem = tf.reduce_mean(ce)

 


免責聲明!

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



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