深度學習基礎(九):CNN使用TensorFlow在開發圖像分類器

什麼是卷積神經網絡(CNN)以及卷積神經網絡背後的 體系結構–旨在解決 圖像識別系統和分類問題。卷積神經網絡在圖像和視頻識別,推薦系統和天然語言處理中具備普遍的應用。神經網絡相關內容可參考本公衆號的文章:javascript

基於深度學習和神經網絡的重要基礎及方法概要java

本文相關內容目錄:nginx

  • 計算機如何讀取圖像?git

  • 爲何不徹底鏈接網絡?算法

  • 什麼是卷積神經網絡?編程

  • 卷積神經網絡的起源微信

  • 卷積神經網絡如何工做?網絡

    • 卷積神經網絡示例session

    • 圖像的卷積app

    • ReLu層

    • 池化層

    • 堆疊層

    • 使用卷積神經網絡預測圖像

  • 用例:CIFAR10圖像分類器  訓練一個網絡

  • 參考文獻


計算機如何讀取圖像?

考慮一下紐約天際線的圖像,乍一看,您會看到不少建築物色彩。那麼計算機如何處理該圖像?


紐約天際線

圖像被分解成3個顏色通道,其是紅,綠藍。這些顏色通道中的每個都映射圖像的像素。


圖像處理

而後,計算機識別每一個像素關聯的值並肯定圖像的大小

然而,對於黑白圖像,只有一個信道和所述概念同樣的。


爲何不徹底鏈接網絡?

關於卷積神經網絡,咱們沒法利用徹底鏈接的網絡這就是緣由!



考慮下圖:


卷積神經網絡

在這裏,咱們已經考慮輸入與尺寸圖像的28x28x3像素。若是將其輸入到卷積神經網絡,則第一個隱藏層自己將具備約2352個權重

可是這種狀況不切實際。如今,看看這個:


卷積神經網絡2

任何通用的輸入圖像ATLEAST200x200x3像素大小。第一個隱藏層的大小高達120,000。若是這只是第一個隱藏層,請想象處理整個複雜圖像集所需的神經元數量****。

這會致使過分擬合,並且不切實際。所以,咱們沒法利用徹底鏈接的網絡。


什麼是卷積神經網絡?

與神經網絡同樣,卷積神經網絡由具備可學習的****權重誤差神經元組成。每一個神經元接收幾個輸入,對它們進行加權求和其傳遞給激活****函數,而後以輸出進行響應。

整個網絡具備損失 功能,咱們爲神經網絡開發的全部提示和技巧仍然適用於卷積神經網絡。

很簡單吧?

顧名思義,神經網絡是一種以大腦結構爲模型的機器學習技術。它由稱爲神經元的學習單元網絡組成。

這些神經元學習如何將 輸入信號 (例如貓的照片)轉換爲相應的 輸出信號 (例如標籤「貓」),從而造成自動識別的基礎。

讓咱們以自動圖像識別爲例的過程當中肯定一個是否圖片包含涉及一個 激活功能。若是圖片相似於神經元以前見過的先前的貓圖像則標籤「貓」將被激活。

所以,更多的標記圖像中的神經元被暴露於,更好的是學會如何識別其餘未標記的圖像。咱們稱其爲訓練 神經元的過程 。


卷積神經網絡的起源

神經網絡的智能是難以想象的。雖然人工神經網絡進行了研究,早在20世紀60年代羅森布拉特,那也只是在末21世紀初,當用神經網絡深度學習起飛。關鍵的推進者是規模計算能力數據集谷歌開創性研究深度學習。2012年7月,Google的研究人員將高級神經網絡暴露於YouTube切片的一系列未標記的靜態圖像 視頻。

令他們驚訝的是,他們發現神經網絡自行****學習了一種檢測貓的神經元,從而支持了流行的說法,即「互聯網是由貓組成的」。


貓圖像處理


當即查看即將發佈的AI和深度學習課程批次! 如今讀

卷積神經網絡如何工做?

4個分層的 概念, 咱們應該在卷積神經網絡的理解:

  1. 卷積,

  2. ReLu,

  3. 聚集和

  4. 徹底鏈接(徹底鏈接層)。

