日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

TensorFlow和深度学习-无需博士学位(TensorFlow and deep learning without a PhD)

發(fā)布時(shí)間:2023/12/15 pytorch 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TensorFlow和深度学习-无需博士学位(TensorFlow and deep learning without a PhD) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 概述

原文地址:

TensorFlow and deep learning,without a PhD

Learn TensorFlow and deep learning, without a Ph.D.

B站視頻地址:

https://www.bilibili.com/video/av8284296

https://www.bilibili.com/video/av16339227


在這個(gè)codelab中,您將學(xué)習(xí)如何創(chuàng)建和訓(xùn)練識(shí)別手寫數(shù)字的神經(jīng)網(wǎng)絡(luò)。一路上,隨著你增強(qiáng)神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確率達(dá)到99%,你還將學(xué)習(xí)到專業(yè)人員用來(lái)訓(xùn)練模型的高效工具。

該codelab使用MNIST數(shù)據(jù)集,收集了60,000個(gè)標(biāo)記的數(shù)字。你將學(xué)會(huì)用不到100行Python / TensorFlow代碼來(lái)解決深度學(xué)習(xí)問(wèn)題。

你會(huì)學(xué)到什么

  • 什么是神經(jīng)網(wǎng)絡(luò)和如何訓(xùn)練它
  • 如何使用TensorFlow構(gòu)建基本的1層神經(jīng)網(wǎng)絡(luò)
  • 如何添加更多的神經(jīng)網(wǎng)絡(luò)層數(shù)
  • 訓(xùn)練技巧和竅門:過(guò)度擬合(overfitting),丟失信息(dropout),學(xué)習(xí)速率衰退(learning rate decay)…
  • 如何排查深層神經(jīng)網(wǎng)絡(luò)的故障
  • 如何構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)(convolutional networks)

你需要什么

  • Python 2或3(推薦Python 3)
  • TensorFlow
  • Matplotlib(Python可視化庫(kù))

安裝說(shuō)明在實(shí)驗(yàn)室的下一步中給出。

2. 準(zhǔn)備:安裝TensorFlow,獲取示例代碼

在您的計(jì)算機(jī)上安裝必要的軟件:Python,TensorFlow和Matplotlib。這里給出了完整的安裝說(shuō)明:INSTALL.txt

從GitHub的信息庫(kù),克隆源代碼(也可以直接登入這個(gè)網(wǎng)址,直接下載)

git clone https://github.com/martin-gorner/tensorflow-mnist-tutorial

下載的文件夾中含多個(gè)文件。首先是讓mnist_1.0_softmax.py運(yùn)行起來(lái)。其他很多文件是用于加載數(shù)據(jù)和可視化結(jié)果的解決方案或支持代碼。

當(dāng)您啟動(dòng)初始python腳本時(shí),您應(yīng)該看到一個(gè)實(shí)時(shí)可視化的培訓(xùn)過(guò)程:

python3 mnist_1.0_softmax.py

如果python3 mnist_1.0_softmax.py不起作用,用python命令:

python mnist_1.0_softmax.py

疑難解答:如果無(wú)法使實(shí)時(shí)可視化運(yùn)行,或者您只希望僅使用文本輸出,則可以通過(guò)注釋掉一行并取消注釋另一行來(lái)取消激活可視化。請(qǐng)參閱下載文件的底部的說(shuō)明。

為TensorFlow構(gòu)建的可視化工具是TensorBoard。其功能比我們本次教程中所需要的更多。它可以在遠(yuǎn)程服務(wù)器上跟蹤您的分布式TensorFlow作業(yè)。對(duì)于我們?cè)谶@個(gè)實(shí)驗(yàn)中我們只需要matplotlib的結(jié)果,能看到訓(xùn)練過(guò)程的實(shí)時(shí)動(dòng)畫,就當(dāng)是個(gè)附帶的獎(jiǎng)勵(lì)吧。但是,如果您需要使用TensorFlow進(jìn)行跟蹤工作,請(qǐng)確保查看TensorBoard。

3. 理論:訓(xùn)練神經(jīng)網(wǎng)絡(luò)

我們將首先觀察正在接受訓(xùn)練的神經(jīng)網(wǎng)絡(luò)。代碼將在下一節(jié)中進(jìn)行說(shuō)明,因此您先不需要看。

我們的用神經(jīng)網(wǎng)絡(luò)訓(xùn)練手寫數(shù)字,并對(duì)它們進(jìn)行分類,即將手寫數(shù)字識(shí)別為0,1,2等等,最多為9。它的模型基于內(nèi)部變量(“權(quán)重”(weights)和“偏差”(biases),這兩個(gè)詞稍后解釋),只有將這些變量訓(xùn)練成正確值,分類工作才能正確進(jìn)行,訓(xùn)練方式稍后也會(huì)詳細(xì)解釋。現(xiàn)在您需要知道的是,訓(xùn)練循環(huán)如下所示:

訓(xùn)練數(shù)據(jù) => 更新權(quán)重和偏差 => 更好的識(shí)別 (循環(huán)這三步)

讓我們逐個(gè)瀏覽可視化的六個(gè)面板,看看訓(xùn)練神經(jīng)網(wǎng)絡(luò)需要什么。

在這里,您可以看到100個(gè)訓(xùn)練數(shù)字被送入訓(xùn)練循環(huán),注意是一次100個(gè)數(shù)字,這圖顯示的是這100個(gè)手寫數(shù)據(jù)被訓(xùn)練的結(jié)果。在目前的訓(xùn)練狀態(tài)下,神經(jīng)網(wǎng)絡(luò)已經(jīng)能識(shí)別(包括白色背景和部分?jǐn)?shù)字),當(dāng)然也有些是識(shí)別錯(cuò)誤的(圖中紅色背景的是計(jì)算機(jī)識(shí)別錯(cuò)誤的手寫數(shù)字,左側(cè)小打印的數(shù)字是該書寫字的正確標(biāo)簽,右側(cè)小打印的數(shù)字是計(jì)算機(jī)標(biāo)識(shí)別的錯(cuò)誤標(biāo)簽)。

