ImageNet冠軍領隊帶你入門計算機視覺:監督學習與神經網絡的簡單實現

姓名:張慶慶

學號:19021211151

嵌牛導讀:機器學習計算機視覺的發展以及監督學習,神經網絡的基本原理

?嵌牛鼻子:計算機視覺 監督學習 神經網絡

嵌牛提問:什么是計算機視覺,神經網絡及監督學習的基本理論有哪些

轉載源:ImageNet冠軍領隊帶你入門計算機視覺:監督學習與神經網絡的簡單實現 - 簡書

原作者 | 董健,原編輯 | Vincent

嵌牛正文:

AI 前線導語:近幾年,人工智能的浪潮席卷了整個科技圈。Google,Facebook,微軟,百度等全球最頂尖的科技公司都將目光轉向了人工智能,并將之視為今后的戰略重心。 隨著人臉識別,輔助駕駛,AlphaGo 等應用的不斷涌現,基于學習的計算機視覺(learning based vision)正在越來越多的改變我們的生活 。本系列文章,將逐步介紹這些看似神奇的系統背后的視覺算法原理。

本文是整個系列的第一篇文章,將會簡單介紹一下計算機視覺的發展,以及監督學習、神經網絡的基本原理。最后的實踐部分,會用 TensorFlow 給出之前介紹算法的一個簡單實現。

計算機視覺的發展

什么是計算機視覺? 首先我們看一下維基百科的定義:

Computer vision is an interdisciplinary field that deals with how computers can be made for gaining high-level understanding from digital images or videos.

簡單來說,計算機視覺就是讓機器能自動的理解圖片或視頻。

計算機視覺的起源可以追溯到 1966 年,當時 MIT 著名的工智能專家 Marvin Minsky 給他的本科學生留了一個暑期作業 -“Link a camera to a computer and get the computer to describe what it saw”。 雖然人可以很容易的理解圖片,但事實證明,讓計算機理解圖片遠比我們一開始想象的復雜。

早期的計算機視覺研究,由于計算資源和數據的原因,主要集中在幾何和推理。 上世紀 90 年代,由于計算機硬件的不斷發展和數字照相機的逐漸普及,計算機視覺進入了快速發展期。 這期間的一大突破是各種人工設計特征的涌現,例如 SIFT,HOG 等局部特征。 這些特征相對原始像素具有對尺度,旋轉等的魯棒性,因此得到了廣泛的應用,催生了如圖像拼接、圖像檢索、三位重建等視覺應用。 另一大突破是基于統計和機器學習的方法的流行。隨著數字照片的不斷普及,大規模的數據集也相伴而生,基于學習的計算機視覺(Learning based Vision),由于可以通過大量數據自動學習模型參數,漸漸的成為了主流。

隨著計算能力的不斷進步和海量互聯網數據的產生,傳統的基于人工特征和 SVM/boosting 等簡單機器學習算法的視覺技術遇到了瓶頸。因此,工業界和學術界都在探索如何避免繁瑣的人工特征設計同時加強模型的擬合性能,從而進一步利用海量數據。深度學習很好的滿足了這一需求,因此在視覺領域得到了非常廣泛的應用。2010 年之后,計算機視覺逐漸進入了深度學習的時代。標志性的事件是 ImageNet 2012 比賽。這次比賽中,基于深度學習的算法大大超過了經過精心設計的傳統算法,震驚了整個學術界,進而帶動了深度學習在其他領域中的應用。這次比賽也被看成是深度學習在整個人工智能領域復興的標志性事件。

目前,除了三維重建等 low-level vision 問題,基于深度學習的算法,在大多數視覺問題上的性能已經遠遠超過了傳統算法,因此本系列文章會重點介紹基于深度學習的計算機視覺算法。

神經網絡 (neural network)

神經網絡(NN),簡單來說就是神經元組成的網絡,是最早出現,也是最簡單的一種深度學習模型。其他很多更復雜的算法比如卷積神經網絡,深度增強學習中的許多概念都來源于神經網絡。因此,我們在這篇文章中先介紹一下神經網絡的原理。 要理解神經網絡,我們需要先了解什么是神經元。