讓咱們從檢查一個簡單的示例開始:

CNN示例:

考慮下圖:


卷積神經網絡-Edureka

這裏,有X和O的多種形式。這使計算機難以識別。但目標是,若是輸入信號看起來像之前看到的先前圖像,則「圖像」參考信號將混入或卷積輸入信號中。而後將所得的輸出信號傳遞到下一層。


卷積神經網絡-Edureka

所以,計算機能夠理解每一個像素。在這種狀況下,白色像素被認爲是-1,而黑色的有1.這僅僅是咱們實現的方式區分像素的基本二元分類。


卷積神經網絡-Edureka

如今,若是咱們只是正常搜索比較正常圖像和彼此之間的「x」翻譯,咱們會獲得一個很大缺失像素。

那麼,咱們該如何解決呢?


卷積神經網絡-Edureka


咱們將稱爲濾鏡的像素小塊嘗試匹配 他們在附近相應的位置,看看是否能找到比賽。經過這樣作,卷積神經網絡在看到類似性方面比直接嘗試匹配整個圖像好得多****。


圖像的卷積

卷積具備平移不變的良好特性 。直觀上,這意味着每一個卷積濾波器表明一個感興趣的特徵(例如,字母中的像素),而卷積神經網絡算法將瞭解哪些特徵構成了最終的參考(即字母)。

咱們有4個卷積步驟

  • 排列特徵和圖像

  • 每一個圖像像素乘以相應的特徵像素

  • 添加值,並找到總和

  • 將總和除以****特徵中的像素總數


卷積神經網絡-Edureka


卷積神經網絡-Edureka

考慮上圖-如您所見,咱們完成了前兩個步驟。咱們考慮了一個特徵圖像及其一個像素。咱們將此乘以****現有圖像,而後將乘積存儲在另外一個緩衝區特徵圖像中


卷積神經網絡-Edureka

使用此圖像,咱們完成了至少2個步驟。咱們將致使相加的值****相加。而後咱們,除以這個數字的像素數特徵圖像。完成此操做後,將得到的最終值放置在濾波圖像中心,以下所示:


卷積神經網絡-Edureka

如今,咱們能夠移動該 濾鏡,並在圖像中的任何像素處執行相同操做。爲了更清楚,讓咱們考慮另外一個示例:


卷積神經網絡-Edureka

如您所見,在執行了前4個步驟以後,咱們獲得的值爲0.55!咱們採用此值並將其放置在圖像中,如前所述。以下圖所示:


卷積神經網絡-Edureka

一樣,咱們將特徵移動到圖像中的每一個其餘位置,而後查看特徵如何與該區域匹配。所以,執行此操做後,咱們將得到如下輸出:


卷積神經網絡-Edureka

在這裏,咱們只考慮了一個過濾器。相似地,咱們將與其餘全部濾鏡執行相同的卷積運算以得到該濾鏡的卷積。


輸出信號強度不依賴於其中的特徵的位置,但只是是否特徵存在。所以,一個字母可能坐在不一樣的位置 和卷積神經網絡算法仍然可以認出它。


ReLU層

ReLU是激活功能。可是,什麼是激活功能?

整流線性單位(ReLU)變換功能僅在輸入大於必定量時激活節點,而輸入小於零時輸出爲零,可是當輸入大於某個閾值時,它與線性關係具備線性關係。因變量。

考慮如下示例:


ReLU層

咱們已經考慮了一個具備上述值的簡單函數。所以,該函數僅在該值由因變量得到的狀況下才執行操做。對於此示例,將得到如下值:


ReLU功能



爲何咱們在這裏須要ReLU?


卷積神經網絡-Edureka



主要目的是消除卷積中的全部負值。全部正值均保持不變,但全部負值均變爲零,以下所示:


卷積神經網絡-Edureka



所以,在處理了此特定功能以後,咱們將得到如下輸出:


卷積神經網絡-Edureka



如今,相似地,咱們對全部其餘特徵圖像也執行相同的過程:


卷積神經網絡-Edureka

