日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TensorFlow学习笔记之三(神经网络的优化)

發布時間:2024/9/30 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow学习笔记之三(神经网络的优化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 1. 使用激活函數去線性化(為什么要用激活函數)
        • 實驗證明線性模型的局限性
        • 常用激活函數
      • 2. 神經網絡復雜度:用網絡層數和網絡參數的個數表示
      • 3. 損失函數(loss):預測值(y)與已知答案(y_)的差距
        • 均方誤差mse
        • 交叉熵ce(Cross Entropy):表征兩個概率分布之間的距離
      • 4. softmax()函數:讓n分類問題的n個輸出(y1,y2, ...yn)滿足概率分布
      • 5. 學習率(learning_rate):決定每次參數更新的幅度
      • 6. 滑動平均
      • 7. 正則化

1. 使用激活函數去線性化(為什么要用激活函數)

TensorFlow游樂場:http://playground.tensorflow.org

對于上一篇的網絡TensorFlow筆記之二可以抽象為如下形式,

[y]=[a1,1a1,2a1,3]?[w1,1(2)w2,1(2)w2,1(2)]=[x1x2]?[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]?[w1,1(2)w2,1(2)w2,1(2)]\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}=\begin{gathered} \begin{bmatrix} a_{1,1} & a_{1,2} & a_{1,3} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} *\begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered} [y?]?=[a1,1??a1,2??a1,3??]??????w1,1(2)?w2,1(2)?w2,1(2)???????=[x1??x2??]??[w1,1(1)?w2,1(1)??w1,2(1)?w2,2(1)??w1,3(1)?w2,3(1)??]??????w1,1(2)?w2,1(2)?w2,1(2)???????
其中,令:
W′=W(1)W(2)=[w1,1(1)w1,2(1)w1,3(1)w2,1(1)w2,2(1)w2,3(1)]?[w1,1(2)w2,1(2)w2,1(2)]=[w1′w2′]W^{'}=W^{(1)}W^{(2)}= \begin{gathered} \begin{bmatrix} w^{(1)}_{1,1} & w^{(1)}_{1,2} & w^{(1)}_{1,3} \\ w^{(1)}_{2,1} & w^{(1)}_{2,2} & w^{(1)}_{2,3} \end{bmatrix} \end{gathered}* \begin{gathered} \begin{bmatrix} w^{(2)}_{1,1}\\w^{(2)}_{2,1}\\w^{(2)}_{2,1} \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered} W=W(1)W(2)=[w1,1(1)?w2,1(1)??w1,2(1)?w2,2(1)??w1,3(1)?w2,3(1)??]??????w1,1(2)?w2,1(2)?w2,1(2)???????=[w1?w2??]?
這樣,就可以得出
[y]=[x1x2]?[w1′w2′]=w1′x1+w2′x2\begin{gathered} \begin{bmatrix} y \end{bmatrix} \end{gathered}= \begin{gathered} \begin{bmatrix} x_{1} & x_{2} \end{bmatrix} \end{gathered} * \begin{gathered} \begin{bmatrix} w^{'}_{1}\\w^{'}_{2} \end{bmatrix} \end{gathered}=w^{'}_{1}x_{1}+w^{'}_{2}x_{2} [y?]?=[x1??x2??]??[w1?w2??]?=w1?x1?+w2?x2?
可以看出,該網絡雖然有兩層,但是它在本質上與單層神經網絡沒有區別,因為它可以被一個單層網絡表示。由此可以推斷,如果只是每個神經元只是單純的線性變換,多層的全連接網絡與單層的全連接網絡的表達能力沒有區別(通過矩陣運算,最終都會變成一個矩陣)。它們最終都是y是關于x1和x2的一個線性模型,而且線性模型解決問題的能力是有限的,這就是線性模型的最大局限性。

實驗證明線性模型的局限性

本次實驗在TensorFlow游樂場中進行。

情景模擬:現在根據x1(零件長度與平均長度的差)和x2(零件質量與平均質量的差)來判斷一個零件是否合格(二分類問題)。因此,當一個零件的長度和質量越接近平均值(x1和x2接近零),那么這個零件越可能合格。那么它可能呈現如下分布

圖中藍色的點代表合格的零件(x1和x2接近零)。黃色的點代表不合格的(x1或x2偏大)。
將激活函數選擇線性模型。訓練100輪后

發現并不能很好的將零件區分開來。

將激活函數選擇ReLu,訓練100輪。

可以發現模型很好的將零件區分開來了。

常用激活函數

2. 神經網絡復雜度:用網絡層數和網絡參數的個數表示


由于輸入層只接受數據,不做計算故輸入層不算層數。

3. 損失函數(loss):預測值(y)與已知答案(y_)的差距

網絡優化目標:loss最小。
常用loss:

  • mse(Mean Squared Error) 均方誤差
  • 自定義
  • ce(Cross Entropy)交叉熵
  • 均方誤差mse


    當預測值(y)與已知答案(y_)越接近–>均方誤差MSE(y_, y)越接近0–>損失函數的值越小–模型預測效果越好

    預測酸奶模型

    # 預測import tensorflow as tf import numpy as npBATCH_SIZE = 8 seed = 23455# 基于seed產生隨機數 rng = np.random.RandomState(seed=seed) X = rng.rand(32, 2) Y_ = [[x1+x2+(rng.rand()/10.0-0.05)] for (x1, x2) in X] Y = [[int(x0 + x1 <1)] for (x0, x1) in X]# 1、定義神經網絡的輸入、參數和輸出,定義前向傳播過程 x = tf.placeholder(tf.float32,shape=(None, 2)) # 知道每組有兩個特征變量,但是不知道多少組,用None占位 y_ = tf.placeholder(tf.float32,shape=(None, 1)) # 存放真實的結果值,合格為1,w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))y = tf.matmul(x, w1)# 2、定義損失函數以及反向傳播方法 loss = tf.reduce_mean(tf.square(y-y_)) # 使用均方誤差計算loss train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss) # 學習率為0.001,并讓損失函數讓減小的方向優化# 3、生成會話,訓練STEPS輪 with tf.Session() as sess:# 3.1、初始化參數值init_op = tf.global_variables_initializer()sess.run(init_op)print("w1:\n", sess.run(w1))print("\n")# 3.2、訓練模型STEPS = 30000for i in range(STEPS):# 3.2.1 每輪確定讀取數據集的游標start = (i*BATCH_SIZE) % 32end = start + BATCH_SIZE# 3.2.2 喂入數據,開始訓練sess.run(train_step, feed_dict={x: X[start:end], y_: Y_[start:end]})# 3.2.3 每500輪輸出一次loss值if i % 500 == 0:print("每500輪輸出一次w1的值\n")print(sess.run(w1), "\n")total_loss = sess.run(loss, feed_dict={x: X, y_: Y})print("After % dtraining step(s), cross entropy on all data is % g" % (i, total_loss))print("w1:\n", sess.run(w1))

    交叉熵ce(Cross Entropy):表征兩個概率分布之間的距離

    H(y,y)=?Σy??logyH(y_,y) = -Σy_-*log y H(y,?y)=?Σy???logy

    4. softmax()函數:讓n分類問題的n個輸出(y1,y2, …yn)滿足概率分布

    ?xP(X=x)∈[0,1]且∑xP(X=x)=1softmax(y[]){\forall}x P(X = x) \in [0,1] 且 \sum_{x} P(X = x) =1 softmax(y[]) ?xP(X=x)[0,1]x?P(X=x)=1softmax(y[])
    前面已經講過,損失函數是用來衡量模型預測值與真實值之間的差值。即模型好壞的標準。一個模型越好,它的損失函數越小。因此,
    神經網絡的優化=減小損失函數

    5. 學習率(learning_rate):決定每次參數更新的幅度

    wn+1=wn?learningratew_{n+1}=w_{n}-learning_rate wn+1?=wn??learningr?ate

    6. 滑動平均

    滑動平均(影子值):記錄了每個參數一段時間內過往值得平均,增加了模型的泛化性。
    針對所有的參數:w和b(類似給參數加了影子,參數變化,影子緩慢追隨)
    影子初始值=參數初始值
    影子(滑動平均值) = 衰減率 * 影子 + (1-衰減率)* 參數
    衰減率 = min{MOVING_AVERAGE_DECAY, (1+輪數)/(10+輪數)}

    栗子:
    MOVING_AVERAGE_DECAY(超參數:訓練之前設置的參數)為0.99,
    參數w1初始值為0
    w1的滑動平均初始值為0

    輪數global_step=0
    w1 = 1
    w1滑動平均值 = 0

    衰減率 = min(0.99, 1/10)=0.1
    w1滑動平均值 = 0.1 * 0 +(1-0.1) *1 = 0.9
    所以,第0輪過后,w1的滑動平均值更新為0.9

    global_step=100
    w1 = 10
    w1滑動平均值 = 0.9

    衰減率 = min(0.99, 101/110)=0.918
    w1滑動平均值 = 0.918 * 0.9 +(1-0.918) *10 = 0.8262 + 0.82 = 1.6482(誤差由于四舍五入引起)

    7. 正則化

    正則化的意義是為了防止過擬合。

    總結

    以上是生活随笔為你收集整理的TensorFlow学习笔记之三(神经网络的优化)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。