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

張貼日期:Jan 17, 2017 5:36:48 AM

導語:這是Wolfgang Beyer的一篇博文,詳細介紹瞭如何使用TensorFlow搭建一個簡單的圖像識別系統。本篇主要介紹圖像識別和本試驗中會遇到的一些概念。

原文:

http://www.wolfib.com/Image-Recognition-Intro-Part-1/

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

這只是一篇詳細描述如何開始搭建一個機器學習系統,並讓它可以識別所看到圖像的文章。

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

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

閱讀本文前你並不需要具備機器學習的相關經驗。示例代碼是使用Python寫的,如果你有Python的基礎知識是最好的。但如果你只是掌握其他的編程語言,那也已經足夠了。由於篇幅限制,本系列將分四篇文章發布

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

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

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

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

圖像分類和CIFAR-10數據集

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

我們將使用標準的CIFAR-10數據集。CIFAR-10包含了60000幅圖片。它有10個不同的分類,每類包含6000幅圖片。每幅圖片的規格是32x32像素。這麼小尺寸的圖片對我們人類來說有時很難進行正確的分類,但它卻簡化了計算機模型的任務,並降低了分析圖片的計算負載。

CIFAR-10數據集中10個分類中的隨機圖片。由於分辨率低,人類很難進行正確的標籤。

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

除了CIFAR-10,還有很多其他的圖像數據集可以用於計算機視覺的研究。之所以使用標準數據集,有兩個目的:

第一,要收集這麼多的圖片是一項巨大的工作。你需要有大量的圖片資源,並根據需要對他們進行分別標籤。

第二,使用相同的數據集,可以讓我們有目的地比較不同方法的優劣。

另外,使用標準數據集,可以相互比較,在競賽中排出名次。最有名的比賽是Image-Net圖像識別大賽,它需要對1000個不同的種類進行識別。2012年的勝者是來自多倫多大學(University of Toronto)的亞力克斯•克利則夫斯基(AlexKrizhevsky),伊利亞·蘇特斯科娃(Ilya Sutskever)和傑夫·辛頓(Geoffrey Hinton )設計的算法(雷鋒網注:可點擊論文鏈接查看)。這個系統領跑整個比賽並且以巨大的優勢獲勝。

這次比賽對整個研究領域產生了巨大的衝擊,因為這是第一次使用卷積神經網絡的方法獲得勝利。卷積神經網絡是一種人工神經網絡,它大致模擬了動物視覺的皮質行為。這一技術的應用已經有一段時間,但它的潛力還沒被多數人認識到。2012 Image-Net競賽后,這種情況出現了改變。人們突然對神經網絡和深度學習(深度學習是使用多層神經網絡的方法解決機器學習的問題)產生了巨大興趣,而這次賽事也極大地推動了以後幾年深度學習的快速發展。

監督學習

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

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

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

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

在訓練期間,模型的預測結果與真實值進行比較。這些信息被用於更新參數值。在測試過程中就不再有反饋,模型只是產生標籤。

TensorFlow

TensorFlow是機器學習的開源軟件庫,它由Google在2015年發布並很快成為全世界的研究者和學習者中最流行的機器學習庫之一。它在圖像分類模型中承擔重要作用。

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

建立模型,一個Softmax分類器

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代碼規範,在所有TensorFlowPython文件中為了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幅圖像被稱作測試集。在訓練結束之前,我們的模型將不會看到這些圖像。直到模型中的參數不再變換,我們使用測試集作為模型輸入來檢驗模型的性能。

將數據分為訓練集和測試集非常重要。我們並不知道我們的模型在遇到訓練數據集或測試數據集的時候是否有相同的表現。最糟的情況在於,模型記錄下了它看過的所有圖像。如果我們使用相同的訓練集進行測試,模型通過查找存儲下來的正確答案,可能表現得非常完美。但是如果使用它從未見過的圖像則原形畢露。這在模型學習中有個專門的概念叫做過度擬合,就是說特定的訓練數據可能掩蓋一些更為通常的特徵。在機器學習中避免過度擬合是一項重大的課題。關於過度擬合和為什麼建議將數據分成2個或者3個數據集,可以參考Coursera上吳恩達(Andrew Ng)機器學習課程的節選視頻。https://www.coursera.org/learn/machine-learning

回到我們的代碼,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])

做好了這些工作後,我們在下篇將帶大家開始建立這個模型。

來源:

http://www.wolfib.com/Image-Recognition-Intro-Part-1/