輸入從卷積層能夠被「平滑」,以減小敏感性的的過濾器,以噪聲變化。 這種平滑化處理被稱爲 子採樣,而且能夠實現經過取平均或取最大樣品的信號。



池化層

在這一層中,咱們將圖像堆棧縮小較小的尺寸。****在經過激活以後進行合併。爲此,咱們執行如下4個步驟:

  • 選擇一個窗口大小(一般爲2或3)

  • 選擇一個步幅(一般爲2)

  • 你的窗口對面過濾圖像

  • 從每個窗口,最高

讓咱們經過一個例子來理解這一點。考慮在窗口大小爲2且跨度爲2的狀況下執行合併。


卷積神經網絡-Edureka

所以,在這種狀況下,咱們將窗口大小設爲2,而後從4個 值中進行選擇。從這些4個值,該最大值有1因此咱們選擇1。此外,須要注意的是,咱們開始了一個7×7矩陣,但如今後的同一矩陣歸結爲4×4。

但咱們須要移動整個窗口整個圖像。該過程與上面的過程徹底相同,咱們須要對整個圖像重複該過程。


卷積神經網絡-Edureka

請注意,這是針對一個過濾器的。咱們還須要爲另外2個過濾器執行此操做。完成後,咱們獲得如下結果:



卷積神經網絡-Edureka

好了,這個過程簡單部分已經結束。接下來,咱們須要堆疊全部這些層!


堆疊各層

所以,爲了得到一張圖片中的時間範圍,咱們將輸入通過3層(卷積,ReLUPooling)傳遞後,從7×7矩陣獲得4×4矩陣,以下所示:


卷積神經網絡-Edureka

可是咱們能夠進一步將圖像從4×4****縮小較小的程度嗎?

咱們能夠!在第一遍以後,咱們須要在迭代中執行這3個操做。所以,第二遍以後,咱們將得出一個2×2矩陣,以下所示:


卷積神經網絡-Edureka

網絡中的最後層徹底鏈接,這意味着前層的神經元被鏈接每一個神經元後續的層。

模仿了高級推理,其中考慮了從輸入輸出的全部可能路徑

一樣,徹底鏈接的層是最終發生分類的最後一層。在這裏,咱們將通過過濾和縮小的圖像放入一個列表中,以下所示:


卷積神經網絡-Edureka

所以,接下來,當咱們輸入「 X」「 O」時,向量中將有一些元素****很高。考慮下面的圖片,你能夠看到「X」也有不一樣的元素一樣,對於「O」,咱們有不一樣的元素高:


卷積神經網絡-Edureka

好了,咱們從以上圖像中****瞭解什麼?


當第1,第4,第5,第10第11較高時,咱們能夠將圖像分類爲「 x」。 其餘字母的概念也類似–當某些值****按其原樣排列時,它們能夠映射實際的字母或咱們須要數字****,簡單嗎?


使用卷積神經網絡預測圖像–全鏈接層

此時,咱們已經完成了對網絡的培訓,咱們能夠開始預測和檢查****分類器工做了。讓咱們看一個簡單的例子:


卷積神經網絡-Edureka

在上面的圖像,咱們有一個12元件以後得到向量傳遞輸入a的隨機信經過全部的提供了網絡。

可是,咱們如何檢查以瞭解咱們所得到的是對仍是錯?

經過將得到的值與「 x」和「 o」的列表進行比較,咱們基於輸出數據進行預測


卷積神經網絡-Edureka

好吧,這真的很容易。咱們只添加了從X向量表中發現的高值(第1,第4,第5,第10和第11),咱們得出的總和爲5。咱們對輸入圖像進行了徹底相同的操做,獲得了一個值4.56

當咱們分開價值,咱們有一個機率匹配0.91!讓咱們作一樣的量表「O」如今:


卷積神經網絡-Edureka

該表的輸出0.51。好吧,機率爲0.51小於0.91,不是嗎?

所以咱們能夠得出結論,輸入的圖像'x'!


用例:使用TensorFlow經過卷積神經網絡實現CIFAR10