該數(shù)據(jù)集中有50,000個(gè)訓(xùn)練數(shù)字。我們?cè)诿看蔚袑⑵渲忻?00個(gè)進(jìn)行訓(xùn)練,因此系統(tǒng)將在500次迭代后看到所有數(shù)字被訓(xùn)練了一次。我們稱之為“紀(jì)元(epoch)”。


為了測(cè)試訓(xùn)練好后模型的識(shí)別質(zhì)量,我們必須使用系統(tǒng)在訓(xùn)練期間沒(méi)有用到過(guò)的手寫數(shù)字。否則,模型可能會(huì)識(shí)別所有已訓(xùn)練的數(shù)字,但仍然不能識(shí)別我剛才新寫的數(shù)字“8”。MNIST數(shù)據(jù)集中包含10,000個(gè)測(cè)試手寫數(shù)字。在這圖里,您可以看到大約1000個(gè)數(shù)字,其中所有被識(shí)別錯(cuò)誤的,都放在頂部(紅色背景上)。圖左側(cè)的比例可以大致表示分類器的準(zhǔn)確性。


為了開展訓(xùn)練,我們將定義一個(gè)損失函數(shù),即代表系統(tǒng)識(shí)別數(shù)字的程度值,并嘗試將其最小化。損失函數(shù)的選擇(這里是“交叉熵(cross-entropy)”)將在后面解釋。您在這里看到的是,隨著訓(xùn)練的進(jìn)展,訓(xùn)練和測(cè)試數(shù)據(jù)的損失都會(huì)下降:這是好的。這意味著神經(jīng)網(wǎng)絡(luò)正在學(xué)習(xí)。X軸表示通過(guò)學(xué)習(xí)循環(huán)的迭代次數(shù)。


準(zhǔn)確性只是正確識(shí)別的數(shù)字的百分比。這是在訓(xùn)練和測(cè)試集上計(jì)算的。如果訓(xùn)練順利,你會(huì)看到它上升。

最后兩個(gè)圖代表了內(nèi)部變量采用的所有值的范圍,即隨著訓(xùn)練的進(jìn)行,權(quán)重和偏差。在這里,您可以看到,偏差最初從0開始,最終獲得的值大致均勻分布在-1.5和1.5之間。如果系統(tǒng)不能很好地收斂,這些圖可能很有用。如果你看到權(quán)重和偏差擴(kuò)展到100或1000,訓(xùn)練可能就有問(wèn)題了。

圖中的方格代表是百分位數(shù)。有7個(gè)頻帶,所以每個(gè)頻帶是100/7 =所有值的14%。

Keyboard shortcuts for the visualisation GUI:
1 ……… display 1st graph only
2 ……… display 2nd graph only
3 ……… display 3rd graph only
4 ……… display 4th graph only
5 ……… display 5th graph only
6 ……… display 6th graph only
7 ……… display graphs 1 and 2
8 ……… display graphs 4 and 5
9 ……… display graphs 3 and 6
ESC or 0 .. back to displaying all graphs
SPACE ….. pause/resume
O ……… box zoom mode (then use mouse)
H ……… reset all zooms
Ctrl-S …. save current image

什么是“ 權(quán)重 ”和“ 偏差 ”?如何計(jì)算“ 交叉熵 ”?訓(xùn)練算法究竟如何工作?那么來(lái)看下一節(jié)內(nèi)容吧。

4. 理論:1層神經(jīng)網(wǎng)絡(luò)


MNIST數(shù)據(jù)集中的手寫數(shù)字是28x28像素的灰度圖像。對(duì)于它們進(jìn)行分類的最簡(jiǎn)單方法是使用28x28 = 784像素作為第1層神經(jīng)網(wǎng)絡(luò)的輸入。

神經(jīng)網(wǎng)絡(luò)中的每個(gè)“神經(jīng)元”都會(huì)對(duì)其所有輸入進(jìn)行加權(quán)和,增加一個(gè)稱為“偏差”的常量,然后通過(guò)一些非線性激活函數(shù)來(lái)提取結(jié)果。

在這里,我們?cè)O(shè)計(jì)了一個(gè)具有10個(gè)神經(jīng)元的1層神經(jīng)網(wǎng)絡(luò),作為輸出層,因?yàn)槲覀兿雽?shù)字分為10個(gè)類(0到9),每個(gè)神經(jīng)元都能分類處一個(gè)類。

對(duì)于一個(gè)分類問(wèn)題,一個(gè)很好的激活函數(shù)是softmax。通過(guò)取每個(gè)元素的指數(shù),然后歸一化向量(使用任何范數(shù),例如向量的普通歐幾里德長(zhǎng)度)來(lái)對(duì)向量應(yīng)用softmax。

為什么“softmax”稱為softmax?指數(shù)是急劇增長(zhǎng)的函數(shù)。它將增加向量元素之間的差異。它也快速產(chǎn)生大的值。然后,當(dāng)您規(guī)范化向量時(shí),支配規(guī)范的最大元素將被歸一化為接近1的值,而所有其他元素將最終除以一個(gè)較大的值,并歸一化為接近零的值。清楚地顯示出哪個(gè)是最大的元素,即“最大值”,但保留其價(jià)值的原始相對(duì)順序,因此是“soft”。

我們現(xiàn)在將使用矩陣乘法將這個(gè)單層神經(jīng)元的處理過(guò)程,用一個(gè)簡(jiǎn)單的公式表示。讓我們直接用100張手寫圖片作為輸入(如圖中黑灰方塊圖所示,每行表示一張圖片的784個(gè)像素值),產(chǎn)生100個(gè)預(yù)測(cè)(10個(gè)向量)作為輸出。

使用加權(quán)矩陣W中的第一列加權(quán),我們計(jì)算第一張圖像的所有像素的加權(quán)和。這個(gè)和值對(duì)應(yīng)于第一個(gè)神經(jīng)元。使用第二列權(quán)重,我們對(duì)第二個(gè)神經(jīng)元做同樣的事情,直到第10個(gè)神經(jīng)元。然后,我們可以重復(fù)對(duì)剩余99張圖像的操作。如果我們稱X為包含我們100個(gè)圖像的矩陣,則在100個(gè)圖像上計(jì)算的我們10個(gè)神經(jīng)元的所有加權(quán)和僅僅是XW(矩陣乘法)。

