其實(shí)tensorflow圖像識別的問題并不復(fù)雜,但是又很多的朋友都不太了解tensorflow簡單圖片分類,因此呢,今天小編就來為大家分享tensorflow圖像識別的一些知識,希望可以幫助到大家,下面我們一起來看看這個問題的分析吧!
AI人工智能技術(shù)是通過怎樣的方式實(shí)現(xiàn)人臉識別和圖片識別的
用通俗的話總的來說,就是利用大數(shù)據(jù)抽取規(guī)律,再利用規(guī)律去預(yù)測(回歸)、分類、聚類未知的輸入,得到輸出(結(jié)果)。
單說圖片識別:
這里面的大數(shù)據(jù)就是已知的輸入(圖片)和已知的結(jié)果(圖片的標(biāo)簽),抽取規(guī)律也就是相應(yīng)的算法(卷及神經(jīng)網(wǎng)絡(luò)),預(yù)測、分類、聚類就是得到圖片的結(jié)果(圖片識別)。
可以分為以下幾步:
第一步:數(shù)據(jù)的預(yù)處理。
圖片是由一個一個的像素組成的,就拿入門的案例說吧,MNIST數(shù)據(jù)集,是一個手寫數(shù)字的數(shù)據(jù)集,每一張圖片都是由28×28個像素點(diǎn)形成的。
就像這樣:
總共有60000張這樣的圖片,而圖片的標(biāo)簽(也就是結(jié)果)也是已知的(0~9),那么設(shè)輸入為x輸出為y,
計算機(jī)是無法讀懂圖片的,所以我們要將圖片轉(zhuǎn)換成計算機(jī)所能認(rèn)識的東東。
矩陣:
x就是一個28×28的矩陣每一個點(diǎn)表示圖片中相應(yīng)位置的灰度。有的神經(jīng)網(wǎng)絡(luò)為了更簡化的計算,將28×28的矩陣,轉(zhuǎn)換為一個1×784的向量(一維矩陣)。這里的x是28×28×1,這個1表示的是單通道,也就是只有一種顏色。如果是彩色圖片的話,那么就應(yīng)該是28×28×3,這個3表示的是RGB三個顏色通道。
y就是一個數(shù)字,0~9。
有些算法還會降x,y進(jìn)行歸一化,也就是轉(zhuǎn)換為0~1之間的矩陣、數(shù)字。
第二步:抽取特征。
卷積(特征提取)的具體計算方法:
其中input為輸入,filter叫做卷積核(暫且理解為濾波器),output叫做特征圖,特征圖的個數(shù)和filter的個數(shù)是相同的(filterW0、filterW1)。既然是矩陣,那么可以設(shè)中間的參數(shù)是W,于是就有Wx+b=output。這里的W是我們最終要訓(xùn)練出來的。
計算方法:
w0與x藍(lán)色區(qū)域做內(nèi)積(對應(yīng)位置相乘后相加):
f1第1層=0×1+0×1+0×1+0×-1+1×-1+1×0+0×-1+1×1+1×0=0
f1第2層=0×-1+0×-1+0×1+0×-1+0×1+1×0+0×-1+2×1+2×0=2
f1第3層=0×1+0×0+0×-1+0×0+2×0+2×0+0×1+0×-1+0×-1+=0
那么根據(jù)神經(jīng)網(wǎng)絡(luò)得分函數(shù):f(x,w)=wx+b
這里的b=1
那么輸出的得分值就為f1+f2+f3+b=0+2+0+1=3
最右邊綠色的矩陣第1行,第1列,就是3
將卷積核在輸入矩陣滑動,
同理可以計算
這里的輸出叫做特征圖。
這里就可以看出,經(jīng)過卷積核Filter(濾波器),將圖片濃縮了,濃縮之后,再進(jìn)行一次非線性的處理,用一些非線性的函數(shù)將線性結(jié)果非線性化(叫做激活函數(shù)),這層叫作卷積層。
這里只是一層,大型數(shù)據(jù)集(輸入很多的情況)一層是不夠的,需要很多層,輸入-卷積-輸出-卷積-輸出........。
比如VGG-16,就有16個卷積層。
進(jìn)一步濃縮叫做池化層。
同樣有一個filter,將特征圖進(jìn)行MAX(取最大值)或者M(jìn)EAN(取均值),進(jìn)一步濃縮特征。
濃縮完特征之后,接著后面的層叫做全連接層。
就是將權(quán)重參數(shù)W(矩陣),分別乘以池化完成的結(jié)果,得到最終的分類結(jié)果比如前邊所說的0~9的手寫字體,要分10個類別,如果池化完成的結(jié)果是1×64,那么全連接層就應(yīng)該是64×10,最終得到1×10的矩陣,就是分類0~9的結(jié)果。
以上最重要的就是要求W,也就是最前邊說的,根據(jù)大數(shù)據(jù)找規(guī)律。
第三步:參數(shù)更新
那么還有問題,W是多少誰知道?
沒人知道,這里是根據(jù)計算機(jī)一步一步的試出來的,
先隨機(jī)的給出一組W,算出結(jié)果Y1,利用已知的x當(dāng)做輸入,用已知的y與y1坐差值,那么Y1-y就會有一個差值,就是預(yù)測值和真實(shí)值的差值。稱作損失函數(shù),有些叫做代價函數(shù)。當(dāng)代價函數(shù)最小的時候,預(yù)測值Y1和真實(shí)值y的差距越來越小,當(dāng)差距在我們可以接受的范圍內(nèi),那么就可以認(rèn)為,由權(quán)重參數(shù)W生成的Y1可以對輸入x進(jìn)行預(yù)測和分類。
那么如何讓損失函數(shù)最小呢?這里并不是求導(dǎo)后求極值點(diǎn),而是對損失函數(shù)求導(dǎo)數(shù),調(diào)整W,使得差值沿著導(dǎo)數(shù)的方向前進(jìn),最終達(dá)到極小值點(diǎn)。
這時候得到的W就是我們最終要的結(jié)果了。
第四步:利用參數(shù)
既然得到了W,我們就可以利用這個W,將一個未知結(jié)果的x輸入,從而得到通過W計算出的y,這個y就是圖片識別的結(jié)果。
現(xiàn)在有很多的開源深度學(xué)習(xí)框架,是各大著名公司封裝好的函數(shù)(已經(jīng)造好的輪子),
以下是一個卷積神經(jīng)網(wǎng)絡(luò)識別MNIST的小例子(基于google深度學(xué)習(xí)框架TensorFlow):
只是經(jīng)過了21次的參數(shù)更新,最終的識別準(zhǔn)確率在99%以上。
輸出結(jié)果:
ExtractingMNIST_data/train-images-idx3-ubyte.gz
ExtractingMNIST_data/train-labels-idx1-ubyte.gz
ExtractingMNIST_data/t10k-images-idx3-ubyte.gz
ExtractingMNIST_data/t10k-labels-idx1-ubyte.gz
第0次迭代,測試集準(zhǔn)確率是0.7688
第1次迭代,測試集準(zhǔn)確率是0.7831
第2次迭代,測試集準(zhǔn)確率是0.8829
第3次迭代,測試集準(zhǔn)確率是0.8883
第4次迭代,測試集準(zhǔn)確率是0.889
第5次迭代,測試集準(zhǔn)確率是0.8919
第6次迭代,測試集準(zhǔn)確率是0.8908
第7次迭代,測試集準(zhǔn)確率是0.893
第8次迭代,測試集準(zhǔn)確率是0.894
第9次迭代,測試集準(zhǔn)確率是0.8949
第10次迭代,測試集準(zhǔn)確率是0.8927
第11次迭代,測試集準(zhǔn)確率是0.8935
第12次迭代,測試集準(zhǔn)確率是0.8948
第13次迭代,測試集準(zhǔn)確率是0.9873
第14次迭代,測試集準(zhǔn)確率是0.9881
第15次迭代,測試集準(zhǔn)確率是0.9864
第16次迭代,測試集準(zhǔn)確率是0.9885
第17次迭代,測試集準(zhǔn)確率是0.9906
第18次迭代,測試集準(zhǔn)確率是0.9876
第19次迭代,測試集準(zhǔn)確率是0.9884
第20次迭代,測試集準(zhǔn)確率是0.9902
怎樣入門TensorFlow
使用tensorflow識別需要進(jìn)行大量的學(xué)習(xí),需要準(zhǔn)備大量的學(xué)習(xí)資源,感覺有點(diǎn)得不償失。對于識別漢字可以直接調(diào)用第三方接口,感覺這樣會方便得多,如果只是為了學(xué)習(xí)tensorflow的話,可以去github上面找相關(guān)材料,上面有很多開源的學(xué)習(xí)資料,供自己選擇。
另外,吳恩達(dá)的課程在他的官網(wǎng)上面也都公開了,可以直接去學(xué)習(xí)。也可以關(guān)注他的公眾號,每周都會更新相關(guān)課程。
opencv與tensorflow區(qū)別
OpenCV是計算機(jī)視覺庫,Tensorflow是深度學(xué)習(xí)框架。
包含了大量的圖像處理和計算機(jī)視覺的算法,但是在機(jī)器學(xué)習(xí)方面明顯不足,ML模塊只有SVM,MLP,kNN等有限的幾種算法。dnn模塊也是調(diào)用別的框架。
Tensorflow是專為深度學(xué)習(xí)而生,可以方便的實(shí)現(xiàn)各種深度學(xué)習(xí)算法。
二者不屬于同一領(lǐng)域,做視覺用OpenCV,做深度學(xué)習(xí)用Tensorflow。或者二者結(jié)合做圖像識別等等。
tensorflow人臉識別優(yōu)點(diǎn)
和TensorFlow對應(yīng)的是Theano,Torch,而Caffe專精于圖像處理。如果就是一個標(biāo)準(zhǔn)圖像處理應(yīng)用,Caffe會很方便,仍然有其存在的價值。而在一般的DLtask上,Caffe本來就不如Theano之流,也無所謂取代。
TensorFlow掌握到什么程度,可以在簡歷上面寫熟悉TensorFlow
嗯。。。這種問題,如果有應(yīng)用過TensorFlow做大規(guī)模分布式機(jī)器學(xué)習(xí)系統(tǒng)的話,那么已經(jīng)可以算作熟悉TensorFlow了。當(dāng)然如果要檢驗(yàn)是否熟悉Tensorflow,那么可以用下面這些標(biāo)準(zhǔn)大概確認(rèn)下自己的熟悉程度,當(dāng)然同時也可以用來查缺補(bǔ)漏。
Tensorflow基礎(chǔ)知識點(diǎn)計算圖
在Tensorflow中,經(jīng)常提及到計算圖的概念,那什么是計算圖呢?它實(shí)質(zhì)上是一個全局?jǐn)?shù)據(jù)結(jié)構(gòu):計算圖是一個有向圖,捕獲有關(guān)計算方法的指令。我們來看看簡單的計算圖形成,通過以下代碼,我們可以生成2+3的步驟,但是只包含計算步驟,不包含結(jié)果,至少目前還沒實(shí)現(xiàn)。
會話
會話的概念就是將計算圖生成的步驟逐一執(zhí)行,處理內(nèi)存分配和優(yōu)化,使我們能夠?qū)嶋H執(zhí)行由圖形指定的計算。例如以下代碼:
占位符和feed_dict
占位符是一種用于接受外部輸入的節(jié)點(diǎn),而feed_dict屬性是為了給占位符提供實(shí)質(zhì)的數(shù)值。
變量共享
你可能會碰到帶有變量共享的Tensorflow代碼,代碼有它們的作用域,并設(shè)置“reuse=True”。我強(qiáng)烈建議你不要在代碼中使用變量共享。如果你想在多個地方使用單個變量,只需要使用指向該變量節(jié)點(diǎn)的指針,并在需要時使用它。換句話說,對于打算保存在內(nèi)存中的每個參數(shù),應(yīng)該只調(diào)用一次tf.get_variable()。
優(yōu)化器
在深度學(xué)習(xí)中,典型的“內(nèi)循環(huán)”訓(xùn)練如下:
獲取輸入和true_output;
根據(jù)輸入和參數(shù)計算出一個“猜測”;
根據(jù)猜測和true_output之間的差異計算出一個“損失”;
根據(jù)損失的梯度更新參數(shù)。
優(yōu)化器的作用在于對于找到的每個變量節(jié)點(diǎn),它計算與損失相關(guān)的變量梯度。然后,它為該變量計算新值:當(dāng)前值減去梯度乘以學(xué)習(xí)率。最后,它執(zhí)行一個賦值操作來更新變量的值。
用tf.Print進(jìn)行調(diào)試
一般來說,檢查計算圖中發(fā)生了什么是很困難的。你不能使用常規(guī)的Python打印語句,因?yàn)槟阌肋h(yuǎn)無法訪問到要打印的值,這時候就需要用tf.Print。
常用模型的Tensorflow實(shí)現(xiàn)對于這一塊內(nèi)容,最好自己用編程語言實(shí)現(xiàn)過一遍,考驗(yàn)深度學(xué)習(xí)基礎(chǔ)功底。
卷積網(wǎng)絡(luò)(ConvolutionalNetwork)
循環(huán)神經(jīng)網(wǎng)絡(luò)(LSTM)(RecurrentNeuralNetwork(LSTM))
受限玻爾茲曼機(jī)(RestrictedBoltzmannMachine)
深度信念網(wǎng)絡(luò)(DeepBeliefNetwork)
作為RBM堆疊的深度自編碼器(DeepAutoencoderasstackofRBMs)
去噪自編碼器(DenoisingAutoencoder)
堆疊的去噪自編碼器(StackedDenoisingAutoencoder)
作為去噪自編碼器堆疊的深度自編碼器(DeepAutoencoderasstackofDenoisingAutoencoders)
多層感知器(MultiLayerPerceptron)
Logistic回歸
TensorFlow的交叉熵函數(shù)交叉熵(CrossEntropy)是Loss函數(shù)的一種(也稱為損失函數(shù)或代價函數(shù)),用于描述模型預(yù)測值與真實(shí)值的差距大小,常見的Loss函數(shù)就是均方平方差(MeanSquaredError)。
交叉熵具體定義如下:
TensorFlow針對分類問題,實(shí)現(xiàn)了四個交叉熵函數(shù),分別是tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
我會在這里發(fā)布所有與科技、科學(xué)有關(guān)的有趣文章,歡迎訂閱我的頭條號。偶爾也回答有趣的問題,有問題可隨時在評論區(qū)回復(fù)和討論。
(碼字不易,若文章對你幫助可點(diǎn)贊支持~)
好了,文章到此結(jié)束,希望可以幫助到大家。