讓咱們訓練一個網絡,使用TensorFlow內置的卷積神經網絡對來自CIFAR10數據集的圖像進行分類。


CIFAR10數據集

考慮如下流程圖,瞭解用例的工做原理


CIFAR10數據集流程圖

安裝必要的軟件包:

pip3 install numpy tensorflow pickle

訓練網絡:

import numpy as npimport tensorflow as tffrom time import timeimport math  from include.data import get_data_setfrom include.model import model, lr  train_x, train_y = get_data_set("train")test_x, test_y = get_data_set("test")tf.set_random_seed(21)x, y, output, y_pred_cls, global_step, learning_rate = model()global_accuracy = 0epoch_start = 0  # PARAMS_BATCH_SIZE = 128_EPOCH = 60_SAVE_PATH = "./tensorboard/cifar-10-v1.0.0/"  # LOSS AND OPTIMIZERloss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=output, labels=y))optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=0.9, beta2=0.999, epsilon=1e-08).minimize(loss, global_step=global_step)  # PREDICTION AND ACCURACY CALCULATIONcorrect_prediction = tf.equal(y_pred_cls, tf.argmax(y, axis=1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  # SAVERmerged = tf.summary.merge_all()saver = tf.train.Saver()sess = tf.Session()train_writer = tf.summary.FileWriter(_SAVE_PATH, sess.graph)  try: print("Trying to restore last checkpoint ...") last_chk_path = tf.train.latest_checkpoint(checkpoint_dir=_SAVE_PATH) saver.restore(sess, save_path=last_chk_path) print("Restored checkpoint from:", last_chk_path)except ValueError: print("Failed to restore checkpoint. Initializing variables instead.") sess.run(tf.global_variables_initializer())  def train(epoch): global epoch_start epoch_start = time() batch_size = int(math.ceil(len(train_x) / _BATCH_SIZE)) i_global = 0  for s in range(batch_size): batch_xs = train_x[s*_BATCH_SIZE: (s+1)*_BATCH_SIZE] batch_ys = train_y[s*_BATCH_SIZE: (s+1)*_BATCH_SIZE]  start_time = time() i_global, _, batch_loss, batch_acc = sess.run( [global_step, optimizer, loss, accuracy], feed_dict={x: batch_xs, y: batch_ys, learning_rate: lr(epoch)}) duration = time() - start_time  if s % 10 == 0: percentage = int(round((s/batch_size)*100))  bar_len = 29 filled_len = int((bar_len*int(percentage))/100) bar = '=' * filled_len + '>' + '-' * (bar_len - filled_len)  msg = "Global step: {:>5} - [{}] {:>3}% - acc: {:.4f} - loss: {:.4f} - {:.1f} sample/sec" print(msg.format(i_global, bar, percentage, batch_acc, batch_loss, _BATCH_SIZE / duration))  test_and_save(i_global, epoch)  def test_and_save(_global_step, epoch): global global_accuracy global epoch_start  i = 0 predicted_class = np.zeros(shape=len(test_x), dtype=np.int) while i < len(test_x): j = min(i + _BATCH_SIZE, len(test_x)) batch_xs = test_x[i:j, :] batch_ys = test_y[i:j, :] predicted_class[i:j] = sess.run( y_pred_cls, feed_dict={x: batch_xs, y: batch_ys, learning_rate: lr(epoch)} ) i = j correct = (np.argmax(test_y, axis=1) == predicted_class) acc = correct.mean()*100 correct_numbers = correct.sum() hours, rem = divmod(time() - epoch_start, 3600) minutes, seconds = divmod(rem, 60) mes = " Epoch {} - accuracy: {:.2f}% ({}/{}) - time: {:0>2}:{:0>2}:{:05.2f}" print(mes.format((epoch+1), acc, correct_numbers, len(test_x), int(hours), int(minutes), seconds))  if global_accuracy != 0 and global_accuracy < acc: summary = tf.Summary(value=[ tf.Summary.Value(tag="Accuracy/test", simple_value=acc), ]) train_writer.add_summary(summary, _global_step) saver.save(sess, save_path=_SAVE_PATH, global_step=_global_step) mes = "This epoch receive better accuracy: {:.2f} > {:.2f}. Saving session..." print(mes.format(acc, global_accuracy)) global_accuracy = acc  elif global_accuracy == 0: global_accuracy = acc  print("###########################################################################################################")  def main(): train_start = time()  for i in range(_EPOCH): print("Epoch: {}/{}".format((i+1), _EPOCH)) train(i)  hours, rem = divmod(time() - train_start, 3600) minutes, seconds = divmod(rem, 60) mes = "Best accuracy pre session: {:.2f}, time: {:0>2}:{:0>2}:{:05.2f}" print(mes.format(global_accuracy, int(hours), int(minutes), seconds))  if __name__ == "__main__": main()  sess.close()


