姓名:張慶慶
學(xué)號:19021211151
嵌牛導(dǎo)讀:機器學(xué)習(xí)計算機視覺的發(fā)展以及監(jiān)督學(xué)習(xí)席爽,神經(jīng)網(wǎng)絡(luò)的基本原理
?嵌牛鼻子:計算機視覺 監(jiān)督學(xué)習(xí) 神經(jīng)網(wǎng)絡(luò)
嵌牛提問:什么是計算機視覺筐付,神經(jīng)網(wǎng)絡(luò)及監(jiān)督學(xué)習(xí)的基本理論有哪些
轉(zhuǎn)載源:ImageNet冠軍領(lǐng)隊帶你入門計算機視覺:監(jiān)督學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)的簡單實現(xiàn) - 簡書
原作者 | 董健,原編輯 | Vincent
嵌牛正文:
AI 前線導(dǎo)語:近幾年歉备,人工智能的浪潮席卷了整個科技圈。Google匪燕,F(xiàn)acebook蕾羊,微軟,百度等全球最頂尖的科技公司都將目光轉(zhuǎn)向了人工智能帽驯,并將之視為今后的戰(zhàn)略重心龟再。 隨著人臉識別,輔助駕駛尼变,AlphaGo 等應(yīng)用的不斷涌現(xiàn)利凑,基于學(xué)習(xí)的計算機視覺(learning based vision)正在越來越多的改變我們的生活 。本系列文章嫌术,將逐步介紹這些看似神奇的系統(tǒng)背后的視覺算法原理哀澈。
本文是整個系列的第一篇文章,將會簡單介紹一下計算機視覺的發(fā)展度气,以及監(jiān)督學(xué)習(xí)割按、神經(jīng)網(wǎng)絡(luò)的基本原理。最后的實踐部分磷籍,會用 TensorFlow 給出之前介紹算法的一個簡單實現(xiàn)适荣。
計算機視覺的發(fā)展
什么是計算機視覺? 首先我們看一下維基百科的定義:
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 給他的本科學(xué)生留了一個暑期作業(yè) -“Link a camera to a computer and get the computer to describe what it saw”栅盲。 雖然人可以很容易的理解圖片汪诉,但事實證明,讓計算機理解圖片遠比我們一開始想象的復(fù)雜。
早期的計算機視覺研究扒寄,由于計算資源和數(shù)據(jù)的原因鱼鼓,主要集中在幾何和推理。 上世紀 90 年代该编,由于計算機硬件的不斷發(fā)展和數(shù)字照相機的逐漸普及迄本,計算機視覺進入了快速發(fā)展期。 這期間的一大突破是各種人工設(shè)計特征的涌現(xiàn)课竣,例如 SIFT嘉赎,HOG 等局部特征。 這些特征相對原始像素具有對尺度于樟,旋轉(zhuǎn)等的魯棒性公条,因此得到了廣泛的應(yīng)用,催生了如圖像拼接迂曲、圖像檢索靶橱、三位重建等視覺應(yīng)用。 另一大突破是基于統(tǒng)計和機器學(xué)習(xí)的方法的流行路捧。隨著數(shù)字照片的不斷普及关霸,大規(guī)模的數(shù)據(jù)集也相伴而生,基于學(xué)習(xí)的計算機視覺(Learning based Vision)杰扫,由于可以通過大量數(shù)據(jù)自動學(xué)習(xí)模型參數(shù)队寇,漸漸的成為了主流。
隨著計算能力的不斷進步和海量互聯(lián)網(wǎng)數(shù)據(jù)的產(chǎn)生章姓,傳統(tǒng)的基于人工特征和 SVM/boosting 等簡單機器學(xué)習(xí)算法的視覺技術(shù)遇到了瓶頸佳遣。因此,工業(yè)界和學(xué)術(shù)界都在探索如何避免繁瑣的人工特征設(shè)計同時加強模型的擬合性能凡伊,從而進一步利用海量數(shù)據(jù)苍日。深度學(xué)習(xí)很好的滿足了這一需求,因此在視覺領(lǐng)域得到了非常廣泛的應(yīng)用窗声。2010 年之后,計算機視覺逐漸進入了深度學(xué)習(xí)的時代辜纲。標志性的事件是 ImageNet 2012 比賽笨觅。這次比賽中,基于深度學(xué)習(xí)的算法大大超過了經(jīng)過精心設(shè)計的傳統(tǒng)算法耕腾,震驚了整個學(xué)術(shù)界见剩,進而帶動了深度學(xué)習(xí)在其他領(lǐng)域中的應(yīng)用。這次比賽也被看成是深度學(xué)習(xí)在整個人工智能領(lǐng)域復(fù)興的標志性事件扫俺。
目前苍苞,除了三維重建等 low-level vision 問題,基于深度學(xué)習(xí)的算法,在大多數(shù)視覺問題上的性能已經(jīng)遠遠超過了傳統(tǒng)算法羹呵,因此本系列文章會重點介紹基于深度學(xué)習(xí)的計算機視覺算法骂际。
神經(jīng)網(wǎng)絡(luò) (neural network)
神經(jīng)網(wǎng)絡(luò)(NN),簡單來說就是神經(jīng)元組成的網(wǎng)絡(luò)冈欢,是最早出現(xiàn)歉铝,也是最簡單的一種深度學(xué)習(xí)模型。其他很多更復(fù)雜的算法比如卷積神經(jīng)網(wǎng)絡(luò)凑耻,深度增強學(xué)習(xí)中的許多概念都來源于神經(jīng)網(wǎng)絡(luò)太示。因此,我們在這篇文章中先介紹一下神經(jīng)網(wǎng)絡(luò)的原理香浩。 要理解神經(jīng)網(wǎng)絡(luò)类缤,我們需要先了解什么是神經(jīng)元。
神經(jīng)元 & 感知器
神經(jīng)元(neuron)是神經(jīng)網(wǎng)絡(luò)的最小單位邻吭。每個神經(jīng)元將多個入映射到一個輸出餐弱。如圖所示,神經(jīng)元的輸出是輸入的加權(quán)和加上偏置镜盯,再通過一個激活函數(shù)岸裙。具體可以表示成:
激活函數(shù) φ 有各種不同的形式。如果使用 step 函數(shù)速缆,那神經(jīng)元等價于一個線性分類器:
這個分類器在歷史上被稱為感知器(Perceptron)降允。
多層神經(jīng)網(wǎng)絡(luò)
單層的感知器只能解決線性可分的問題。但實際中絕大多數(shù)問題都是非線性的艺糜,這時單層感知器就無能為力了剧董。 為此,我們可以把單個的 neuron 組成網(wǎng)絡(luò)破停,讓前一層 neuron 的輸出做為下一層 neuron 的輸入翅楼。組成如下圖所示的神經(jīng)網(wǎng)絡(luò):
由于非線性激活函數(shù)的存在,多層神經(jīng)網(wǎng)絡(luò)就有了擬合非線性函數(shù)的能力真慢。由于歷史的原因毅臊,多層神經(jīng)網(wǎng)絡(luò)也被稱為 multilayer perceptrons(MLP)。
神經(jīng)網(wǎng)絡(luò)具有擬合非線性函數(shù)的能力黑界。但是為了擬合不同的非線性函數(shù)管嬉,我們是否需要設(shè)計不同的非線性激活函數(shù)和網(wǎng)絡(luò)結(jié)構(gòu)呢?
答案是不需要朗鸠。
universal approximation theorem已經(jīng)證明蚯撩,前向神經(jīng)網(wǎng)絡(luò)是一個通用的近似框架。 簡單來說烛占,對常用的 sigmoid胎挎,relu 等激活函數(shù),即使只有一層隱藏層的神經(jīng)網(wǎng)絡(luò),只要有足夠多的神經(jīng)元犹菇,就可以無限逼近任何連續(xù)函數(shù)德迹。在實際中,淺層神經(jīng)網(wǎng)絡(luò)要逼近復(fù)雜非線性函數(shù)需要的神經(jīng)元可能會過多项栏,從而提升了學(xué)習(xí)的難度并影響泛化性能浦辨。因此,我們往往通過使用更深的模型沼沈,從而減少所需神經(jīng)元的數(shù)量流酬,提升網(wǎng)絡(luò)的泛化能力。
機器學(xué)習(xí)的基本概念
深度神經(jīng)網(wǎng)絡(luò)是深度學(xué)習(xí)中的一類算法列另,而深度學(xué)習(xí)是機器學(xué)習(xí)的一種特例芽腾。因此,這一節(jié)我們在機器學(xué)習(xí)的一般框架下页衙,介紹模型訓(xùn)練相關(guān)的基本概念摊滔,及其在 Tensorflow 中的實現(xiàn)。相關(guān)概念適用于包括 NN 在內(nèi)的機器學(xué)習(xí)算法店乐。
機器學(xué)習(xí)的常見問題
常見的機器學(xué)習(xí)問題艰躺,可以抽象為 4 大類問題:
1、監(jiān)督學(xué)習(xí)
2眨八、非監(jiān)督學(xué)習(xí)
3腺兴、半監(jiān)督學(xué)習(xí)
4、增強學(xué)習(xí)
根據(jù)訓(xùn)練數(shù)據(jù)是否有 label廉侧,可以將問題分為監(jiān)督學(xué)習(xí)(所有數(shù)據(jù)都有 label)页响,半監(jiān)督學(xué)習(xí)(部分數(shù)據(jù)有 label)和非監(jiān)督學(xué)習(xí)(所有數(shù)據(jù)都沒有 label)。 增強學(xué)習(xí)不同于前 3 種問題段誊,增強學(xué)習(xí)也會對行為給出反饋(reward)闰蚕,但關(guān)注的是如何在環(huán)境中采取一系列行為,從而獲得最大的累積回報连舍。監(jiān)督學(xué)習(xí)是目前應(yīng)用最廣泛没陡,也是研究最充分的機器學(xué)習(xí)問題,本文接下來將重點介紹監(jiān)督學(xué)習(xí)索赏。
監(jiān)督學(xué)習(xí)
在監(jiān)督學(xué)習(xí)中诗鸭,給定 N 個訓(xùn)練樣本
我們的目標是得到一個從輸入到輸出的函數(shù):
實際中,我們通常不會直接優(yōu)化函數(shù) f参滴,而是根據(jù)問題的具體情況,選擇一組參數(shù)化的函數(shù) fθ, 將優(yōu)化函數(shù) f 轉(zhuǎn)換成優(yōu)化參數(shù)θ锻弓。
常見的分類問題和回歸問題砾赔,都是監(jiān)督學(xué)習(xí)的一種特例。線性分類器,深度神經(jīng)網(wǎng)絡(luò)等模型暴心,都是為了解決這些問題設(shè)計的參數(shù)化后的函數(shù)妓盲。為了簡單,我們以線性分類器
為例专普,需要優(yōu)化的參數(shù)θ為 (w,b)悯衬。
損失函數(shù)
為了衡量函數(shù)的好壞,我們需要一個客觀的標準檀夹。 在監(jiān)督學(xué)習(xí)中筋粗,這個評判標準通常是一個損失函數(shù)
對一個訓(xùn)練樣本
模型的預(yù)測結(jié)果為 y^,那對應(yīng)的損失為
損失越小炸渡,表明函數(shù)預(yù)測的結(jié)果越準確娜亿。實際中,需要根據(jù)問題的特點蚌堵,選擇不同的損失函數(shù)买决。
二分類問題中,常用的 logistic regression 采用 sigmoid + cross entroy 作為 loss吼畏。對常見的 loss督赤,tensorflow 都提供了相應(yīng)的函數(shù)。
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=labels, logits=y)
對多分類問題泻蚊,如上圖所示躲舌,我們可以將二分類的線性分類器進行擴展為 N 個線性方程:
然后通過
進行歸一化,歸一化后的結(jié)果作為每一類的概率藕夫。因此孽糖,多分類通常使用 softmax + cross entropy 作為損失函數(shù)。
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瑰煎,這主要是從數(shù)值穩(wěn)定性的角度考慮的铺然。
損失最小化和正則項
在定義了損失函數(shù)之后,監(jiān)督學(xué)習(xí)問題可以轉(zhuǎn)化為最小化實驗損失
實際中酒甸,為了保證模型的擬合能力魄健,函數(shù) $f$ 的復(fù)雜度有時會比較高。如最圖中最右邊情況所示插勤,如果訓(xùn)練樣本數(shù)較少或者 label 有錯誤時沽瘦,直接最小化實驗損失而不對 $f$ 加限制的話革骨,模型容易過擬合。
因此析恋,在樣本數(shù)量較少或者標注質(zhì)量不高的情況下良哲,需要額外添加正則項(regularizer),保證模型的泛化能力助隧。實際中根據(jù)不同需求筑凫,可以選擇不同的正則項。在神經(jīng)網(wǎng)絡(luò)當中并村,比較常見的是 l2 norm 正則項:
在 tensorflow 中巍实,通常有兩種方法添加正則項。一種是根據(jù)需要橘霎,自己實現(xiàn)相應(yīng)的 regularization loss蔫浆,然后和其他 loss 相加進行優(yōu)化。這種方法可以實現(xiàn)比較復(fù)雜的 regularizer姐叁。
weight_decay = tf.multiply(tf.nn.l2_loss(weights),
wd, name='weight_loss')
對于常見的正則項瓦盛,也可以使用 tensorflow 自帶的功能,對相應(yīng)的變量進行正則化外潜。然后將系統(tǒng)生成的所有 regularization loss 和其他 loss 相加進行優(yōu)化原环。
tf.contrib.layers.apply_regularization(
tf.contrib.layers.l2_regularizer(wd), weights)
tf.losses.get_regularization_losses()
梯度下降和反向傳播
在定義了損失函數(shù)和正則項之后,最終正則化后的 loss 為:
有了 loss 函數(shù)处窥,相應(yīng)的參數(shù)可以通過標準的梯度下降算法進行優(yōu)化求解嘱吗。例如對線性分類器中的 $w$,可以通過如下的公式進行迭代更新:
通過設(shè)定合適的 learning rate滔驾,參數(shù)會逐步收斂到局部 / 全局最優(yōu)解谒麦。
反向傳播可以看成梯度下降在神經(jīng)網(wǎng)絡(luò)中的一個推廣,也是通過最小化 loss 函數(shù)哆致,計算參數(shù)相對于 loss 的梯度绕德,然后對參數(shù)進行迭代更新。具體的推導(dǎo)因為篇幅原因在這里略過了摊阀。在 tensorflow 中耻蛇,只需要指定 loss 函數(shù)和步長(learning rate),optimizer 可以自動幫我們完成梯度下降 / 反向傳播的過程:
tf.train.GradientDescentOptimizer(
learning_rate).minimize(loss)
OCR 實戰(zhàn)
最后本文通過一個 OCR 的例子胞此,展示如何用 Tensorflow 實現(xiàn) Softmax 分類器和 MLP 分類器臣咖。實驗數(shù)據(jù)集采用著名的數(shù)字識別數(shù)據(jù)集 MNIST。該數(shù)據(jù)集包含了 60000 張訓(xùn)練圖片和 10000 張測試圖片漱牵。數(shù)據(jù)集中的每一張圖片都代表了 0-9 中的一個數(shù)字夺蛇,圖片的尺寸為 28×28。
Softmax 分類器
我們首先實現(xiàn)一個簡單的 Softmax 分類器酣胀。由于 Tensorflow 運行構(gòu)建好的網(wǎng)絡(luò)的過程比較復(fù)雜蚊惯,為了提高開發(fā)效率和代碼的復(fù)用性愿卸,我們將代碼分成了 3 個主要模塊,分別是 Dataset 模塊截型,Net 模塊和 Solver 模塊。
模型結(jié)構(gòu)
對每一個 Net 類里儒溉,我們需要實現(xiàn)三個函數(shù):
1宦焦、inference
我們在 inference 函數(shù)中定義網(wǎng)絡(luò)的主體結(jié)構(gòu)。在 tensorflow 中顿涣,變量用 tf.Variable 表示波闹。因為 Softmax 分類器是一個凸函數(shù),任何初始化都可以保證達到全局最優(yōu)解涛碑,因此我們可以簡單的將W和b初始化為 0精堕。 Softmax 分類器可以簡單的通過一個矩陣乘法y = tf.matmul(data, W) + b后接一個tf.nn.softmax函數(shù)實現(xiàn)。
2蒲障、loss
按照之前介紹的歹篓,為了保證數(shù)值穩(wěn)定性,我們直接采用直接計算tf.nn.softmax_cross_entropy_with_logits的方式揉阎。
3庄撮、metric
在訓(xùn)練完模型后,我們需要在 validation 或 test 集合上驗證模型的性能毙籽。在測試集比較大時洞斯,我們無法一次得到模型在整個測試集上的結(jié)果,需要將測試集分成小的 batch坑赡,在每個 batch 上進行測試烙如,之后將每個 batch 的結(jié)果匯總起來。 為此毅否,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徐许,代碼結(jié)構(gòu)簡潔了很多施蜜。所以我們在 Dataset 類中采用了新的 API,實現(xiàn)數(shù)據(jù)讀取雌隅。
我們首先讀取了 numpy.array 格式的 mnist 數(shù)據(jù)集images翻默, labels缸沃。然后通過tf.contrib.data.Dataset.from_tensor_slices將之轉(zhuǎn)換成 tf.contrib.data.Dataset 格式。之后我們可以設(shè)置對 Dataset 的遍歷次數(shù)(None 代表無限次)修械,batch size 以及是否對數(shù)據(jù)集進行 shuffle趾牧。 最后,我們采用最簡單的make_one_shot_iterator()和get_next()肯污,得到網(wǎng)絡(luò)的基本數(shù)據(jù)單元 batch翘单。 按默認配置,每個 batch 含有 50 張圖和其對應(yīng)的 label蹦渣。
Solver
最后我們介紹 Sover 類哄芜。Solver 類主要包含五個函數(shù):
1、build_optimizer
因為網(wǎng)絡(luò)比較簡單柬唯,這里我們選用最基本的隨即梯度下降算法tf.train.GradientDescentOptimizer认臊,并使用了固定的 learning rate。
2锄奢、build_train_net失晴、build_test_net
這兩個函數(shù)的作用類似,都是將 Dataset 中的數(shù)據(jù)和 Net 中的網(wǎng)絡(luò)結(jié)構(gòu)串聯(lián)起來斟薇。在最后我們調(diào)用tf.summary.scalar將 loss 添加到 summary 中师坎。 tensorflow 提供了強大的可視化模塊 tensorboard,可以很方便的對 summary 中的變量進行可視化堪滨。
3胯陋、train_net
在 train_net 的開頭,我們完成了 Graph袱箱,Saver遏乔,summary 等模塊的初始化。 然后通過summary_writer.add_graph(tf.get_default_graph())发笔,將網(wǎng)絡(luò)結(jié)構(gòu)打印到 summary 中盟萨。
之后初始化tf.Session(),并通過session.run運行對應(yīng)的操作了讨。在 tensorflow 使用了符號式編程的模式捻激,創(chuàng)建 Graph 的過程只是完成了構(gòu)圖,并沒有對數(shù)據(jù)進行實際運算前计。在 Session 中運行對應(yīng)的操作時胞谭,才真正對底層數(shù)據(jù)進行操作。
4男杈、test_net
和 train_net 類似丈屹,test_net 主要完成了各種模塊的初始化,之后讀取模型目錄文件下的 checkpoint 文件中記錄的最新的模型伶棒,并在測試集中進行測試旺垒。
下圖是 tensorboad 中可視化的網(wǎng)絡(luò)結(jié)構(gòu)彩库,和 loss 的統(tǒng)計∠冉可以看到骇钦,tensorboad 對我們進行分析提供很好的可視化支持。
最終程序的輸出結(jié)果如下:
可以看到竞漾,一個簡單的線性模型可以達到 92% 的準確率司忱。我們猜測數(shù)字識別這個問題應(yīng)該不是線性可分,因此使用更復(fù)雜的非線性分類器應(yīng)該可以得到更好的結(jié)果畴蹭。
MLP 分類器
由于我們采用了模塊化的設(shè)計,各個模塊直接基本是解耦合的鳍烁。因此將 Softmax 分類器替換成 MLP 非常容易叨襟,我們只需要重新實現(xiàn) Net 層就可以了。
為了證明 MLP 的效果幔荒,我們構(gòu)造了一個含有 2 層 hidden layer 的神經(jīng)網(wǎng)絡(luò)糊闽。代碼結(jié)構(gòu)和 Softmax 分類其大致一樣,就不做過多解釋了爹梁。 因為線性層在網(wǎng)絡(luò)中多次出現(xiàn)右犹,我們將他抽象為一個可以復(fù)用的函數(shù)。 另外姚垃,為了讓 graph 在 tensorboad 中的可視化效果更好念链,我們將相關(guān)的變量和操作,通過with tf.variable_scope('hidden1'):放置在同一個 variable_scope 下面积糯。這樣所有相關(guān)變量和操作在 tensorboad 都會收縮成一個可以展開的節(jié)點掂墓,從而提供更好的可視化效果。
最終的網(wǎng)絡(luò)結(jié)果和運行結(jié)果如下所示:
可以看到看成,使用了包含 2 層 hidden layer 的簡單神經(jīng)網(wǎng)絡(luò)君编,分類的準確率已經(jīng)提升到了 97%,大大優(yōu)于簡單的線性分類器川慌。證明了模型選擇對最終性能的重要影響吃嘿。
完整代碼下載:
https://github.com/Dong--Jian/Vision-Tutorial
嵌牛總結(jié):本文重點介紹了計算機視覺的基本概念梦重,以及神經(jīng)網(wǎng)絡(luò)抚芦,監(jiān)督學(xué)習(xí)的基本理論,希望對學(xué)習(xí)深度學(xué)習(xí)的你有所幫助紊搪。