每個(gè)神經(jīng)元現(xiàn)在必須加上它的偏差(一個(gè)常數(shù))。由于我們有10個(gè)神經(jīng)元,我們有10個(gè)偏置常數(shù)。我們將這個(gè)10個(gè)值的向量稱為b。必須將其添加到先前計(jì)算的矩陣的每一行。使用一些名為“廣播(broadcasting)”的方法,我們用簡(jiǎn)單的加號(hào)寫下來(lái)。

“ 廣播(broadcasting) ”是Python和numpy的標(biāo)準(zhǔn)技巧,它是科學(xué)計(jì)算庫(kù)里的內(nèi)容。它擴(kuò)展了正常操作對(duì)具有不兼容尺寸的矩陣的作用范圍。“廣播添加”是指“如果要相加兩個(gè)矩陣,但是由于其尺寸不兼容,請(qǐng)嘗試根據(jù)需要復(fù)制小尺寸以使其能相加。”

我們最后應(yīng)用softmax激活函數(shù),得到描述1層神經(jīng)網(wǎng)絡(luò)的公式,應(yīng)用于100幅圖像:

順便說(shuō)一下,什么是“ 張量(tensor) ”?
“張量(tensor)”就像一個(gè)矩陣,但是具有任意數(shù)量的維度。一維張量是向量。二維張量是矩陣。然后,您可以有3,4,5或更多維度的張量。

5. 理論:梯度下降

現(xiàn)在我們的神經(jīng)網(wǎng)絡(luò)產(chǎn)生了輸入圖像的預(yù)測(cè),我們需要測(cè)量它們的好壞,即網(wǎng)絡(luò)告訴我們與我們所知道的真相之間的距離。請(qǐng)記住,我們?yōu)榇藬?shù)據(jù)集中的所有圖像的數(shù)字都有正確數(shù)字的標(biāo)簽。

任何距離都會(huì)有效,普通的歐幾里得距離很好,但是對(duì)于分類問(wèn)題,一個(gè)距離,稱為“交叉熵(cross-entropy)”更有效率。

“ 一熱(One-hot) ”編碼意味著您使用10個(gè)值的矢量代表標(biāo)簽“6”,全部為零,但第6個(gè)值為1.這是因?yàn)楦袷椒浅n愃朴谖覀兊纳窠?jīng)網(wǎng)絡(luò)輸出預(yù)測(cè),也作為10個(gè)值的向量。

“訓(xùn)練”神經(jīng)網(wǎng)絡(luò)實(shí)際上意味著使用訓(xùn)練圖像和標(biāo)簽來(lái)調(diào)整權(quán)重和偏差,以便最小化交叉熵?fù)p失函數(shù)。下面是它的工作原理。

交叉熵是訓(xùn)練圖像的權(quán)重,偏差,像素及其已知標(biāo)簽的函數(shù)。

如果我們相對(duì)于所有權(quán)重和所有偏差計(jì)算交叉熵的偏導(dǎo)數(shù),我們獲得了對(duì)于給定圖像,權(quán)重和偏差的標(biāo)簽和現(xiàn)值計(jì)算的“梯度(gradient)”。記住,我們有7850個(gè)權(quán)重和偏差,所以計(jì)算梯度聽起來(lái)好像有很多工作。幸運(yùn)的是,TensorFlow將為我們做好準(zhǔn)備。

梯度的數(shù)學(xué)屬性是它指向“上”。由于我們想要走交叉熵低的地方,所以我們走向相反的方向。我們將權(quán)重和偏差更新一小部分梯度,并使用下一批訓(xùn)練圖像再次執(zhí)行相同的操作。希望這讓我們到達(dá)交叉熵最小的坑底。

在該圖中,交叉熵表示為2個(gè)權(quán)重的函數(shù)。實(shí)際上還有更多的。梯度下降算法遵循最快速下降到局部最小值的路徑。訓(xùn)練圖像也會(huì)在每次迭代中更改,以便我們收斂到適用于所有圖像的局部最小值。

“ 學(xué)習(xí)率”:您無(wú)法在每次迭代時(shí)以漸變的整個(gè)長(zhǎng)度更新您的權(quán)重和偏差。這就好比是一個(gè)穿著靴子的人,想去一個(gè)山谷的底部。他會(huì)從山谷的一邊跳到另一邊。要進(jìn)入底部,他需要執(zhí)行較小的步驟,即僅使用漸變的一小部分,通常在1/1000。我們將這個(gè)分?jǐn)?shù)稱為“學(xué)習(xí)率”。

總而言之,訓(xùn)練循環(huán)如下所示:

訓(xùn)練數(shù)據(jù)和標(biāo)簽 => 求損失函數(shù)=> 求梯度 (偏導(dǎo)數(shù)) => 最快下降 => 更新權(quán)重和偏差 => 重復(fù)下一個(gè)小批量的圖像數(shù)據(jù)和標(biāo)簽

為什么要使用100個(gè)圖像和標(biāo)簽,用這種“ 小批量 ”形式進(jìn)行?

您只需一個(gè)示例圖像即可計(jì)算您的漸變,并立即更新權(quán)重和偏差(在文獻(xiàn)中稱為“隨機(jī)梯度下降”)。這樣做100個(gè)例子給出了更好地表示不同示例圖像所施加的約束的漸變,因此可能更快地收斂到解決方案。小批量的尺寸是可調(diào)參數(shù)。還有另一個(gè)更技術(shù)的原因:使用大批量也意味著使用更大的矩陣,這些通常更容易在GPU上進(jìn)行優(yōu)化。

經(jīng)常問(wèn)的問(wèn)題


為什么交叉熵能正確的用于分類問(wèn)題?

6. 實(shí)驗(yàn)室:讓我們跳入代碼