卷積神經網絡是一種流行的深度學習技術,用於當前的 視覺識別任務。像全部深度學習技術同樣,卷積神經網絡很是依賴於訓練數據的大小質量

有了充分準備的數據集,卷積神經網絡 在視覺識別任務上就能超越人類。可是,它們仍然沒法抵抗****人類可以應付的視覺僞影,例如眩光和噪音

卷積神經網絡的理論****仍在發展中,研究人員正在努力賦予它積極主動的注意力在線記憶等屬性從而使卷積神經網絡可以評估與他們所接受的培訓迥然不一樣的新項目。

Ť他更好地模擬哺乳動物的視覺系統,從而走向一個更聰明的人工視覺識別系統。


在測試數據集上運行網絡

import numpy as npimport tensorflow as tf from include.data import get_data_setfrom include.model import model  test_x, test_y = get_data_set("test")x, y, output, y_pred_cls, global_step, learning_rate = model()  _BATCH_SIZE = 128_CLASS_SIZE = 10_SAVE_PATH = "./tensorboard/cifar-10-v1.0.0/"  saver = tf.train.Saver()sess = tf.Session()  try: print("Trying to restore last checkpoint ...") last_chk_path = tf.train.latest_checkpoint(checkpoint_dir=_SAVE_PATH) saver.restore(sess, save_path=last_chk_path) print("Restored checkpoint from:", last_chk_path)except ValueError: print("Failed to restore checkpoint. Initializing variables instead.") sess.run(tf.global_variables_initializer())  def main(): i = 0 predicted_class = np.zeros(shape=len(test_x), dtype=np.int) while i < len(test_x): j = min(i + _BATCH_SIZE, len(test_x)) batch_xs = test_x[i:j, :] batch_ys = test_y[i:j, :] predicted_class[i:j] = sess.run(y_pred_cls, feed_dict={x: batch_xs, y: batch_ys}) i = j  correct = (np.argmax(test_y, axis=1) == predicted_class) acc = correct.mean() * 100 correct_numbers = correct.sum() print() print("Accuracy on Test-Set: {0:.2f}% ({1} / {2})".format(acc, correct_numbers, len(test_x)))  if __name__ == "__main__": main()  sess.close()

output:

Trying to restore last checkpoint ...
Restored checkpoint from: ./tensorboard/cifar-10-v1.0.0/-23460

Accuracy on Test-Set: 78.81% (7881 / 10000)

Training Time

Here you can see how much time takes 60 epoch:

本文應該掌握的結果:

卷積神經網絡是一種流行的深度學習技術,用於當前的 視覺識別任務。像全部深度學習技術同樣,卷積神經網絡很是依賴於訓練數據大小質量

有了充分準備的數據集,卷積神經網絡 在視覺識別任務上就能超越人類可是,它們仍然沒法抵抗人類可以應付的視覺僞影,例如眩光和噪音

卷積神經網絡理論仍在發展中,研究人員正在努力賦予它積極主動的注意力在線記憶等屬性從而使卷積神經網絡可以評估與他們所接受的培訓迥然不一樣的新項目。

參考文獻

https://zhuanlan.zhihu.com/p/339390037https://www.edureka.co/https://zhuanlan.zhihu.com/p/339384769https://www.jianshu.com/u/b8ef22aa8878


本文分享自微信公衆號 - AI科技與算法編程(kangsinx)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索