神經元 & 感知器

神經元(neuron)是神經網絡的最小單位。每個神經元將多個入映射到一個輸出。如圖所示,神經元的輸出是輸入的加權和加上偏置,再通過一個激活函數。具體可以表示成:

激活函數 φ 有各種不同的形式。如果使用 step 函數,那神經元等價于一個線性分類器:

這個分類器在歷史上被稱為感知器(Perceptron)。

多層神經網絡

單層的感知器只能解決線性可分的問題。但實際中絕大多數問題都是非線性的,這時單層感知器就無能為力了。 為此,我們可以把單個的 neuron 組成網絡,讓前一層 neuron 的輸出做為下一層 neuron 的輸入。組成如下圖所示的神經網絡:

由于非線性激活函數的存在,多層神經網絡就有了擬合非線性函數的能力。由于歷史的原因,多層神經網絡也被稱為 multilayer perceptrons(MLP)。

神經網絡具有擬合非線性函數的能力。但是為了擬合不同的非線性函數,我們是否需要設計不同的非線性激活函數和網絡結構呢?

答案是不需要。

universal approximation theorem已經證明,前向神經網絡是一個通用的近似框架。 簡單來說,對常用的 sigmoid,relu 等激活函數,即使只有一層隱藏層的神經網絡,只要有足夠多的神經元,就可以無限逼近任何連續函數。在實際中,淺層神經網絡要逼近復雜非線性函數需要的神經元可能會過多,從而提升了學習的難度并影響泛化性能。因此,我們往往通過使用更深的模型,從而減少所需神經元的數量,提升網絡的泛化能力。

機器學習的基本概念

深度神經網絡是深度學習中的一類算法,而深度學習是機器學習的一種特例。因此,這一節我們在機器學習的一般框架下,介紹模型訓練相關的基本概念,及其在 Tensorflow 中的實現。相關概念適用于包括 NN 在內的機器學習算法。

機器學習的常見問題

常見的機器學習問題,可以抽象為 4 大類問題:

1、監督學習

2、非監督學習

3、半監督學習

4、增強學習

根據訓練數據是否有 label,可以將問題分為監督學習(所有數據都有 label),半監督學習(部分數據有 label)和非監督學習(所有數據都沒有 label)。 增強學習不同于前 3 種問題,增強學習也會對行為給出反饋(reward),但關注的是如何在環境中采取一系列行為,從而獲得最大的累積回報。監督學習是目前應用最廣泛,也是研究最充分的機器學習問題,本文接下來將重點介紹監督學習。

監督學習

在監督學習中,給定 N 個訓練樣本

我們的目標是得到一個從輸入到輸出的函數:

實際中,我們通常不會直接優化函數 f,而是根據問題的具體情況,選擇一組參數化的函數 fθ, 將優化函數 f 轉換成優化參數θ。

常見的分類問題和回歸問題,都是監督學習的一種特例。線性分類器,深度神經網絡等模型,都是為了解決這些問題設計的參數化后的函數。為了簡單,我們以線性分類器

為例,需要優化的參數θ為 (w,b)。

損失函數

為了衡量函數的好壞,我們需要一個客觀的標準。 在監督學習中,這個評判標準通常是一個損失函數

對一個訓練樣本

模型的預測結果為 y^,那對應的損失為

損失越小,表明函數預測的結果越準確。實際中,需要根據問題的特點,選擇不同的損失函數。

二分類問題中,常用的 logistic regression 采用 sigmoid + cross entroy 作為 loss。對常見的 loss,tensorflow 都提供了相應的函數。

loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=y)

對多分類問題,如上圖所示,我們可以將二分類的線性分類器進行擴展為 N 個線性方程:

然后通過

進行歸一化,歸一化后的結果作為每一類的概率。因此,多分類通常使用 softmax + cross entropy 作為損失函數。

loss = tf.nn.softmax_cross_entropy_with_logits(

labels=labels, logits=logits)