已經(jīng)寫了1層神經(jīng)網(wǎng)絡(luò)的代碼。請(qǐng)打開mnist_1.0_softmax.py文件并按照說(shuō)明進(jìn)行操作。

您在本節(jié)中的任務(wù)是了解此起始代碼,以便以后可以改進(jìn)。

您應(yīng)該看到文件中的說(shuō)明和代碼之間只有微小的區(qū)別。它們對(duì)應(yīng)于用于可視化的功能,并在注釋中做了說(shuō)明。你可以忽略它們。

mnist_1.0_softmax.py

import tensorflow as tfX = tf.placeholder(tf.float32, [None, 28, 28, 1]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10]))init = tf.initialize_all_variables()

首先我們定義TensorFlow變量和占位符。變量是您希望訓(xùn)練算法為您確定的所有參數(shù)。在我們的情況下,我們的權(quán)重和偏見。

占位符是在訓(xùn)練期間填充實(shí)際數(shù)據(jù)的參數(shù),通常是訓(xùn)練圖像。保持訓(xùn)練圖像的張量的形狀是[None,28,28,1],代表:

  • 28,28,1:我們的圖像是每像素28x28像素x 1值(灰度)。彩色圖像的最后一個(gè)數(shù)字將為3,這里并不需要。
  • None:此維度將是迷你批次中的圖像數(shù)量。這將在訓(xùn)練時(shí)知道。

mnist_1.0_softmax.py

# model Y = tf.nn.softmax(tf.matmul(tf.reshape(X, [-1, 784]), W) + b) # placeholder for correct labels Y_ = tf.placeholder(tf.float32, [None, 10])# loss function cross_entropy = -tf.reduce_sum(Y_ * tf.log(Y))# % of correct answers found in batch is_correct = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1)) accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

第一行是我們的1層神經(jīng)網(wǎng)絡(luò)的模型。公式是我們?cè)谝郧暗睦碚摬糠种薪⒌墓健T搕f.reshape命令將我們的28x28圖像轉(zhuǎn)換為784像素的單個(gè)向量。重塑命令中的“-1”表示“計(jì)算機(jī),計(jì)算出來(lái),只有一種可能性”。實(shí)際上,這將是一個(gè)小批量的圖像數(shù)量。

然后,我們需要一個(gè)附加的占位符,用于提供與培訓(xùn)圖像一起的標(biāo)簽數(shù)據(jù)。

現(xiàn)在,我們有模型預(yù)測(cè)和正確的標(biāo)簽,所以我們可以計(jì)算交叉熵。tf.reduce_sum總和一個(gè)向量的所有元素。

最后兩行計(jì)算正確識(shí)別的數(shù)字的百分比。留給讀者使用TensorFlow API參考書,以供讀者理解。你也可以跳過(guò)它們。

mnist_1.0_softmax.py

optimizer = tf.train.GradientDescentOptimizer(0.003) train_step = optimizer.minimize(cross_entropy)

這里將是TensorFlow展示它能力的時(shí)候了。您選擇一個(gè)優(yōu)化器(有很多可用),并要求它最小化交叉熵?fù)p失。在此步驟中,TensorFlow計(jì)算相對(duì)于所有權(quán)重和所有偏差(梯度)的損失函數(shù)的偏導(dǎo)數(shù)。這是一個(gè)正式的推導(dǎo),而不是一個(gè)數(shù)字化的,太費(fèi)時(shí)間了。

然后使用梯度來(lái)更新權(quán)重和偏差。0.003是學(xué)習(xí)率。

最后,現(xiàn)在是運(yùn)行訓(xùn)練循環(huán)的時(shí)候了。到目前為止,所有的TensorFlow指令都已經(jīng)在內(nèi)存中準(zhǔn)備了一個(gè)計(jì)算圖,但還沒(méi)有計(jì)算出來(lái)。

TensorFlow的“延遲執(zhí)行”模型:TensorFlow是為分布式計(jì)算構(gòu)建的。在開始實(shí)際將計(jì)算任務(wù)發(fā)送到各種計(jì)算機(jī)之前,必須知道要計(jì)算的內(nèi)容,即執(zhí)行圖。這就是為什么它有一個(gè)延遲執(zhí)行模型,您首先使用TensorFlow函數(shù)在內(nèi)存中創(chuàng)建計(jì)算圖,然后開始Session執(zhí)行并使用實(shí)際的計(jì)算Session.run。在這一點(diǎn)上,計(jì)算圖不能再改變了。

由于該模式,TensorFlow可以接管大量的分布式計(jì)算流。例如,如果您指示在計(jì)算機(jī)1上運(yùn)行一部分計(jì)算,并在計(jì)算機(jī)2上運(yùn)行另一部分,則可以自動(dòng)進(jìn)行必要的數(shù)據(jù)傳輸。

計(jì)算需要將實(shí)際數(shù)據(jù)輸入到您在TensorFlow代碼中定義的占位符。這是以Python字典的形式提供的,其中的鍵值是占位符的名稱。

mnist_1.0_softmax.py

sess = tf.Session() sess.run(init)for i in range(1000):# load batch of images and correct answersbatch_X, batch_Y = mnist.train.next_batch(100)train_data={X: batch_X, Y_: batch_Y}# trainsess.run(train_step, feed_dict=train_data)

在train_step當(dāng)我們問(wèn)到TensorFlow出最小交叉熵是這里執(zhí)行獲得。那就是計(jì)算梯度并更新權(quán)重和偏差的步驟。

最后,我們還需要計(jì)算一些可以顯示的值,以便我們可以跟蹤我們模型的性能。

在訓(xùn)練循環(huán)中使用該代碼訓(xùn)練數(shù)據(jù)計(jì)算精度和交叉熵(例如每10次迭代):

# success ? a,c = sess.run([accuracy, cross_entropy], feed_dict=train_data)

通過(guò)提供測(cè)試訓(xùn)練數(shù)據(jù),可以在測(cè)試數(shù)據(jù)上計(jì)算相同的數(shù)值(例如,每100次重復(fù)一次,有10,000個(gè)測(cè)試數(shù)字,因此需要一些CPU時(shí)間):

