天天看點

機器學習零基礎?手把手教你用TensorFlow搭建圖像識别系統(一)| 幹貨

機器學習零基礎?手把手教你用TensorFlow搭建圖像識别系統(一)| 幹貨

如果你覺得這是一篇簡單介紹人工智能、機器學習和深度學習的文章,那就錯啦。你可以在網上搜羅到一大堆相關話題的文章,而這篇文章也并不是讨論人工智能是否會奴役人類或搶走人們飯碗之類的話題,畢竟相關的各種推論和謠言已經滿天飛了。

這隻是一篇較長的描述如何開始搭建一個機器學習系統,并讓它可以識别所看到圖像的文章。

作者wolfgang

beyer目前現在正在學習人工智能和機器學習的内容。他認為最好的學習方式不是僅僅閱讀各類材料,而是要真正地去動手搭建一個系統。這就是雷鋒網翻譯本文的目的,也是作者要向你介紹的。在這篇文章中beyer将向你展示如何搭建一個系統,去完成一項簡單的計算機視覺任務:識别圖像内容。

beyer強調,他并不是一個專家。“我正在學習,而且還有很多東西需要學習。我隻是簡單介紹我正在做的事情。如果這對你能有所幫助,或者你也覺得很有趣,就已經很好了。如果你發現了錯誤或有什麼改進建議也請告訴我,你的回複對我也很重要。”

閱讀本文前你并不需要具備機器學習的相關經驗。示例代碼是使用python寫的,如果你有python的基礎知識是最好的。但如果你隻是掌握其他的程式設計語言,那也已經足夠了。由于篇幅限制,本系列将分四篇文章釋出,雷鋒網編譯,未經許可不得轉載。

為什麼讓機器學會圖像識别?

圖像識别是開發和測試機器學習的一項重要任務,因為視覺可能是最重要的一項感覺能力。雖然對于人類來說,它是與生俱來的。但它是怎麼實作的?大腦是怎樣将視網膜上的圖像轉化成我們對周圍環境的心智模式的?我想沒人能對此一清二楚。關鍵是,對我們來說這看起來如此簡單——我們不需要有意識地去做這件事,而對于計算機來說卻困難重重(事實上,對我們來說也并不是看上去那麼簡單。隻是我們并沒有意識到進行了多少工作。有超過一半的大腦區域直接或間接參與了視覺活動)。

在我們甚至都不知道自己怎麼看到東西的情況下,怎麼讓計算機去做到這樣的事情呢?這就是機器學習要研究的事情。我們采取的方法是讓計算機自己去完成這樣的過程,而不是手把手地一步步教會計算機如何解釋圖像并翻譯成計算機程式。我們給計算機提供總體結構,讓計算機從經驗中學習,就像我們人類做的那樣。

但是,在我們開始構想計算機視覺的整體方案之前,讓我們把這個任務簡化為一個容易掌握的小目标。

我們嘗試解決一個盡可能小而簡單的問題,另外也不要期望它能瞬間讓我們成為機器學習大師。我們希望計算機能做的包括以下方面:當我們向計算機展示一幅圖檔(特定尺寸)時,它能夠對圖檔進行分析并打上标簽。他可以從固定數量的标簽中進行選擇,每一類的标簽描述了一種圖像的内容。我們的目标就是這個模型能夠盡可能地挑選出正确的标簽。這個任務被稱作圖像分類。

機器學習零基礎?手把手教你用TensorFlow搭建圖像識别系統(一)| 幹貨

cifar-10資料集中10個分類中的随機圖檔。由于分辨率低,人類很難進行正确的标簽。

我們将圖檔轉化為一連串的數字輸送給計算模型。每個像素由代表紅色,綠色和藍色的三個浮點數來表示。其結果就是32x32x3=3072個值。

除了cifar-10,還有很多其他的圖像資料集可以用于計算機視覺的研究。之是以使用标準資料集,有兩個目的:

第一,要收集這麼多的圖檔是一項巨大的工作。你需要有大量的圖檔資源,并根據需要對他們進行分别标簽。 第二,使用相同的資料集,可以讓我們有目的地比較不同方法的優劣。

