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

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

經常使用的激活 函數有  relu 、 sigmoid 、 tanh  等。網絡

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

 

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

 

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

    

 

 

神經網絡的複雜度:可用神經網絡的層數和神經網絡中待優化參數個數表示
√ 神經網路的 層數:通常不計入輸入層,層數  = n 個隱藏層 + 1 個輸出層
√ 神經網路待優化的 參數:神經網絡中全部參數  w 的個數 + 全部參數b 的個數spa

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

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

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

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

 

# 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),第一個神經網絡模型預測結果爲7y1=(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.222H2((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)

相關文章
相關標籤/搜索