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

2020-12-01 雷鋒網

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

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

作者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)的亞力克斯•克利則夫斯基(Alex Krizhevsky),伊利亞·蘇特斯科娃(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代碼規範,在所有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幅圖像被稱作測試集。在訓練結束之前,我們的模型將不會看到這些圖像。直到模型中的參數不再變換,我們使用測試集作為模型輸入來檢驗模型的性能。

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

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

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

 via wolfib

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 機器學習零基礎?手把手教你用TensorFlow搭建圖像識別系統(三)|...
    TensorFlow構建圖像識別系統的第三部分。關於前兩部分,可以參看《機器學習零基礎?手把手教你用TensorFlow搭建圖像識別系統》(一)和(二)。混洗之後的數據的前10個圖像作為我們的第一個批次,接下來的10個圖像是我們的第二批,後面的批次以此類推。 10批後,在數據集的末尾,再重複混洗過程,和開始步驟一致,依次取10張圖像作為一批次。這保證沒有任何圖像比任何其它圖像被更頻繁地拾取,同時仍然確保圖像被返回的順序是隨機的。
  • 深度學習的敲門磚:手把手教你TensorFlow初級入門
    而本文就是通過對TensorFlow的一些基本特點的介紹,讓你了解它是機器學習類庫中的一個不錯的選擇。讓我們設想一下,當我們用Python寫代碼時,沒有那些方便的類庫會是怎樣一種窘境。 這就好比你有一個新的智慧型手機,而不安裝任何應用程式。 雖然它仍然可以打電話,發簡訊,但如果有了那些更方便的應用程式,這部智慧型手機才更有價值。
  • TensorFlow極速入門
    一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。
  • Tensorflow 全網最全學習資料匯總之Tensorflow 的入門與安裝【2】
    TensorFlow已經在圖像識別,大數據分析,語音識別和語義理解,機器翻譯等各個領域得到了廣泛應用,同時也得到了業內人士的普遍認可,成為了目前最受關注和使用率最高的開源框架之一。最後通過手寫數字識別的實例將這些點串起來進行了具體說明。需要指出的是,兩篇文章覆蓋的基礎概念不盡相同,並且舉例用的代碼也不一樣。3.
  • 關於TensorFlow,你應該了解的9件事
    (除非你不看視頻,不然你絕對應該看看這個演講,演講者 Laurence Moroney 很出色。)#1:TensorFlow 是一個強大的機器學習框架TensorFlow 是一個機器學習框架,如果你有大量的數據,或者你在追求人工智慧最先進的技術:深度學習、神經網絡等,它都會使你如虎添翼。
  • 谷歌開源TensorFlow Object Detection API物體識別系統
    (2016 年 10 月,該系統在 COCO 識別挑戰中名列第一)開源給更大的社區,幫助打造更好的計算機視覺模型。在谷歌,研究人員開發了最高水平的計算機視覺機器學習系統,不僅可以用於谷歌自身的產品和服務,還可以推廣至整個研究社區。創造能夠在同一張圖片裡定位和識別多種物體的機器學習模型一直是業內的核心挑戰之一,谷歌宣稱自己已投入大量時間訓練和實驗此類系統。
  • TensorFlow 資源大全中文版
    (點擊上方藍字,快速關注我們)譯文:伯樂在線專欄作者 - Yalye英文:jtoy如有好文章投稿
  • 玩轉TensorFlow?你需要知道這30功能
    在過去幾年,有關 TensorFlow 的知識系統佔據了我的大腦。與其它一些更新的框架相比,TensorFlow 的功能並不是很多。我對這個產品投入全心的思考並寫下了我的想法,下面是一條接一條不斷擴展的清單。對此,你準備好了嗎?
  • 手把手教你用 TensorFlow 實現卷積神經網絡(附代碼)
    標準的數位相機有紅、綠、藍三個通道(Channels),每一種顏色的像素值在0-255之間,構成三個堆疊的二維矩陣;灰度圖像則只有一個通道,可以用一個二維矩陣來表示。第二步中,這個小的神經網絡對這77張大小相同的小圖片都進行同樣的計算,也稱權重共享(SharedWeights)。
  • 機器之心GitHub項目:從零開始用TensorFlow搭建卷積神經網絡
    原標題:機器之心GitHub項目:從零開始用TensorFlow搭建卷積神經網絡 機器之心原創 參與:蔣思源 在 Anaconda Prompt(CMD 命令行中也行)中鍵入以下命令以創建名為 tensorflow 的 conda 環境: conda create -n tensorflow python=3.5 然後再運行以下命令行激活
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    TensorFlow Serving 是應用於機器學習模型的靈活的高性能服務系統,而 NVIDIA TensorRT 則是一個用以實現高性能深度學習推理的平臺,將二者相結合後,用戶可以輕鬆地實現最佳性能的 GPU 推理。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    本文創建了一個簡單的工具來識別手繪圖像,並且輸出當前圖像的名稱。該應用無需安裝任何額外的插件,可直接在瀏覽器上運行。作者使用谷歌 Colab 來訓練模型,並使用 TensorFlow.js 將它部署到瀏覽器上。
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    選自Github機器之心編譯參與:Jane W、李澤南TensorFlow 是一個由谷歌發布的機器學習框架,在這篇文章中,我們將闡述 TensorFlow 的一些本質概念。相信你不會找到比本文更簡單的介紹。
  • 教程 | 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    我在 TensorFlow.js 上創建了一個教程(https://medium.com/tensorflow/a-gentle-introduction-to-tensorflow-js-dba2e5257702)。在繼續下面的工作之前,請務必先閱讀一下這個教程。下圖為該項目的處理流程:
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    個人公眾號:數據科學家養成記 (微信ID:louwill12)前文傳送門:深度學習筆記1:利用numpy從零搭建一個神經網絡深度學習筆記2:手寫一個單隱層的神經網絡深度學習筆記3:手動搭建深度神經網絡(DNN)深度學習筆記4:深度神經網絡的正則化深度學習筆記5:正則化與
  • 從框架優缺點說起,這是一份TensorFlow入門極簡教程
    谷歌今日上線基於 TensorFlow 的機器學習速成課程(中文版)機器之心 GitHub 項目:從零開始用 TensorFlow 搭建卷積神經網絡教程 | 從零開始:TensorFlow 機器學習模型快速部署指南分布式 TensorFlow 入坑指南:從實例到代碼帶你玩轉多機器深度學習三天速成!
  • 手把手教你用PyTorch實現圖像分類器(第一部分)
    最後一個項目是用PyTorch創建一個102種不同類型的花的圖像分類器。在做這個final project的時候,很多同學都遇到了類似的問題和挑戰。當我接近完成的時候,我決定與大家分享一些在未來對他人有益的建議和見解。通過3篇短文,介紹如何實現圖像分類器的概念基礎——這是一種能夠理解圖像內容的算法。
  • 教程| 如何用TensorFlow在安卓設備上實現深度學習推斷
    她在 Insight 工作的時候,在安卓系統上用 TensorFlow 部署了一個 WaveNet 模型。本文詳細介紹了部署和實現過程。對於個人和公司來說,存在許多狀況是更希望在本地設備上做深度學習推斷的:想像一下當你在旅行途中沒有可靠的網際網路連結時,或是要處理傳輸數據到雲服務的隱私問題和延遲問題時。
  • 終於來了,TensorFlow 新增官方 Windows 支持
    在谷歌的支持下,TensorFlow 已成為 GitHub 上最受歡迎的機器學習開源項目。同時,谷歌也在 TensorFlow 框架中進行過各類研究、開源了其中一些項目,這些研究涉及到自然語言處理、機器翻譯、圖像描述、圖像分類等等。谷歌在開發者博客上寫到:「原生的 Windows 版 TensorFlow 是自開源以來,我們工作的重中之重。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    介紹圖像分類是計算機視覺的最重要應用之一。它的應用範圍包括從自動駕駛汽車中的物體分類到醫療行業中的血細胞識別,從製造業中的缺陷物品識別到建立可以對戴口罩與否的人進行分類的系統。在所有這些行業中,圖像分類都以一種或另一種方式使用。他們是如何做到的呢?他們使用哪個框架?