另外,使用标準資料集,可以互相比較,在競賽中排出名次。最有名的比賽是image-net圖像識别大賽,它需要對1000個不同的種類進行識别。2012年的勝者是來自多倫多大學(university

of toronto)的亞力克斯•克利則夫斯基(alex krizhevsky),伊利亞·蘇特斯科娃(ilya

這次比賽對整個研究領域産生了巨大的沖擊,因為這是第一次使用卷積神經網絡的方法獲得勝利。卷積神經網絡是一種人工神經網絡,它大緻模拟了動物視覺的皮質行為。這一技術的應用已經有一段時間,但它的潛力還沒被多數人認識到。2012

image-net競賽後,這種情況出現了改變。人們突然對神經網絡和深度學習(深度學習是使用多層神經網絡的方法解決機器學習的問題)産生了巨大興趣,而這次賽事也極大地推動了以後幾年深度學習的快速發展。

我們怎麼使用圖像資料集讓計算機自己學習呢?即使計算機自己能夠學習,我們也需要告訴它學習什麼和怎樣學習。是以,我們需要通過制定一個大緻的流程讓計算機能夠對圖像進行評估。

我們定義一個通用的數學模型,将輸入圖像轉換為輸出标簽。這個模型的實際輸出不僅僅依賴于圖像本身,還依賴模型内建的參數。這些參數并不是由我們提供,而是由計算機通過學習獲得。

這樣一來,這個過程可以被了解為一個優化問題。我們初始定義一個模型并提供初始的參數值。然後再向模型輸入圖像資料集和已知的正确标簽。這就是訓練的過程。在這個階段模型重複校驗,訓練資料,持續調整參數值。目标是找到合适的參數使模型輸出盡可能多的正确結果。這種同時使用輸入資料和正确結果的訓練方法叫做監督學習。還有一種叫做非監督學習,這種學習中隻使用了輸入資料而沒有标簽,但在這篇文章中我們不做讨論。

當訓練完成,模型參數被固定下來,并可以被用于圖像集以外的圖像分類。

機器學習零基礎?手把手教你用TensorFlow搭建圖像識别系統(一)| 幹貨

在訓練期間,模型的預測結果與真實值進行比較。這些資訊被用于更新參數值。在測試過程中就不再有回報,模型隻是産生标簽。

接下來,我們就要開始學習如何用tensorflow搭建一個合适的模型。

github支援這個模型的完整代碼。在使用之前,你需要安裝以下軟體:

· python(代碼經過了python2.7測試,python3.3+也應該可以工作,安裝連結) ·  tensorflow(安裝指導連結) ·  cifar-10資料集:下載下傳python版本的資料集

 從https://www.cs.toronto.edu/~kriz/cifar.html下載下傳或者使用連結中的壓縮文檔。請把 cifar-10-batches-py解壓到python源代碼的目錄下,這樣圖像的路徑應該為/path-to-your-python-source-code-files/cifar-10-batches-py/。

 好了,現在我們可以開始了。讓我們先來看看試驗的主檔案softmax.py,一行一行地來分析:

from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf import time import data_helpers

根據tensorflow代碼規範,在所有tensorflow

python檔案中為了python2和3的相容性,都應該添加future語句。然後導入tensorflow,numpy用于數值計算和時間子產品。data_helper.py包括加載和準備資料集的函數。

begintime = time.time()  # parameter definitions batch_size = 100 learning_rate = 0.005 max_steps = 1000 # prepare data data_sets = data_helpers.load_data()

我們啟動一個計時器測量運作時間和定義一些參數。稍後在實際使用它們時再進行讨論。然後加載cifar-10資料集。因為讀取資料并不是我們要做的核心,我把這部分的函數單獨放在data_helper.py檔案中。它隻是負責讀取包含資料集的檔案,并把資料放入一個友善我們操作的資料結構中。

需要提到的重要的一點是,load_data()是将60000幅圖像分為兩部分。大的一部分包含50000幅圖像。這些資料集用于訓練我們的模型。另外的10000幅圖像被稱作測試集。在訓練結束之前,我們的模型将不會看到這些圖像。直到模型中的參數不再變換,我們使用測試集作為模型輸入來檢驗模型的性能。

回到我們的代碼,load_data()傳回一個dictionary類型資料:

images_train:訓練集轉換為50000x3072(32像素x32像素x3個顔色通道)的數組

labels_train:訓練集的50000個标簽(每個數字從0到9代表圖像訓練集的10個分類)

images_test:測試集(10000x3072)

labels_test:測試集的10000個标簽

classes:10個文本标簽,将數字轉換成文字(0代表“飛機”,1代表“車”,等等)

# define input placeholders images_placeholder = tf.placeholder(tf.float32, shape=[none, 3072]) labels_placeholder = tf.placeholder(tf.int64, shape=[none]) 本文作者:晟炜