可以證明,對于二分類問題,采用 sigmoid cross entroy 和 softmax cross entory 作為 loss,在理論上是完全等價的。此外,實際中通常采用直接計算 softmax cross entropy 而不是先計算 softmax,后計算 cross entory,這主要是從數值穩定性的角度考慮的。

損失最小化和正則項

在定義了損失函數之后,監督學習問題可以轉化為最小化實驗損失

實際中,為了保證模型的擬合能力,函數 $f$ 的復雜度有時會比較高。如最圖中最右邊情況所示,如果訓練樣本數較少或者 label 有錯誤時,直接最小化實驗損失而不對 $f$ 加限制的話,模型容易過擬合。

因此,在樣本數量較少或者標注質量不高的情況下,需要額外添加正則項(regularizer),保證模型的泛化能力。實際中根據不同需求,可以選擇不同的正則項。在神經網絡當中,比較常見的是 l2 norm 正則項:

在 tensorflow 中,通常有兩種方法添加正則項。一種是根據需要,自己實現相應的 regularization loss,然后和其他 loss 相加進行優化。這種方法可以實現比較復雜的 regularizer。

weight_decay = tf.multiply(tf.nn.l2_loss(weights),

wd, name='weight_loss')

對于常見的正則項,也可以使用 tensorflow 自帶的功能,對相應的變量進行正則化。然后將系統生成的所有 regularization loss 和其他 loss 相加進行優化。

tf.contrib.layers.apply_regularization(

tf.contrib.layers.l2_regularizer(wd), weights)

tf.losses.get_regularization_losses()

梯度下降和反向傳播

在定義了損失函數和正則項之后,最終正則化后的 loss 為:

有了 loss 函數,相應的參數可以通過標準的梯度下降算法進行優化求解。例如對線性分類器中的 $w$,可以通過如下的公式進行迭代更新:

通過設定合適的 learning rate,參數會逐步收斂到局部 / 全局最優解。

反向傳播可以看成梯度下降在神經網絡中的一個推廣,也是通過最小化 loss 函數,計算參數相對于 loss 的梯度,然后對參數進行迭代更新。具體的推導因為篇幅原因在這里略過了。在 tensorflow 中,只需要指定 loss 函數和步長(learning rate),optimizer 可以自動幫我們完成梯度下降 / 反向傳播的過程:

tf.train.GradientDescentOptimizer(

learning_rate).minimize(loss)

OCR 實戰

最后本文通過一個 OCR 的例子,展示如何用 Tensorflow 實現 Softmax 分類器和 MLP 分類器。實驗數據集采用著名的數字識別數據集 MNIST。該數據集包含了 60000 張訓練圖片和 10000 張測試圖片。數據集中的每一張圖片都代表了 0-9 中的一個數字,圖片的尺寸為 28×28。

Softmax 分類器

我們首先實現一個簡單的 Softmax 分類器。由于 Tensorflow 運行構建好的網絡的過程比較復雜,為了提高開發效率和代碼的復用性,我們將代碼分成了 3 個主要模塊,分別是 Dataset 模塊,Net 模塊和 Solver 模塊。

模型結構

對每一個 Net 類里,我們需要實現三個函數:

1、inference

我們在 inference 函數中定義網絡的主體結構。在 tensorflow 中,變量用 tf.Variable 表示。因為 Softmax 分類器是一個凸函數,任何初始化都可以保證達到全局最優解,因此我們可以簡單的將W和b初始化為 0。 Softmax 分類器可以簡單的通過一個矩陣乘法y = tf.matmul(data, W) + b后接一個tf.nn.softmax函數實現。

2、loss

按照之前介紹的,為了保證數值穩定性,我們直接采用直接計算tf.nn.softmax_cross_entropy_with_logits的方式。

3、metric

在訓練完模型后,我們需要在 validation 或 test 集合上驗證模型的性能。在測試集比較大時,我們無法一次得到模型在整個測試集上的結果,需要將測試集分成小的 batch,在每個 batch 上進行測試,之后將每個 batch 的結果匯總起來。 為此,tensorflow 提供了 tf.metrics 模塊,可以自動完成對每個 batch 進行評價,并將所有的評價匯總的功能。在這個例子里,我們是解決分類問題,因此可以使用tf.metrics.accuracy計算分類的準確率。