# success on test data ? test_data={X: mnist.test.images, Y_: mnist.test.labels} a,c = sess.run([accuracy, cross_entropy], feed=test_data)

TensorFlow和NumPy的是朋友:準(zhǔn)備計(jì)算圖時(shí),你只有操縱TensorFlow張量和如命令tf.matmul,tf.reshape等等。

然而,一旦執(zhí)行Session.run命令,它返回的值就是Numpy張量,即Numpy numpy.ndarray可以使用的對(duì)象以及基于它的所有科學(xué)comptation庫(kù)。這就是使用matplotlib(這是基于Numpy的標(biāo)準(zhǔn)Python繪圖庫(kù))為這個(gè)實(shí)驗(yàn)室建立的實(shí)時(shí)可視化。

7. 實(shí)驗(yàn)室:添加圖層


為了提高識(shí)別精度,我們將為神經(jīng)網(wǎng)絡(luò)添加更多層數(shù)。第二層中的神經(jīng)元,而不是計(jì)算像素的加權(quán)和,將計(jì)算來(lái)自上一層的神經(jīng)元輸出的加權(quán)和。這里是一個(gè)5層完全連接的神經(jīng)網(wǎng)絡(luò):

我們保持softmax作為最后一層的激活功能,因?yàn)檫@是最適合分類的。在中間層上,我們將使用最經(jīng)典的激活函數(shù):sigmoid:

您在本節(jié)中的任務(wù)是將一個(gè)或兩個(gè)中間層添加到您的模型中以提高其性能。

解決方案可以在文件中找到mnist_2.0_five_layers_sigmoid.py。使用它,如果你不能寫出來(lái),被卡住了!

要添加圖層,您需要一個(gè)額外的權(quán)重矩陣和中間層的附加偏置向量:

W1 = tf.Variable(tf.truncated_normal([28*28, 200] ,stddev=0.1)) B1 = tf.Variable(tf.zeros([200]))W2 = tf.Variable(tf.truncated_normal([200, 10], stddev=0.1)) B2 = tf.Variable(tf.zeros([10]))

權(quán)重矩陣的形狀是[N,M],其中N是層的輸入數(shù)量和M的輸出。在上面的代碼中,我們?cè)谥虚g層中使用了200個(gè)神經(jīng)元,在最后一層使用了10個(gè)神經(jīng)元。

提示:當(dāng)你深入時(shí),重要的是用隨機(jī)值初始化權(quán)重。如果沒(méi)有,優(yōu)化器可能會(huì)停留在初始位置。tf.truncated_normal是一個(gè)TensorFlow函數(shù),它產(chǎn)生遵循-2* stddev和+ 2 * stddev之間的正態(tài)(高斯)分布的隨機(jī)值。

現(xiàn)在將1層模型更改為2層模型:

XX = tf.reshape(X, [-1, 28*28])Y1 = tf.nn.sigmoid(tf.matmul(XX, W1) + B1) Y = tf.nn.softmax(tf.matmul(Y1, W2) + B2)

您現(xiàn)在應(yīng)該可以使用2個(gè)中間層(例如200和100個(gè)神經(jīng)元)將精度推送到97%以上的精度。

8. 實(shí)驗(yàn)室:深度網(wǎng)絡(luò)的特別照顧


隨著層次的增加,神經(jīng)網(wǎng)絡(luò)趨向于收斂更多困難。但我們今天知道如何使他們的工作。如下圖,如果您看到這樣的精度曲線,本節(jié)將對(duì)您有所幫助:

Relu激活功能
在深層網(wǎng)絡(luò)中,S形激活函數(shù)(sigmoid函數(shù))實(shí)際上是相當(dāng)有問(wèn)題的。它壓縮0和1之間的所有值,當(dāng)您反復(fù)進(jìn)行時(shí),神經(jīng)元輸出及其漸變可以完全消失。改進(jìn)的方法,可以使用如下所示的RELU函數(shù)(整流線性單元):

更新1/4:現(xiàn)在用RELU替換所有的S型,并且在加入圖層時(shí),您將獲得更快的初始收斂,避免出現(xiàn)問(wèn)題。只需在你的代碼中簡(jiǎn)單更換tf.nn.sigmoid用tf.nn.relu。

一個(gè)更好的優(yōu)化器
在這樣的非常高的維度空間中,我們有10K的權(quán)重和偏差 - “鞍點(diǎn)”是頻繁的。這些是不是局部最小值的點(diǎn),但梯度仍然為零,梯度下降優(yōu)化器仍然停留在那里。TensorFlow擁有一系列可用的優(yōu)化器,其中包括一些可以使用一定慣量的優(yōu)化器,并可以安全避開鞍點(diǎn)。

更新2/4:替換tf.train.GradientDescentOptimiser為tf.train.AdamOptimizer現(xiàn)在。

隨機(jī)初始化

精確度仍然在0.1?你用隨機(jī)值初始化了你的權(quán)重嗎?對(duì)于偏差,當(dāng)使用RELU時(shí),最佳做法是將其初始化為小的正值,以使神經(jīng)元最初在RELU的非零范圍內(nèi)運(yùn)行。

W = tf.Variable(tf.truncated_normal([K, L] ,stddev=0.1)) B = tf.Variable(tf.ones([L])/10)

更新3/4:現(xiàn)在檢查所有的權(quán)重和偏差是否適當(dāng)初始化。如上圖所示的0.1將作為初始偏差。

NaN ???

如果您看到準(zhǔn)確度曲線崩潰,并且控制臺(tái)輸出NaN作為交叉熵,請(qǐng)不要驚慌,您正在嘗試計(jì)算一個(gè)不是數(shù)(NaN)的值(0)。請(qǐng)記住,交叉熵涉及在softmax層的輸出上計(jì)算的日志。由于softmax本質(zhì)上是一個(gè)指數(shù),從不為零,所以我們應(yīng)該很好,但使用32位精度浮點(diǎn)運(yùn)算,exp(-100)已經(jīng)是一個(gè)真正的零。說(shuō)白了就是,小數(shù)點(diǎn)后0太多,超出計(jì)算機(jī)精度,計(jì)算機(jī)將其判斷為0,并作了分母,然后就出現(xiàn)這種現(xiàn)象。

