TensorFlow学习(三)——神经网络进阶
TensorFlow學習(三)——神經網絡進階DNN
- 一、神經網絡的進階概念
- 激活函數
- 偏置項
- 損失函數
- 經典損失函數
- 交叉熵(cross entropy)損失函數——分類問題
- 示例展示
- 代碼表示
- 代碼說明
- 均方誤差——回歸問題(數值預測等)
- 代碼展示
- 代碼說明
- 自定義損失函數
- 示例展示
- 代碼展示
- 代碼說明
- 學習率設置
- 指數衰減法
- 代碼展示
- 代碼說明
- 二、使用自定義損失函數實現的神經網絡
一、神經網絡的進階概念
激活函數
在線性模型中,模型的輸出是輸入的加權和,例如通過下面這個公式計算的模型
該公式稱為線性變換,該模型稱為線性模型。只通過線性變換,任意層的全連接神經網絡與單層神經網絡的表達能力沒有太大區別。而深度學習主要是強調非線性。比如碰到如下問題,線性變換模型不能很好擬合。
當引入激活函數后,這個問題就能被很好解決,因為激活函數是非線性的。
常用的激活函數有relu、sigmod、tanh,它們在TensorFlow中分別為tf.nn.relu、tf.sigmoid、tf.tanh。
激活函數的具體介紹可以看這篇博客
https://blog.csdn.net/kangyi411/article/details/78969642
偏置項
在神經網絡中,偏置項一般置為1,是一個常量。偏置項具體介紹可以參考這篇博客
https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408
損失函數
損失函數簡單講就是神經網絡中優化算法的優化目標,通過最小化損失函數,然后神經網絡能夠學習到權重,從而實現我們所見的預測、分類等功能。
經典損失函數
交叉熵(cross entropy)損失函數——分類問題
x表示所屬類別
給定兩個概率分布p和q,通過q定義p的交叉熵:H(p, q) = – ∑ x p ( x ) l o g q ( x ) \sum_{x}p(x)log\ q(x) ∑x?p(x)log?q(x)
交叉熵刻畫了兩個概率分布之間的距離,概率分布刻畫了不同事件發生的概率
當事件總數有限時,概率分布函數p(X=x)滿足 ? x , p ( X = x ) ∈ [ 0 , 1 ] 且 ∑ x p ( X = x ) = 1 \forall x, \quad p(X=x) \in [0, 1]且\sum_{x}p(X=x) = 1 ?x,p(X=x)∈[0,1]且∑x?p(X=x)=1
將前向傳播的結果變為概率分布可以適用softmax回歸,在TensorFlow中,softmax回歸只是額外的一層處理層,加入了softmax層的神經網絡如圖。一般要預測多少類,softmax就輸出多少個。
若神經網絡輸出為y1,y2,…,yn,則經過softmax回歸處理后的輸出為: s o f t m a x ( y i ) = y i ′ = e y i ( ∑ j = 1 n e y i ) softmax(y_i) = y'_i = \frac{e^{y_i}} {(\sum_{j=1}^{n}\ e^{y_i})} softmax(yi?)=yi′?=(∑j=1n??eyi?)eyi??
這樣的話就可以將結果轉換為一個概率分布,從而使用交叉熵損失函數計算預測的概率分布和真實概率分布之間的距離。
當使用交叉熵作為神經網絡的損失函數時,p代表正確答案,q代表預測值
示例展示
假設一個三分類問題,某個樣例的正確答案是(1,0,0)。某模型經過Softmax回歸之后的預測答案是(0.5,0.4,0.1), 那么這個預測和正確答案之間的交叉熵為:
H((1, 0, 0), (0.5, 0.4, 0.1))= -(1 x log0.5+ 0 x log0.4+ 0 x log0.1) ≈ 0.3
如果另外一個模型的預測是(0.8,0.1,0.1),那么這個預測值和真實值之間的交叉熵是:
H((1, 0, 0), (0.8, 0.1, 0.1))= -(1 x log0.8 + 0 x log0.1 + 0 x log0.1) ≈ 0.1
代碼表示
corss_entropy = -tf.reduce_mean(y_real * tf.log(tf.clip_by_value(y_pred, 1e-10, 1.0))
代碼說明
其中y_real代表實際值,也就是上面示例中的(1, 0, 0)
y_pred表示預測值,也就是上面示例中的(0.5, 0.4, 0.1)和(0.8, 0.1, 0.1)
tf.clip_by_value函數可以將張量限制在一定范圍內,從而避免運算錯誤
例如
輸出如下
將所有小于2.0的替換為2.0,將所有大于5的替換為5
*表示矩陣點乘,tf.matmul表示矩陣乘法
在TensorFlow中可以直接使用softmax回歸后的交叉熵損失函數
均方誤差——回歸問題(數值預測等)
M S E ( m e a n s q u a r e d e r r o r ) = ∑ i = 1 n ( y i ? y i ′ ) 2 n MSE(mean squared error) = \frac{\sum_{i=1}^{n}\ (y_i - y'_i)^2} n MSE(meansquarederror)=n∑i=1n??(yi??yi′?)2?
其中yi表示batch中第i個數據的正確答案,y’i為神經網絡給出的預測值。
代碼展示
tf.reduce_mean(tf.square(y_real - y_pred))代碼說明
y_real表示實際值
y_pred表示輸出值
"-"表示對于的元素相減,類似于點乘
自定義損失函數
示例展示
例如損失函數如下: L o s s ( y , y ′ ) = ∑ i = 1 n f ( y i , y i ′ ) , f ( x , y ) = { a ( x ? y ) x > y b ( y ? x ) x ≤ y Loss(y, y') = \sum_{i=1}^n\ f(y_i, y'_i),f(x, y)=\begin{cases} a(x - y) & x > y \\ b(y - x) & x≤ y \end{cases} Loss(y,y′)=i=1∑n??f(yi?,yi′?),f(x,y)={a(x?y)b(y?x)?x>yx≤y?
其中yi為第i個數據的正確答案,y’i為神經網絡得到的預測值,a和b是常量
代碼展示
# windows下tf沒有select函數,使用where函數代替 # method "select" don't exist in windows, you can replace it with "where()" loss = tf.reduce_sum(tf.select(tf.greater(x, y), (x - y) * a, (y - x) * b))代碼說明
上述代碼通過tf.select和tf.greater實現選擇操作
tf.greater(judgement, operation1, operation2)比較兩個元素大小,當judgement是True時,執行operation1,當judgement是False時,執行operation2
學習率設置
指數衰減法
該方法在TensorFlow中可以通過調用tf.train.exponential_decay實現,大概過程如下
d e c a y e d _ l e a r n i n g _ r a t e = l e a r n i n g _ r a t e ? d e c a y _ r a t e g l o b a l _ s t e p / d e c a y _ s t e p decayed\_learning\_rate = learning\_rate * decay\_rate^{global\_step / decay\_step} decayed_learning_rate=learning_rate?decay_rateglobal_step/decay_step
其中decaed_learining_rate是每輪優化時使用的學習率,learning_rate為初始學習率,decay_rate為衰減系數,decay_steps為衰減速度。
在TensorFlow中可以通過設置參數staircase來選擇不同衰減方式。當staircase為True時,是階梯函數,如下圖黑色階梯函數;當staircase為False時,是連續函數,如下圖灰色連續曲線
staircase默認為False
代碼展示
global_step = tf.Variable(0)# 通過exponential_decay函數生成學習率 learning_rate = tf.train.exponential_decay(0.1, global_step, 100, 0.96, staircase=True)# 使用指數衰減更新學習率。在minimize中傳入global_step傳入參數將自動更新 learning_step = tf.train.GradientDescentOptimizer(learning_reate).minimize(cost_function, global_step=global_step)代碼說明
上述代碼中設定初始學習率為0.1, 指定staircase為True,每訓練100輪后,學習率乘以0.96。
二、使用自定義損失函數實現的神經網絡
import tensorflow as tf from numpy.random import RandomState# load dataset batch_size = 8 dataset_size = 128 rnd = RandomState(1) X = rnd.rand(dataset_size, 2) Y = [[x1 + x2 + rnd.rand() / 10.0 - 0.05] for (x1, x2) in X]x = tf.placeholder(tf.float32, shape=(None, 2), name="x_input") y_real = tf.placeholder(tf.float32, shape=(None, 1), name="y_input")# initialize weights w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1, name="weight1"))# forward propagation algorithm y_pred = tf.matmul(x, w1)# cost function a = 10 b = 1 cost_function = tf.reduce_sum(tf.where(tf.greater(y_real, y_pred), (y_real - y_pred) * a, (y_pred - y_real) * b)) training_step = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost_function)with tf.Session() as sess:tf.global_variables_initializer().run()print("before training, w1:\n{}".format(w1.eval()))steps = 5000for i in range(steps):start = (i * batch_size) % dataset_sizeend = min(start + batch_size, dataset_size)sess.run(training_step, feed_dict={x: X[start: end], y_real: Y[start: end]})if i % 1000 == 0:total_loss = sess.run(cost_function, feed_dict={x: X, y_real: Y})print("after %d steps, total loss is %f" % (i, total_loss))print("after training, w1:\n{}".format(w1.eval()))總結
以上是生活随笔為你收集整理的TensorFlow学习(三)——神经网络进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: # D - Staircase Sequ
- 下一篇: C. Dima and Staircas