Dataset

In versions of TensorFlow before 1.2, we recommended using multi-threaded, queue-based input pipelines for performance. Beginning with TensorFlow 1.2, however, we recommend using the tf.contrib.data module instead.

從 Tensorflow1.2 開始,Tensorflow 提供了基于 tf.contrib.data 的新 API。相比原來基于 QuequRunner 和 Coordinator 的 API,代碼結構簡潔了很多。所以我們在 Dataset 類中采用了新的 API,實現數據讀取。

我們首先讀取了 numpy.array 格式的 mnist 數據集images, labels。然后通過tf.contrib.data.Dataset.from_tensor_slices將之轉換成 tf.contrib.data.Dataset 格式。之后我們可以設置對 Dataset 的遍歷次數(None 代表無限次),batch size 以及是否對數據集進行 shuffle。 最后,我們采用最簡單的make_one_shot_iterator()和get_next(),得到網絡的基本數據單元 batch。 按默認配置,每個 batch 含有 50 張圖和其對應的 label。

Solver

最后我們介紹 Sover 類。Solver 類主要包含五個函數:

1、build_optimizer

因為網絡比較簡單,這里我們選用最基本的隨即梯度下降算法tf.train.GradientDescentOptimizer,并使用了固定的 learning rate。

2、build_train_net、build_test_net

這兩個函數的作用類似,都是將 Dataset 中的數據和 Net 中的網絡結構串聯起來。在最后我們調用tf.summary.scalar將 loss 添加到 summary 中。 tensorflow 提供了強大的可視化模塊 tensorboard,可以很方便的對 summary 中的變量進行可視化。

3、train_net

在 train_net 的開頭,我們完成了 Graph,Saver,summary 等模塊的初始化。 然后通過summary_writer.add_graph(tf.get_default_graph()),將網絡結構打印到 summary 中。

之后初始化tf.Session(),并通過session.run運行對應的操作。在 tensorflow 使用了符號式編程的模式,創建 Graph 的過程只是完成了構圖,并沒有對數據進行實際運算。在 Session 中運行對應的操作時,才真正對底層數據進行操作。

4、test_net

和 train_net 類似,test_net 主要完成了各種模塊的初始化,之后讀取模型目錄文件下的 checkpoint 文件中記錄的最新的模型,并在測試集中進行測試。

下圖是 tensorboad 中可視化的網絡結構,和 loss 的統計。可以看到,tensorboad 對我們進行分析提供很好的可視化支持。

最終程序的輸出結果如下:

可以看到,一個簡單的線性模型可以達到 92% 的準確率。我們猜測數字識別這個問題應該不是線性可分,因此使用更復雜的非線性分類器應該可以得到更好的結果。

MLP 分類器

由于我們采用了模塊化的設計,各個模塊直接基本是解耦合的。因此將 Softmax 分類器替換成 MLP 非常容易,我們只需要重新實現 Net 層就可以了。

為了證明 MLP 的效果,我們構造了一個含有 2 層 hidden layer 的神經網絡。代碼結構和 Softmax 分類其大致一樣,就不做過多解釋了。 因為線性層在網絡中多次出現,我們將他抽象為一個可以復用的函數。 另外,為了讓 graph 在 tensorboad 中的可視化效果更好,我們將相關的變量和操作,通過with tf.variable_scope('hidden1'):放置在同一個 variable_scope 下面。這樣所有相關變量和操作在 tensorboad 都會收縮成一個可以展開的節點,從而提供更好的可視化效果。

最終的網絡結果和運行結果如下所示:

可以看到,使用了包含 2 層 hidden layer 的簡單神經網絡,分類的準確率已經提升到了 97%,大大優于簡單的線性分類器。證明了模型選擇對最終性能的重要影響。

完整代碼下載:

https://github.com/Dong--Jian/Vision-Tutorial

嵌牛總結:本文重點介紹了計算機視覺的基本概念,以及神經網絡,監督學習的基本理論,希望對學習深度學習的你有所幫助。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容