幸運(yùn)的是,TensorFlow具有一個(gè)方便的功能,可以在數(shù)字穩(wěn)定的方式下實(shí)現(xiàn)單步驟中的softmax和交叉熵。要使用它,您需要在應(yīng)用softmax之前,將最后一層的原始加權(quán)和加上偏差取對(duì)數(shù)(logits)。

如果您的模型的最后一行是:

Y = tf.nn.softmax(tf.matmul(Y4, W5) + B5)

您需要更換它:

Ylogits = tf.matmul(Y4, W5) + B5 Y = tf.nn.softmax(Ylogits)

現(xiàn)在,您可以以安全的方式計(jì)算交叉熵:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(Ylogits, Y_)

還添加這條線,使測(cè)試和訓(xùn)練交叉熵達(dá)到相同的顯示尺度:

cross_entropy = tf.reduce_mean(cross_entropy)*100

更新4/4:請(qǐng)?zhí)砑觮f.nn.softmax_cross_entropy_with_logits到您的代碼。您也可以跳過(guò)此步驟,當(dāng)您在輸出中實(shí)際看到NaN時(shí),可以回到該步驟。

你現(xiàn)在準(zhǔn)備好深入

9. 實(shí)驗(yàn):學(xué)習(xí)率衰減


使用兩個(gè),三個(gè)或四個(gè)中間層,如果將迭代推送到5000或更高,您現(xiàn)在可以獲得接近98%的準(zhǔn)確性。但是你會(huì)看到結(jié)果不是很一致。


這些曲線真的很嘈雜,看看測(cè)試的準(zhǔn)確性:它全部上下跳躍。這意味著即使學(xué)習(xí)率為0.003,我們也走得太快了。但是,我們不能將學(xué)習(xí)率除以十,否則訓(xùn)練將永遠(yuǎn)存在。良好的解決方案是開始快速,并將學(xué)習(xí)速率以指數(shù)方式衰減為0.0001。

這一點(diǎn)變化的影響是壯觀的。您可以看到大部分噪音已經(jīng)消失,測(cè)試精度現(xiàn)在高達(dá)98%以上


還要看訓(xùn)練精度曲線。現(xiàn)在已經(jīng)達(dá)到了幾個(gè)紀(jì)元的100%(1個(gè)紀(jì)元= 500次迭代=訓(xùn)練了所有的訓(xùn)練圖像一次)。第一次,我們能夠?qū)W習(xí)完美地識(shí)別訓(xùn)練圖像。

請(qǐng)?zhí)砑訉W(xué)習(xí)率衰減到你的代碼。為了在每次迭代時(shí)將不同的學(xué)習(xí)率傳遞給AdamOptimizer,您將需要定義一個(gè)新的占位符,并在每次迭代時(shí)向它提供一個(gè)新的值feed_dict。

以下是指數(shù)衰減的公式: lr = lrmin+(lrmax-lrmin)*exp(-i/2000)

解決方案可以在文件中找到mnist_2.1_five_layers_relu_lrdecay.py。

10. 實(shí)驗(yàn)室:丟失信息,過(guò)度配合


您將注意到,測(cè)試和訓(xùn)練數(shù)據(jù)的交叉熵曲線在數(shù)千次迭代后開始斷開連接。學(xué)習(xí)算法僅用于訓(xùn)練數(shù)據(jù),并相應(yīng)地優(yōu)化訓(xùn)練交叉熵。它從來(lái)沒(méi)有看到測(cè)試數(shù)據(jù),所以毫不奇怪,一段時(shí)間后,它的工作不再對(duì)測(cè)試交叉熵產(chǎn)生影響,測(cè)試交叉熵停止下降,有時(shí)甚至反彈。

這不會(huì)立即影響您的模型的真實(shí)識(shí)別能力,但它將阻止您運(yùn)行許多迭代,并且通常是訓(xùn)練不再具有積極作用的跡象。這個(gè)斷開連接通常被標(biāo)記為“過(guò)度擬合”,當(dāng)您看到它時(shí),您可以嘗試應(yīng)用稱為“丟失信息”的正則化技術(shù)。

在丟失數(shù)據(jù)期間,在每次訓(xùn)練迭代中,您從網(wǎng)絡(luò)中丟棄隨機(jī)神經(jīng)元。您選擇pkeep保留神經(jīng)元的概率,通常在50%至75%之間,然后在訓(xùn)練循環(huán)的每次迭代中,隨機(jī)移除所有權(quán)重和偏差的神經(jīng)元。不同的神經(jīng)元將在每次迭代中被丟棄(并且您還需要按比例提升剩余神經(jīng)元的輸出,以確保下一層的激活不會(huì)移動(dòng))。當(dāng)您測(cè)試網(wǎng)絡(luò)的性能時(shí),您將所有神經(jīng)元都放回(pkeep=1)。

TensorFlow提供了一個(gè)用于神經(jīng)元層輸出的壓差函數(shù)。它隨機(jī)排除一些輸出,并將其余的輸出提高1 / pkeep。以下是您如何在兩層網(wǎng)絡(luò)中使用它:

# feed in 1 when testing, 0.75 when training pkeep = tf.placeholder(tf.float32)Y1 = tf.nn.relu(tf.matmul(X, W1) + B1) Y1d = tf.nn.dropout(Y1, pkeep)Y = tf.nn.softmax(tf.matmul(Y1d, W2) + B2)

您可以在網(wǎng)絡(luò)中的每個(gè)中間層之后添加丟失數(shù)據(jù)(dropout)。這是實(shí)驗(yàn)室的可選步驟。

解決方案可以在文件中找到mnist_2.2_five_layers_relu_lrdecay_dropout.py。


您應(yīng)該看到,測(cè)試損失在很大程度上被控制,噪音重新出現(xiàn),但在這種情況下,至少測(cè)試精度保持不變,這是有點(diǎn)令人失望。這里出現(xiàn)“過(guò)度配合”的另一個(gè)原因。

在我們繼續(xù)之前,總結(jié)一下我們迄今為止所嘗試的所有工具:

無(wú)論我們做什么,我們似乎無(wú)法以顯著的方式打破98%的障礙,我們的損失曲線仍然表現(xiàn)出“過(guò)擬合”的問(wèn)題。什么是真正的“過(guò)擬合”?當(dāng)一個(gè)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)“不好”時(shí),過(guò)擬合就會(huì)發(fā)生,這種方式對(duì)于訓(xùn)練樣例起作用,但對(duì)于現(xiàn)實(shí)世界的數(shù)據(jù)卻不太好。有正規(guī)化技術(shù),如丟失數(shù)據(jù)(dropout),可以強(qiáng)制它以更好的方式學(xué)習(xí),但過(guò)擬合也有更深的根源。

當(dāng)神經(jīng)網(wǎng)絡(luò)對(duì)于手頭的問(wèn)題具有太多的自由度時(shí),會(huì)發(fā)生基本的過(guò)擬合。想象一下,我們有這么多神經(jīng)元,網(wǎng)絡(luò)可以存儲(chǔ)我們所有的訓(xùn)練圖像,然后通過(guò)模式匹配識(shí)別它們。它將完全失真在真實(shí)世界的數(shù)據(jù)。一個(gè)神經(jīng)網(wǎng)絡(luò)必須有一定的約束。

如果你有很少的培訓(xùn)數(shù)據(jù),即使一個(gè)小的網(wǎng)絡(luò)也可以完成學(xué)習(xí)。一般來(lái)說(shuō),你總是需要大量的數(shù)據(jù)來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

最后,如果你做的一切都很好,嘗試不同大小的網(wǎng)絡(luò),以確保其自由度受到限制,應(yīng)用丟失數(shù)據(jù)(dropout),并訓(xùn)練大量的數(shù)據(jù),你可能仍然被困在一個(gè)性能水平,似乎沒(méi)有什么可以提高。這意味著您的神經(jīng)網(wǎng)絡(luò)目前的形狀不能從您的數(shù)據(jù)中提取更多的信息,就像我們?cè)谶@里一樣。

記住我們?nèi)绾问褂檬謱憟D像,將所有像素平坦化為單個(gè)向量?那是一個(gè)很糟糕的主意 手寫數(shù)字由形狀組成,當(dāng)我們平鋪像素時(shí),我們舍棄了形狀信息。然而,有一種類型的神經(jīng)網(wǎng)絡(luò)可以利用形狀信息:卷積網(wǎng)絡(luò)。讓我們?cè)囋嚳窗伞?/p>

11. 理論:卷積網(wǎng)絡(luò)


在卷積網(wǎng)絡(luò)的層中,一個(gè)“神經(jīng)元”僅在圖像的小區(qū)域上進(jìn)行恰好在其上方的像素的加權(quán)和。然后,通過(guò)添加偏置并通過(guò)其激活功能饋送結(jié)果來(lái)正常地起作用。最大的區(qū)別是每個(gè)神經(jīng)元都會(huì)重復(fù)使用相同的權(quán)重,而在之前看到的完全連接的網(wǎng)絡(luò)中,每個(gè)神經(jīng)元都有自己的權(quán)重集。

在上面的動(dòng)畫中,您可以看到,通過(guò)在兩個(gè)方向(卷積)上滑過(guò)圖像的權(quán)重塊,您可以獲得與圖像中的像素一樣多的輸出值(盡管邊緣需要一些填充)。

要使用4x4的補(bǔ)丁大小和彩色圖像作為輸入生成一個(gè)輸出值平面,如動(dòng)畫中那樣,我們需要4x4x3 = 48的權(quán)重。這還不夠 為了增加更多的自由度,我們用不同的權(quán)重重復(fù)相同的事情。

通過(guò)向張量添加維度,可以將兩個(gè)(或多個(gè))權(quán)重組重寫為一個(gè),這給出了卷積層的權(quán)重張量的通用形狀。由于輸入和輸出通道的數(shù)量是參數(shù),我們可以開始堆疊和鏈接卷積層。

最后一個(gè)問(wèn)題仍然存在。我們?nèi)匀恍枰獙⑿畔⒄{(diào)低。在最后一層,我們?nèi)匀恢恍枰?0個(gè)神經(jīng)元來(lái)代替我們的10個(gè)數(shù)字。傳統(tǒng)上,這是通過(guò)“最大池”層完成的。即使今天有更簡(jiǎn)單的方法,“最大池(max-pooling)”有助于直觀地了解卷積網(wǎng)絡(luò)的運(yùn)行情況:如果您假設(shè)在訓(xùn)練過(guò)程中,我們的小塊權(quán)重會(huì)演變成過(guò)濾器,可以識(shí)別基本形狀(水平和垂直線,曲線,……)然后一種將有用信息向下傳遞的方式是通過(guò)層數(shù)保持最大強(qiáng)度識(shí)別形狀的輸出。實(shí)際上,在最大池層中,神經(jīng)元輸出以2x2為一組進(jìn)行處理,只保留最多一個(gè)。

有一種更簡(jiǎn)單的方法:如果您以2像素而不是1像素的速度滑過(guò)圖像,則還會(huì)獲得較少的輸出值。這種方法已被證明是同樣有效的,而今天的卷積網(wǎng)絡(luò)僅使用卷積層。


讓我們建立一個(gè)手寫數(shù)字識(shí)別的卷積網(wǎng)絡(luò)。我們將在頂部使用三個(gè)卷積層,我們的傳統(tǒng)softmax讀出層在底部,并連接到一個(gè)完全連接的層:

請(qǐng)注意,第二和第三卷積層有兩個(gè)步長(zhǎng),這說(shuō)明為什么它們將輸出值從28x28降低到14x14,然后是7x7。完成這些層的大小,使得神經(jīng)元的數(shù)量在每一層大致下降2倍:28x28x4≈3000→14x14x8≈1500→7x7x12≈500→200.跳轉(zhuǎn)到下一節(jié)執(zhí)行。

