1. 程式人生 > >深度學習基礎及tensorflow框架---學習筆記

深度學習基礎及tensorflow框架---學習筆記

1、tensorflow框架基礎問題
①tensorflow-gpu版環境配置
為了在伺服器GPU上進行加速運算,安裝tensorflow-gpu版,安裝預設gpu版本之後發現tensorflow無法使用,在於最新tensorflow-gpu版與伺服器已有的NVIDIA平行計算架構CUDA9.0版本不相容,隧將tensorflow-gpu降級到1.8.0後代碼除錯成功。

②tensorflow計算圖
tensorflow是一個通過計算圖的形式來表述計算的程式設計系統,tensorflow中的每一個計算都是計算圖上的一個節點,而節點與節點直接的邊描述了計算之間的依賴關係。ensorflow會自動將定義的計算轉化為計算圖上的節點,通過tf.get_default_graph函式可以獲取當前預設的計算圖,也可以利用tf.Graph函式來生成新的計算圖,不同計算圖上的張量及運算都不會共享。

③tensorflow運算資源管理
執行上Tensorflow程式的時候程式我們會遇到一個問題,執行時程式會自動呼叫所有能呼叫到的資源,並且全佔滿,在自己的PC上沒問題,但是在伺服器上,問題就很大,因為一旦你執行程式,佔滿視訊記憶體別人就不能再用了,解決方法是我們通常是給程式執行指定一塊GPU,然後限制其使用比例,此外通過config.gpu_options.allow_growth = True指令程式按可以需申請記憶體。

④tensorflow中張量的概念
從功能上看,張量可以簡單的理解為多維矩陣,但在tensorflow中張量的實現並不是直接採用陣列的形式,它只是對tensorflow中運算結果的引用。在張量中並沒有真正儲存數字,而是儲存得到這些數字的計算結果。Tensorflow中張量主要儲存三個屬性:名字、維度和型別。其中名字不僅是一個張量的唯一標識,它同樣也給出了這個張量是如何計算來的,型別問題,當計算操作元素不符合張量型別時會導致報錯。

⑤tensorflow運算模型—Session
Tensorflow中會話session來執行定義好的運算,會話擁有並管理tensorflow程式執行時的所有資源。

⑥神經網路引數與tensorflow變數
利用tf.variable函式生成變數,利用tf.global_variables_initializer()實現初始化所有變數的過程,只有在執行sess.run()命令後才進行運算和輸出。如果宣告變數時引數trainable為True,那麼這個變數將會被加入到GraphKeys.TRAINABLE_VARIABLES集合,tensorflow中提供的神經網路優化演算法會將上述集合中的變數作為預設的優化物件。Tensorflow提供了placeholder機制用於提供輸入資料,placeholder相當於定義了一個位置,這個位置中的資料在程式執行時再指定。這樣在程式中就不需要生成大量的常量來提供輸入資料,而只需要將資料通過placerholder傳入tensorflow計算圖。

2、深度學習與tensorflow
①訓練神經網路的三個步驟
1.定義神經網路的結構和前向傳播的輸出結果
2.定義損失函式以及選擇反向傳播優化演算法
3.生成會話並且在訓練資料上反覆執行反向傳播優化演算法。

②啟用函式實現非線性化
如果將每一個神經元的輸出為所有輸入的加權和,這導致整個神經網路是一個線性模型。如果將每一個神經元的輸出通過一個非線性函式,那麼整個神經網路的模型也就不再是線性的了,這個非線性函式就是啟用函式。從而利用深度學習解決非線性問題。

③損失函式
統計學中損失函式是一種衡量損失和錯誤程度的函式,神經網路模型的效果以及優化的
目標是通過損失函式來定義的。
交叉熵是分類問題常用的評價方法之一,交叉熵刻畫了兩個概率分佈之間的距離。利用softmax迴歸可以將神經網路前向傳播得到的結果變成一個概率分佈,就可以利用交叉熵來計算預測的概率分佈和真實答案的概率分佈之間的距離了。
Softmax公式:

交叉熵公式:

交叉熵不是對稱的,H(x,y)不等於H(y,x),它刻畫的是通過概率分佈y來表達概率分佈x的困難程度,因為正確答案是希望得到的結果,所以當交叉熵作為神經網路的損失函式時,x代表的是正確答案,y代表的是預測值,交叉熵越小,表示兩個概率分佈越接近。

交叉熵公式:
cross_entropy = -tf.reduce_mean( y_ * tf.log(tf.clip_by_value(y,le-10, 1.0)))

利用softmax計算交叉熵
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, dim=-1, name=None)

與分類問題不同,迴歸問題解決的是對具體數值的預測,最常用的損失函式是均方差MSE
mse = tf.reduce_mean(tf.square(y_ - y))

對於一些特定問題,可以根據需要自定義損失函式,以解決實際問題。

④神經網路優化演算法
為了使模型在訓練資料上的損失函式儘可能的小,梯度下降演算法主要用於單個引數的取值,而反向傳播演算法演算法給出了一個在所有引數上使用梯度下降演算法的高效方式,在優化引數時,需要選擇合適的學習率來定義引數更新的幅度。
神經網路的優化過程可以分為兩個階段,第一個階段先通過前向傳播演算法計算的到預測值,並將預測值和真實值作對比的到兩者之間的差距。然後在第二階段通過反向傳播演算法計算損失函式對每一個引數的梯度,再根據梯度和學習率使用梯度下降演算法更新每一個引數。
需要注意的是,梯度下降演算法並不能保證被優化的函式達到全域性最優解,只有當損失函式為凸函式時,梯度下降演算法才能保證達到全域性最優解。
在海量訓練資料下,要計算所有訓練資料的損失函式是非常消耗時間的,為了加速訓練過程可以使用隨機梯度下降演算法。這個演算法不是在全部訓練資料上優化損失函式,是在每一輪迭代中,隨機優化某一條訓練資料上的損失函式,這樣能大大加快每一輪引數更新,但弊端在於這樣做可能達不到全部資料上損失函式最小,為了綜合梯度下降和隨機梯度下降演算法的優缺點,採用了batch的方式,每次計算一小部分訓練資料的損失函式,每次使用一個batch可以大大減小收斂所需的迭代次數,同時可以使收斂到的結果更接近梯度下降的效果。

⑤過擬合問題
實際問題中想要的並不是讓模型儘量模擬訓練資料的行為,而是希望通過訓練出來的模型對未知的資料給出判斷。所謂過擬合,指的是當一個模型過為複雜之後,它可以很好“記憶”每一個訓練資料中隨機噪音的部分而忘記了要去“學習”訓練資料中通用的趨勢。
為了避免過擬合問題,一個非常常用的方法是正則化(regularization)。正則化的思想就是在損失函式中加入刻畫模型複雜程度的指標。
以下程式碼給出了一個簡單的帶L2正則化的損失函式定義: