TensorFlow学习(三)——神经网络进阶
TensorFlow學(xué)習(xí)(三)——神經(jīng)網(wǎng)絡(luò)進(jìn)階DNN
- 一、神經(jīng)網(wǎng)絡(luò)的進(jìn)階概念
- 激活函數(shù)
- 偏置項(xiàng)
- 損失函數(shù)
- 經(jīng)典損失函數(shù)
- 交叉熵(cross entropy)損失函數(shù)——分類問題
- 示例展示
- 代碼表示
- 代碼說明
- 均方誤差——回歸問題(數(shù)值預(yù)測(cè)等)
- 代碼展示
- 代碼說明
- 自定義損失函數(shù)
- 示例展示
- 代碼展示
- 代碼說明
- 學(xué)習(xí)率設(shè)置
- 指數(shù)衰減法
- 代碼展示
- 代碼說明
- 二、使用自定義損失函數(shù)實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)
一、神經(jīng)網(wǎng)絡(luò)的進(jìn)階概念
激活函數(shù)
在線性模型中,模型的輸出是輸入的加權(quán)和,例如通過下面這個(gè)公式計(jì)算的模型
該公式稱為線性變換,該模型稱為線性模型。只通過線性變換,任意層的全連接神經(jīng)網(wǎng)絡(luò)與單層神經(jīng)網(wǎng)絡(luò)的表達(dá)能力沒有太大區(qū)別。而深度學(xué)習(xí)主要是強(qiáng)調(diào)非線性。比如碰到如下問題,線性變換模型不能很好擬合。
當(dāng)引入激活函數(shù)后,這個(gè)問題就能被很好解決,因?yàn)榧せ詈瘮?shù)是非線性的。
常用的激活函數(shù)有relu、sigmod、tanh,它們?cè)赥ensorFlow中分別為tf.nn.relu、tf.sigmoid、tf.tanh。
激活函數(shù)的具體介紹可以看這篇博客
https://blog.csdn.net/kangyi411/article/details/78969642
偏置項(xiàng)
在神經(jīng)網(wǎng)絡(luò)中,偏置項(xiàng)一般置為1,是一個(gè)常量。偏置項(xiàng)具體介紹可以參考這篇博客
https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/81074408
損失函數(shù)
損失函數(shù)簡單講就是神經(jīng)網(wǎng)絡(luò)中優(yōu)化算法的優(yōu)化目標(biāo),通過最小化損失函數(shù),然后神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到權(quán)重,從而實(shí)現(xiàn)我們所見的預(yù)測(cè)、分類等功能。
經(jīng)典損失函數(shù)
交叉熵(cross entropy)損失函數(shù)——分類問題
x表示所屬類別
給定兩個(gè)概率分布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)
交叉熵刻畫了兩個(gè)概率分布之間的距離,概率分布刻畫了不同事件發(fā)生的概率
當(dāng)事件總數(shù)有限時(shí),概率分布函數(shù)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
將前向傳播的結(jié)果變?yōu)楦怕史植伎梢赃m用softmax回歸,在TensorFlow中,softmax回歸只是額外的一層處理層,加入了softmax層的神經(jīng)網(wǎng)絡(luò)如圖。一般要預(yù)測(cè)多少類,softmax就輸出多少個(gè)。
若神經(jīng)網(wǎng)絡(luò)輸出為y1,y2,…,yn,則經(jīng)過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??
這樣的話就可以將結(jié)果轉(zhuǎn)換為一個(gè)概率分布,從而使用交叉熵?fù)p失函數(shù)計(jì)算預(yù)測(cè)的概率分布和真實(shí)概率分布之間的距離。
當(dāng)使用交叉熵作為神經(jīng)網(wǎng)絡(luò)的損失函數(shù)時(shí),p代表正確答案,q代表預(yù)測(cè)值
示例展示
假設(shè)一個(gè)三分類問題,某個(gè)樣例的正確答案是(1,0,0)。某模型經(jīng)過Softmax回歸之后的預(yù)測(cè)答案是(0.5,0.4,0.1), 那么這個(gè)預(yù)測(cè)和正確答案之間的交叉熵為:
H((1, 0, 0), (0.5, 0.4, 0.1))= -(1 x log0.5+ 0 x log0.4+ 0 x log0.1) ≈ 0.3
如果另外一個(gè)模型的預(yù)測(cè)是(0.8,0.1,0.1),那么這個(gè)預(yù)測(cè)值和真實(shí)值之間的交叉熵是:
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代表實(shí)際值,也就是上面示例中的(1, 0, 0)
y_pred表示預(yù)測(cè)值,也就是上面示例中的(0.5, 0.4, 0.1)和(0.8, 0.1, 0.1)
tf.clip_by_value函數(shù)可以將張量限制在一定范圍內(nèi),從而避免運(yùn)算錯(cuò)誤
例如
輸出如下
將所有小于2.0的替換為2.0,將所有大于5的替換為5
*表示矩陣點(diǎn)乘,tf.matmul表示矩陣乘法
在TensorFlow中可以直接使用softmax回歸后的交叉熵?fù)p失函數(shù)
均方誤差——回歸問題(數(shù)值預(yù)測(cè)等)
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個(gè)數(shù)據(jù)的正確答案,y’i為神經(jīng)網(wǎng)絡(luò)給出的預(yù)測(cè)值。
代碼展示
tf.reduce_mean(tf.square(y_real - y_pred))代碼說明
y_real表示實(shí)際值
y_pred表示輸出值
"-"表示對(duì)于的元素相減,類似于點(diǎn)乘
自定義損失函數(shù)
示例展示
例如損失函數(shù)如下: 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個(gè)數(shù)據(jù)的正確答案,y’i為神經(jīng)網(wǎng)絡(luò)得到的預(yù)測(cè)值,a和b是常量
代碼展示
# windows下tf沒有select函數(shù),使用where函數(shù)代替 # 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實(shí)現(xiàn)選擇操作
tf.greater(judgement, operation1, operation2)比較兩個(gè)元素大小,當(dāng)judgement是True時(shí),執(zhí)行operation1,當(dāng)judgement是False時(shí),執(zhí)行operation2
學(xué)習(xí)率設(shè)置
指數(shù)衰減法
該方法在TensorFlow中可以通過調(diào)用tf.train.exponential_decay實(shí)現(xiàn),大概過程如下
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是每輪優(yōu)化時(shí)使用的學(xué)習(xí)率,learning_rate為初始學(xué)習(xí)率,decay_rate為衰減系數(shù),decay_steps為衰減速度。
在TensorFlow中可以通過設(shè)置參數(shù)staircase來選擇不同衰減方式。當(dāng)staircase為True時(shí),是階梯函數(shù),如下圖黑色階梯函數(shù);當(dāng)staircase為False時(shí),是連續(xù)函數(shù),如下圖灰色連續(xù)曲線
staircase默認(rèn)為False
代碼展示
global_step = tf.Variable(0)# 通過exponential_decay函數(shù)生成學(xué)習(xí)率 learning_rate = tf.train.exponential_decay(0.1, global_step, 100, 0.96, staircase=True)# 使用指數(shù)衰減更新學(xué)習(xí)率。在minimize中傳入global_step傳入?yún)?shù)將自動(dòng)更新 learning_step = tf.train.GradientDescentOptimizer(learning_reate).minimize(cost_function, global_step=global_step)代碼說明
上述代碼中設(shè)定初始學(xué)習(xí)率為0.1, 指定staircase為True,每訓(xùn)練100輪后,學(xué)習(xí)率乘以0.96。
二、使用自定義損失函數(shù)實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)
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()))總結(jié)
以上是生活随笔為你收集整理的TensorFlow学习(三)——神经网络进阶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: # D - Staircase Sequ
- 下一篇: C. Dima and Staircas