12. 實(shí)驗(yàn)室:卷積網(wǎng)絡(luò)


要將我們的代碼切換到卷積模型,我們需要為卷積層定義適當(dāng)?shù)臋?quán)重張量,然后將卷積圖層添加到模型中。

我們已經(jīng)看到卷積層需要以下形狀的權(quán)重張量。這是初始化的TensorFlow語(yǔ)法:

W = tf.Variable(tf.truncated_normal([4, 4, 3, 2], stddev=0.1)) B = tf.Variable(tf.ones([2])/10) # 2 is the number of output channels

可以tf.nn.conv2d使用使用提供的權(quán)重在兩個(gè)方向上執(zhí)行輸入圖像的掃描的功能在TensorFlow中實(shí)現(xiàn)卷積層。這只是神經(jīng)元的加權(quán)和部分。您仍然需要添加偏差并通過(guò)激活功能提供結(jié)果。

stride = 1 # output is still 28x28 Ycnv = tf.nn.conv2d(X, W, strides=[1, stride, stride, 1], padding='SAME') Y = tf.nn.relu(Ycnv + B)

不要太多地關(guān)注跨步的復(fù)雜語(yǔ)法。查看文檔的完整詳細(xì)信息。在這里工作的填充策略是從圖像的兩邊復(fù)制像素。所有數(shù)字都在統(tǒng)一的背景上,所以這只是擴(kuò)展了背景,不應(yīng)該添加任何不需要的形狀。

輪到你玩了,修改你的模型,把它變成一個(gè)卷積模型。您可以使用上圖中的值來(lái)對(duì)其進(jìn)行調(diào)整。你可以保持你的學(xué)習(xí)速度衰減,但是現(xiàn)在請(qǐng)刪除丟失信息(dropout)。

解決方案可以在文件中找到mnist_3.0_convolutional.py。

您的模型應(yīng)該能夠輕松地打破98%的屏障。看看測(cè)試交叉熵曲線。你是不是能馬上想到解決方案呢?

13. 實(shí)驗(yàn)室:99%的挑戰(zhàn)

調(diào)整神經(jīng)網(wǎng)絡(luò)的一個(gè)很好的方法是實(shí)現(xiàn)一個(gè)有點(diǎn)太限制的網(wǎng)絡(luò),然后給它一個(gè)更多的自由度,并添加丟失信息(dropout),以確保它不是過(guò)擬合。這樣最終可以為您的問(wèn)題提供一個(gè)相當(dāng)理想的神經(jīng)網(wǎng)絡(luò)。

這里例如,我們?cè)诘谝粋€(gè)卷積層中只使用了4個(gè)像素。如果您接受這些權(quán)重補(bǔ)丁在訓(xùn)練過(guò)程中演變成形狀識(shí)別器,您可以直觀地看到這可能不足以解決我們的問(wèn)題。手寫數(shù)字是超過(guò)4個(gè)像素形狀的模式。

所以讓我們稍微增加像素大小,將卷積層中的補(bǔ)丁數(shù)量從4,8,12提高到6,12,24,然后在完全連接的層上添加dropout。為什么不在卷積層上?他們的神經(jīng)元重復(fù)使用相同的權(quán)重,所以通過(guò)在一次訓(xùn)練迭代紀(jì)元,凍結(jié)一些權(quán)重有效地起作用的dropout將不起作用。

去吧,打破99%的限制。增加像素大小和通道數(shù),如上圖所示,并在卷積層上添加dropout。

解決方案可以在文件中找到mnist_3.1_convolutional_bigger_dropout.py


上圖所示的模型僅識(shí)別錯(cuò)了10,000個(gè)測(cè)試數(shù)字中的72個(gè)。在MNIST網(wǎng)站上可以找到的世界紀(jì)錄約為99.7%。我們距離我們的模型建立了100行Python / TensorFlow距離世界紀(jì)錄就差0.4個(gè)百分點(diǎn)。

要完成,這是對(duì)我們更大的卷積網(wǎng)絡(luò)的差異。給神經(jīng)網(wǎng)絡(luò)增加自由度,將最終準(zhǔn)確度從98.9%提高到99.1%。增加dropout不僅馴服了測(cè)試損失,而且使我們能夠安全地航行99%以上,甚至達(dá)到99.3%



14. 恭喜!

您已經(jīng)建立了您的第一個(gè)神經(jīng)網(wǎng)絡(luò),并一直訓(xùn)練到99%的準(zhǔn)確性。沿途學(xué)到的技術(shù)并不特定于MNIST數(shù)據(jù)集,實(shí)際上它們?cè)谑褂蒙窠?jīng)網(wǎng)絡(luò)時(shí)被廣泛使用。作為一個(gè)分手的禮物,這里是實(shí)驗(yàn)室的“懸崖筆記”卡,卡通版本。你可以用它回憶起你學(xué)到的東西:

下一步
在完全連接和卷積網(wǎng)絡(luò)之后,您應(yīng)該看看循環(huán)神經(jīng)網(wǎng)絡(luò)。
在本教程中,您已經(jīng)學(xué)習(xí)了如何在矩陣級(jí)構(gòu)建Tensorflow模型。Tensorflow具有更高級(jí)的API,也稱為tf.layers.
要在分布式基礎(chǔ)架構(gòu)上在云中運(yùn)行培訓(xùn)或推理,我們提供Cloud ML服務(wù)。
最后,我們喜歡反饋。請(qǐng)告訴我們,如果您在本實(shí)驗(yàn)室看到某些東西,或者您認(rèn)為應(yīng)該改進(jìn)的話。我們通過(guò)GitHub問(wèn)題處理反饋[ 反饋鏈接 ]。



The author: Martin G?rner
Twitter: @martin_gorner

Google +: plus.google.com/+MartinGorner

轉(zhuǎn):https://blog.csdn.net/xummgg/article/details/69214366


創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的TensorFlow和深度学习-无需博士学位(TensorFlow and deep learning without a PhD)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。