深度学习与TensorFlow
深度學習與TensorFlow
DNN(深度神經網絡算法)現在是AI社區的流行詞。最近,DNN 在許多數據科學競賽/Kaggle 競賽中獲得了多次冠軍。
自從 1962 年 Rosenblat 提出感知機(Perceptron)以來,DNN 的概念就已經出現了,而自 Rumelhart、Hinton 和 Williams 在 1986 年發現了梯度下降算法后,DNN 的概念就變得可行了。直到最近 DNN 才成為全世界 AI/ML 愛好者和工程師的最愛。
主要原因在于現代計算能力的可用性,如 GPU 和 TensorFlow 等工具,可以通過幾行代碼輕松訪問 GPU 并構建復雜的神經網絡。
作為一名機器學習愛好者,必須熟悉神經網絡和深度學習的概念,但為了完整起見,將在這里介紹基礎知識,并探討 TensorFlow 的哪些特性使其成為深度學習的熱門選擇。
神經網絡是一個生物啟發式的計算和學習模型。像生物神經元一樣,它們從其他細胞(神經元或環境)獲得加權輸入。這個加權輸入經過一個處理單元并產生可以是二進制或連續(概率,預測)的輸出。
人工神經網絡(ANN)是這些神經元的網絡,可以隨機分布或排列成一個分層結構。這些神經元通過與它們相關的一組權重和偏置來學習。
下圖對生物神經網絡和人工神經網絡的相似性給出了形象的對比:
圖 1 生物神經網絡和人工神經網絡的相似性
根據 Hinton 等人的定義,深度學習
(https://www.cs.toronto.edu/~hinton/absps/NatureDeepReview.pdf)是由多個處理層(隱藏層)組成的計算模型。層數的增加會導致學習時間的增加。由于數據量龐大,學習時間進一步增加,現今的 CNN 或生成對抗網絡(GAN)的規范也是如此。
因此,為了實際實現 DNN,需要高計算能力。NVDIA 公司 GPU 的問世使其變得可行,隨后 Google 的 TensorFlow 使得實現復雜的 DNN 結構成為可能,而不需要深入復雜的數學細節,大數據集的可用性為 DNN 提供了必要的數據來源。
TensorFlow 成為最受歡迎的深度學習庫,原因如下:
- TensorFlow 是一個強大的庫,用于執行大規模的數值計算,如矩陣乘法或自動微分。這兩個計算是實現和訓練 DNN 所必需的。
- TensorFlow 在后端使用 C/C++,這使得計算速度更快。
- TensorFlow 有一個高級機器學習 API(tf.contrib.learn),可以更容易地配置、訓練和評估大量的機器學習模型。
- 可以在 TensorFlow 上使用高級深度學習庫 Keras。Keras 非常便于用戶使用,并且可以輕松快速地進行原型設計。它支持各種 DNN,如RNN、CNN,甚至是兩者的組合。
任何深度學習網絡都由四個重要部分組成:數據集、定義模型(網絡結構)、訓練/學習和預測/評估??梢栽?TensorFlow 中實現所有這些。
數據集
DNN 依賴于大量的數據。可以收集或生成數據,也可以使用可用的標準數據集。TensorFlow 支持三種主要的讀取數據的方法,可以在不同的數據集中使用;本教程中用來訓練建立模型的一些數據集介紹如下:
? MNIST:這是最大的手寫數字(0~9)數據庫。它由 60000 個示例的訓練集和 10000 個示例的測試集組成。該數據集存放在 Yann LeCun 的主頁(http://yann.lecun.com/exdb/mnist/)中。這個數據集已經包含在tensorflow.examples.tutorials.mnist 的 TensorFlow 庫中。
? CIFAR10:這個數據集包含了 10 個類別的 60000 幅 32×32 彩色圖像,每個類別有 6000 幅圖像。其中訓練集包含 50000 幅圖像,測試數據集包含 10000 幅圖像。數據集的 10 個類別分別是:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船和卡車。該數據由多倫多大學計算機科學系維護(https://www.cs.toronto.edu/kriz/cifar.html)。
? WORDNET:這是一個英文的詞匯數據庫。它包含名詞、動詞、副詞和形容詞,被歸為一組認知同義詞(Synset),即代表相同概念的詞語,例如 shut 和 close,car 和 automobile 被分組為無序集合。它包含 155287 個單詞,組織在 117659 個同義詞集合中,總共 206941 個單詞對。該數據集由普林斯頓大學維護(https://wordnet.princeton.edu/)。
? ImageNET:這是一個根據 WORDNET 層次組織的圖像數據集(目前只有名詞)。每個有意義的概念(synset)由多個單詞或單詞短語來描述。每個子空間平均由 1000 幅圖像表示。目前共有 21841 個同義詞,共有 14197122 幅圖像。自 2010 年以來,每年舉辦一次 ImageNet 大規模視覺識別挑戰賽(ILSVRC),將圖像分類到 1000 個對象類別中。這項工作是由美國普林斯頓大學、斯坦福大學、A9 和谷歌贊助(http://www.image-net.org/)。
? YouTube-8M:這是一個由數百萬 YouTube 視頻組成的大型標簽視頻數據集。它有大約 700 萬個 YouTube 視頻網址,分為 4716 個小類,并分為 24 個大類。它還提供預處理支持和框架功能。數據集由 Google Research(https://research.google.com/youtube8m/)維護。
讀取數據
在 TensorFlow 中可以通過三種方式讀取數據: - 通過feed_dict傳遞數據;
- 從文件中讀取數據;
- 使用預加載的數據;
本文使用這三種方式來讀取數據。
接下來,將依次學習每種數據讀取方式。
通過feed_dict傳遞數據
在這種情況下,運行每個步驟時都會使用 run() 或 eval() 函數調用中的 feed_dict 參數來提供數據。這是在占位符的幫助下完成的,這個方法允許傳遞 Numpy 數組數據??梢允褂?TensorFlow 的以下代碼:
這里,x 和 y 是占位符;使用它們,在 feed_dict 的幫助下傳遞包含 X 值的數組和包含 Y 值的數組。
從文件中讀取
當數據集非常大時,使用此方法可以確保不是所有數據都立即占用內存(例如 60 GB的 YouTube-8m 數據集)。從文件讀取的過程可以通過以下步驟完成:
? 使用字符串張量 [“file0”,“file1”] 或者 [("file%d"i)for in in range(2)] 的方式創建文件命名列表,或者使用 files=tf.train.match_filenames_once(’*.JPG’) 函數創建。
? 文件名隊列:創建一個隊列來保存文件名,此時需要使用 tf.train.string_input_producer 函數:
這個函數還提供了一個選項來排列和設置批次的最大數量。整個文件名列表被添加到每個批次的隊列中。如果選擇了 shuffle=True,則在每個批次中都要重新排列文件名。
? Reader用于從文件名隊列中讀取文件。根據輸入文件格式選擇相應的閱讀器。read方法是標識文件和記錄(調試時有用)以及標量字符串值的關鍵字。例如,文件格式為.csv 時:
? Decoder:使用一個或多個解碼器和轉換操作來將值字符串解碼為構成訓練樣本的張量:
預加載的數據
當數據集很小時可以使用,可以在內存中完全加載。因此,可以將數據存儲在常量或變量中。在使用變量時,需要將可訓練標志設置為 False,以便訓練時數據不會改變。預加載數據為 TensorFlow 常量時:
一般來說,數據被分為三部分:訓練數據、驗證數據和測試數據。
定義模型
建立描述網絡結構的計算圖。它涉及指定信息從一組神經元到另一組神經元的超參數、變量和占位符序列以及損失/錯誤函數。
訓練/學習
在 DNN 中的學習通?;谔荻认陆邓惴?#xff08;后續章節將詳細討論),其目的是要找到訓練變量(權重/偏置),將損失/錯誤函數最小化。這是通過初始化變量并使用 run() 來實現的:
評估模型
一旦網絡被訓練,通過 predict() 函數使用驗證數據和測試數據來評估網絡。這可以評價模型是否適合相應數據集,可以避免過擬合或欠擬合的問題。一旦模型取得讓人滿意的精度,就可以部署在生產環境中了。
拓展閱讀
在 TensorFlow 1.3 中,增加了一個名為 TensorFlow Estimator 的新功能。 TensorFlow Estimator 使創建神經網絡模型的任務變得更加容易,它是一個封裝了訓練、評估、預測和服務過程的更高層次的API。它提供了使用預先制作的估算器的選項,或者可以編寫自己的定制估算器。通過預先制定的估算器,不再需要擔心構建計算或創建會話,它會處理所有這些。
目前 TensorFlow Estimator 有 6 個預先制定的估算器。使用 TensorFlow 預制的 Estimator 的另一個優點是,它本身也可以在 TensorBoard 上創建可視化的摘要。
總結
以上是生活随笔為你收集整理的深度学习与TensorFlow的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow指定CPU和GPU方
- 下一篇: TensorFlow常用Python扩展