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