深度學習|Tensorflow圖像識別基礎(一)

    學了有一段時間的圖像識別的相關知識,始終不得入門,最近纔有所心得。在這裏做一點頭腦筆記。

    環境安裝配置

    首先我們要配置tensorflow的開發環境,爲什麼要用tensorflow,跟着谷歌爸爸就不會錯滴。安裝python的集成環境Anaconda3,創建一個叫tensorflow的虛擬運行環境,同時安裝python3.5這個坑不知道有沒有人遇到,我本來按的是2.7版本的,然後改成最新3.6,都不支持tensorflow,後來我看到有博主說tensorflow只支持3.5,我也不知道真假,反正3.5是沒問題)。

    選PyCharm作爲IDE注意,在setting下選擇Project Interpreter 選擇python.exe是,要選擇tensorflow虛擬環境下的python.exe,位置在envs/tensorflow/python.exe, 這個坑我也踩過。當你import tensorflow as tf不會報錯就沒問題了。

    MINST數據模型

    我們都知道手寫數字MINST是機器學習的Hello World,就以這個爲例簡單體驗一下。

    導入數據:由於tensorflow裏面有這個數據集,我們就不用在網上去下載了,很多老的博客都說去下載,別信。

    兩行代碼:

from tensorflow.examples.tutorials.mnist import input_data

# Get MNIST Data
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

    我們先不弄CNN的,簡單版本的來試下水。

    首先,我們要搞清楚我們研究的問題本質是什麼,我們要區分0到9這十個手寫字,解決方法是構建一個模型來訓練,然後這個訓練後的模型可以區分新的圖片。難點在於模型如何構建?如何判斷這個模型是好是壞?

    我們要明白,我們無法做到準確判斷,只能給出概率,相信你可以理解。還有一點,這本質是一個線性迴歸的問題,相信也可以理解。所以這個模型構建就很容易理解了,就是一個函數 y=wx+b,w叫權重,b叫做偏置項。我們要做的工作就是找到一個很棒的w和b, 有人說機器學習就是調參的過程,我深以爲然。當然如果你運氣好,一步到位,接下來的工作就不用做了,不過這可是玄學,還是老實點來優化你的參數吧。

    實現迴歸模型y=wx+b,y是要輸出的,x就是我們需要輸入的,我們輸入的是一張張圖片,當然直接是無法計算的,所以用像素來計算,每張圖片是 28 x 28 像素,即 784 個像素點,我們可以把它展開形成一個向量,即長度爲 784 的向量。訓練集我們可以轉化爲 [55000, 784] 的向量。具體怎麼算,詳看代碼。然後我們需要有一個指標來評估我們模型是好是壞啊,它就是成本或者損失。損失越小當然我們模型也就越棒。

    非常漂亮的成本函數是“交叉熵”。交叉熵產生於信息論裏面的信息壓縮編碼技術,但是它後來演變成爲從博弈論到機器學習等其他領域裏的重要技術手段。信息論中的熵是指信息不確定性的度量。熵越高代表爲了呈現某個事物所需要的信息量就越多。熵的值都是基於概率的,其概率解釋是:當某些事物在樣本空間中的佔比率越高,則需要將他描述出來的信息量越少。而交叉熵計算公式爲

                                                                          

    具體可以自行百度,現在你只需要知道它是用來計算損失函數的,我們怎麼讓這個損失變得最小呢,這裏用到經典的梯度下降法,tensorflow 只需將每個變量一點點地往使成本不斷降低的方向移動即可

    有一個問題,無論是我們訓練還是最後識別的時候,我們計算出的線性輸出可能不是一個0到1之間的概率(且所有概率之和爲1),比如計算出來的是2.2,4.3,-1.1,怎麼會有負數,這很有可能。用Softmax 可以解決,它可以看成是一個激勵函數或者鏈接函數,把我們定義的線性函數的輸出轉換成我們想要的格式,也就是關於 10 個數字類的概率分佈

                                                                                 

    Softmax 的過程首先會對各個值進行次冪計算,然後計算各個次冪結果佔總次冪結果的比重,所以這樣我們就可以實現差別的放縮,即好的更好、差的更差。

    接下來運行設置好了模型,我們把它放到 Session 裏面運行,之後然後可以測試這個模型。詳看代碼。最後可以看看你模型的準確率。

    還有一個問題就是爲什麼有訓練集、測試集,還有驗證集呢對原始數據進行三個數據集的劃分,也是爲了防止模型過擬合。過擬合是什麼呢,就是在訓練的時候表現很好,真正測試的時候呢,就錯誤百出。訓練集和測試集很好理解,而驗證集就是當通過訓練集訓練出多個模型後,爲了能找出效果最佳的模型,使用各個模型對驗證集數據進行預測,並記錄模型準確率。選出效果最佳的模型所對應的參數,即用來調整模型參數。

    最終的結果還是找出一個最佳的參數,而廢了這麼大勁。不過這也是前人優秀的經驗,值得讚揚。

    下一篇總結使用卷積神經網絡CNN來訓練模型,是的,厲害的還在後面。


    

發佈了45 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章