中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
教程|沒有博士學(xué)位,照樣玩轉(zhuǎn)TensorFlow深度學(xué)習(xí)

選自Codelabs

機(jī)器之心編譯

參與:侯韻楚、王宇欣、趙華龍、邵明、吳攀

本文內(nèi)容由機(jī)器之心編譯自谷歌開發(fā)者博客的 Codelabs 項(xiàng)目。據(jù)介紹,Google Developers Codelabs 提供了有引導(dǎo)的、教程式的和上手式的編程體驗(yàn)。大多數(shù) Codelabs 項(xiàng)目都能幫助你了解開發(fā)一個(gè)小應(yīng)用或?yàn)橐粋€(gè)已有的應(yīng)用加入新功能的過程。這些應(yīng)用涉及到很多主題,包括 Android Wear、Google Compute Engine、Project Tango、和 iOS 上的 Google API。

本項(xiàng)目的原文可參閱:https://codelabs.developers.google.com/codelabs/cloud-tensorflow-mnist/#13

1、概述

在 codelab 項(xiàng)目中,你將學(xué)習(xí)如何構(gòu)建并訓(xùn)練出能夠識別手寫數(shù)字的神經(jīng)網(wǎng)絡(luò)。在這過程中,當(dāng)這個(gè)神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確度提升至 99%時(shí),你還會發(fā)現(xiàn)深度學(xué)習(xí)專業(yè)人士用來有效訓(xùn)練模型的貿(mào)易工具。

這個(gè) codelab 項(xiàng)目使用的是 MNIST 數(shù)據(jù)集,這個(gè)包含 60,000 個(gè)有標(biāo)記數(shù)字的集合是幾屆博士努力近二十年的成果。你將會用不到 100 行的 Python/TensorFlow 代碼來解決上述問題。

你將學(xué)到:

①神經(jīng)網(wǎng)絡(luò)的定義及如何訓(xùn)練神經(jīng)網(wǎng)絡(luò)

②如何使用 TensorFlow 構(gòu)建基本的 1 層神經(jīng)網(wǎng)絡(luò)

③如何添加多層神經(jīng)網(wǎng)絡(luò)

④訓(xùn)練提示和技巧:過擬合、dropout、學(xué)習(xí)速率衰減等...

⑤如何解決深度神經(jīng)網(wǎng)絡(luò)的問題

⑥如何構(gòu)建卷積網(wǎng)絡(luò)

對此,你將需要:

①Python 2 或 3(建議使用 Python 3)

②TensorFlow

③Matplotlib(Python 的可視化庫)

安裝說明會在下一步中給出。

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

在你的計(jì)算機(jī)上安裝必要軟件:Python、TensorFlow 和 Matplotlib。完整的安裝說明如下:INSTALL.txt

克隆 GitHub 存儲庫:

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

這個(gè)庫包含了多個(gè)文件,而你將只在mnist_1.0_softmax.py中操作。其它文件是用于加載數(shù)據(jù)和可視化結(jié)果的解決方案或支持代碼。

當(dāng)你啟動初始python腳本時(shí),應(yīng)當(dāng)能夠看到訓(xùn)練過程的實(shí)時(shí)可視化:

$ python3 mnist_1.0_softmax.py

疑難解答:如果無法運(yùn)行實(shí)時(shí)可視化,或者如果你只想要使用文本輸出,則可以通過注釋掉一行并取消另一行的注釋來禁用可視化。請參閱文件底部的說明。

為 TensorFlow 構(gòu)建的可視化工具是 TensorBoard,其主要目標(biāo)比我們在這里所需的更宏大。它能使你能夠跟蹤你在遠(yuǎn)程服務(wù)器上的分布式 TensorFlow 工作。而對于我們的這個(gè)實(shí)驗(yàn),matplotlib 將作為替代,并且我們還有額外收獲——實(shí)時(shí)動畫。但是如果你使用 TensorFlow 進(jìn)行嚴(yán)謹(jǐn)?shù)墓ぷ鳎阋欢ㄒ囋?TensorBoard。

3、理論:訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)

我們首先來觀察一個(gè)正在訓(xùn)練的神經(jīng)網(wǎng)絡(luò)。其代碼會在下一節(jié)解釋,所以現(xiàn)在不必查看。

我們的神經(jīng)網(wǎng)絡(luò)可以輸入手寫數(shù)字并對它們進(jìn)行分類,即將它們識別為 0、1、2……9。它基于內(nèi)部變量(「權(quán)重(weights)」和「偏差(bias)」,會在后面進(jìn)行解釋),需要有一個(gè)正確的值來分類才能正常工作。這個(gè)「正確的值」通過訓(xùn)練過程進(jìn)行學(xué)習(xí),這也將在后面詳細(xì)解釋。你現(xiàn)在需要知道的是,訓(xùn)練回路看起來像這樣:

Training digits => updates to weights and biases => better recognition (loop)

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

你可以看到訓(xùn)練數(shù)字每次 100 個(gè)被送入訓(xùn)練回路;也可以看到當(dāng)前訓(xùn)練狀態(tài)下的神經(jīng)網(wǎng)絡(luò)是已將數(shù)字正確識別(白色背景)還是誤分類(紅色背景,左側(cè)印有正確的標(biāo)示,每個(gè)數(shù)字右側(cè)印有計(jì)算錯(cuò)誤的標(biāo)示)。

此數(shù)據(jù)集中有 50,000 個(gè)訓(xùn)練數(shù)字。我們在每次迭代(iteration)中將 100 個(gè)數(shù)字送入訓(xùn)練循環(huán)中,因此系統(tǒng)將在 500 次迭代之后看到所有訓(xùn)練數(shù)字一次。我們稱之為一個(gè)「epoch」。

為了測試在現(xiàn)實(shí)條件下的識別質(zhì)量,我們必須使用系統(tǒng)在訓(xùn)練期間從未看過的數(shù)字。否則,它可能記住了所有的訓(xùn)練數(shù)字,卻仍無法識別我剛才寫的「8」。MNIST 數(shù)據(jù)集包含了 10,000 個(gè)測試數(shù)字。此處你能看到每個(gè)數(shù)字對應(yīng)的大約 1000 種書寫形式,其中所有錯(cuò)誤識別的數(shù)字列在頂部(有紅色背景)。左邊的刻度會給你一個(gè)粗略的分辨率精確度(正確識別的百分比)。

為了驅(qū)動訓(xùn)練,我們來定義損失函數(shù),即一個(gè)展示出系統(tǒng)數(shù)字識別能力有多糟的值,并且系統(tǒng)會盡力將其最小化。損失函數(shù)(loss function,此處為「交叉熵」)的選擇稍后會做出解釋。你會看到,隨著訓(xùn)練的進(jìn)行,訓(xùn)練和測試數(shù)據(jù)的損失會減少,而這個(gè)現(xiàn)象是好的,意味著神經(jīng)網(wǎng)絡(luò)正在學(xué)習(xí)。X 軸表示了學(xué)習(xí)過程中的迭代。

這個(gè)準(zhǔn)確度只是正確識別的數(shù)字的百分比,是在訓(xùn)練和測試集上計(jì)算出的。如果訓(xùn)練順利,它便會上升。

最后的兩幅圖表說明了內(nèi)部變量所取的所有值的擴(kuò)展,即隨訓(xùn)練進(jìn)行而變化的權(quán)重和偏置。比如偏置從 0 開始,且最終得到的值大致均勻地分布在-1.5 和 1.5 之間。如果系統(tǒng)不能很好地收斂,那么這些圖可能有用。倘若你發(fā)現(xiàn)權(quán)重和偏差擴(kuò)展到上百或上千,那么就可能有問題了。

圖中的條帶為百分?jǐn)?shù)。此處有 7 條帶,所以每條帶是所有值的 100/7,也就是 14%。

用于可視化 GUI 的鍵盤快捷鍵

1 ......... display 1st graph only 僅顯示第 1 張圖

2 ......... display 2nd graph only 僅顯示第 2 張圖

3 ......... display 3rd graph only 僅顯示第 3 張圖

4 ......... display 4th graph only 僅顯示第 4 張圖

5 ......... display 5th graph only 僅顯示第 5 張圖

6 ......... display 6th graph only 僅顯示第 6 張圖

7 ......... display graphs 1 and 2 顯示 1 和 2 圖

8 ......... display graphs 4 and 5 顯示 4 和 5 圖

9 ......... display graphs 3 and 6 顯示 3 和 6 圖

ESC or 0 .. back to displaying all graphs 返回,顯示所有圖

空格 ..... pause/resume 暫停/繼續(xù)

O ......... box zoom mode (then use mouse) 框縮放模式(然后使用鼠標(biāo))

H ......... reset all zooms 重置所有縮放

Ctrl-S .... save current image 保存當(dāng)前圖像

什么是“權(quán)重”和“偏置”?“交叉熵”又是如何被計(jì)算的?訓(xùn)練算法究竟是如何工作的?請到下一部分一探究竟。

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

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

神經(jīng)網(wǎng)絡(luò)中的每個(gè)「神經(jīng)元」對其所有的輸入進(jìn)行加權(quán)求和,并添加一個(gè)被稱為「偏置(bias)」的常數(shù),然后通過一些非線性激活函數(shù)來反饋結(jié)果。

為了將數(shù)字分為 10 類(0 到 9),我們設(shè)計(jì)了一個(gè)具有 10 個(gè)輸出神經(jīng)元的單層神經(jīng)網(wǎng)絡(luò)。對于分類問題,softmax 是一個(gè)不錯(cuò)的激活函數(shù)。通過取每個(gè)元素的指數(shù),然后歸一化向量(使用任意的范數(shù)(norm),比如向量的普通歐幾里得距離)從而將 softmax 應(yīng)用于向量。

那么為什么「softmax」會被稱為 softmax 呢?指數(shù)是一種驟增的函數(shù)。這將加大向量中每個(gè)元素的差異。它也會迅速地產(chǎn)生一個(gè)巨大的值。然后,當(dāng)進(jìn)行向量的標(biāo)準(zhǔn)化時(shí),支配范數(shù)(norm)的最大的元素將會被標(biāo)準(zhǔn)化為一個(gè)接近 1 的數(shù)字,其他的元素將會被一個(gè)較大的值分割并被標(biāo)準(zhǔn)化為一個(gè)接近 0 的數(shù)字。所得到的向量清楚地顯示出了哪個(gè)是其最大的值,即「max」,但是卻又保留了其值的原始的相對排列順序,因此即為「soft」。

我們現(xiàn)在將使用矩陣乘法將這個(gè)單層的神經(jīng)元的行為總結(jié)進(jìn)一個(gè)簡單的公式當(dāng)中。讓我們直接這樣做:100 個(gè)圖像的「mini-batch」作為輸入,產(chǎn)生 100 個(gè)預(yù)測(10 元素向量)作為輸出。

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

每一個(gè)神經(jīng)元都必須添加其偏置(一個(gè)常數(shù))。因?yàn)槲覀冇?10 個(gè)神經(jīng)元,我們同樣擁有 10 個(gè)偏置常數(shù)。我們將這個(gè) 10 個(gè)值的向量稱為 b。它必須被添加到先前計(jì)算的矩陣中的每一行當(dāng)中。使用一個(gè)稱為 'broadcasting' 的魔法,我們將會用一個(gè)簡單的加號寫出它。

「Broadcasting」是 Python 和 numpy(Python 的科學(xué)計(jì)算庫)的一個(gè)標(biāo)準(zhǔn)技巧。它擴(kuò)展了對不兼容維度的矩陣進(jìn)行正常操作的方式?!窧roadcasting add」意味著「如果你因?yàn)閮蓚€(gè)矩陣維度不同的原因而不能將其相加,那么你可以根據(jù)需要嘗試復(fù)制一個(gè)小的矩陣使其工作?!?/p>

我們最終應(yīng)用 softmax 激活函數(shù)并且得到一個(gè)描述單層神經(jīng)網(wǎng)絡(luò)的公式,并將其應(yīng)用于 100 張圖像:

順便說一下,什么是「tensor(張量)」?

「張量(tensor)」像一個(gè)矩陣,但是卻有著任意數(shù)量的維度。一個(gè) 1 維的張量是一個(gè)向量。一個(gè)二維的張量是一個(gè)矩陣。然后你可以有 3, 4, 5 或者更多維的張量。

5、理論:梯度下降

現(xiàn)在我們的神經(jīng)網(wǎng)絡(luò)從輸入圖像中產(chǎn)生預(yù)測,我們需要知道它們可以做到什么樣的程度,即在我們知道的事實(shí)和網(wǎng)絡(luò)的預(yù)測之間到底有多大的距離。請記住,我們對于這個(gè)數(shù)據(jù)集中的所有圖像都有一個(gè)真實(shí)的標(biāo)簽。

任何一種定義的距離都可以進(jìn)行這樣的操作,普通歐幾里得距離是可以的,但是對于分類問題,被稱為「交叉熵(cross-entropy)」的距離更加有效。

「one-hot」編碼意味著你使用一個(gè) 10 個(gè)值的向量,其中除了第 6 個(gè)值為 1 以外的所有值都是 0。這非常方便,因?yàn)檫@樣的格式和我們神經(jīng)網(wǎng)絡(luò)預(yù)測輸出的格式非常相似,同時(shí)它也作為一個(gè) 10 值的向量。

「訓(xùn)練」一個(gè)神經(jīng)網(wǎng)絡(luò)實(shí)際上意味著使用訓(xùn)練圖像和標(biāo)簽來調(diào)整權(quán)重和偏置,以便最小化交叉熵?fù)p失函數(shù)。它是這樣工作的。

交叉熵是一個(gè)關(guān)于權(quán)重、偏置、訓(xùn)練圖像的像素和其已知標(biāo)簽的函數(shù)。

如果我們相對于所有的權(quán)重和所有的偏置計(jì)算交叉熵的偏導(dǎo)數(shù),我們就得到一個(gè)對于給定圖像、標(biāo)簽和當(dāng)前權(quán)重和偏置的「梯度」。請記住,我們有 7850 個(gè)權(quán)重和偏置,所以計(jì)算梯度需要大量的工作。幸運(yùn)的是,TensorFlow 可以來幫我們做這項(xiàng)工作。

梯度的數(shù)學(xué)意義在于它指向「上(up)」。因?yàn)槲覀兿胍竭_(dá)一個(gè)交叉熵低的地方,那么我們就去向相反的方向。我們用一小部分的梯度更新權(quán)重和偏置并且使用下一批訓(xùn)練圖像再次做同樣的事情。我們希望的是,這可以使我們到達(dá)交叉熵最小的凹點(diǎn)的低部。

在這副圖片當(dāng)中,交叉熵被表示為一個(gè)具有兩個(gè)權(quán)重的函數(shù)。事實(shí)上,還有更多。梯度下降算法遵循著一個(gè)最陡的坡度下降到局部最小值的路徑。訓(xùn)練圖像在每一次迭代中同樣會被改變,這使得我們向著一個(gè)適用于所有圖像的局部最小值收斂。

「學(xué)習(xí)率(learning rate)」: 在整個(gè)梯度的長度上,你不能在每一次迭代的時(shí)候都對權(quán)重和偏置進(jìn)行更新。這就會像是你穿著七里靴卻試圖到達(dá)一個(gè)山谷的底部。你會直接從山谷的一邊到達(dá)另一邊。為了到達(dá)底部,你需要一些更小的步伐,即只使用梯度的一部分,通常在 1/1000 區(qū)域中。我們稱這個(gè)部分為「學(xué)習(xí)率(Learning rate)」。

總結(jié)一下,以下是訓(xùn)練過程的步驟:

Training digits and labels => loss function => gradient (partial derivatives) => steepest descent => update weights and biases => repeat with next mini-batch of training images and labels

訓(xùn)練數(shù)字和標(biāo)簽 => 損失函數(shù) => 梯度(部分偏導(dǎo)數(shù))=> 最陡的梯度 => 更新權(quán)重和偏置 => 使用下一個(gè) mini-batch 的圖像和標(biāo)簽重復(fù)這一過程

為什么使用 100 個(gè)圖像和標(biāo)簽的 mini-batch?

你當(dāng)然也可以只在一個(gè)示例圖像中計(jì)算你的梯度并且立即更新權(quán)重和偏置(這在科學(xué)文獻(xiàn)中被稱為「隨機(jī)梯度下降(stochastic gradient descent)」)。在 100 個(gè)樣本上都這樣做可以得到一個(gè)更好地表示由不同樣本圖像施加約束的梯度并且可能更快地朝著解決方案收斂。mini-batch 的大小是可調(diào)整的參數(shù)。還有一個(gè)更加技術(shù)化的原因:使用批處理也意味著使用較大的矩陣,而這些通常更容易在 GPU 上優(yōu)化。

常見問題

為什么交叉熵是在分類問題中合適的定義距離?

解答鏈接:https://jamesmccaffrey.wordpress.com/2013/11/05/why-you-should-use-cross-entropy-error-instead-of-classification-error-or-mean-squared-error-for-neural-network-classifier-training/

6、實(shí)驗(yàn):讓我們來看看代碼

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

你在本節(jié)的任務(wù)是理解開始代碼,以便稍后對其改進(jìn)。

你應(yīng)該看到,在文檔中的說明和啟動代碼只有微小的差別。它們對應(yīng)于可視化的函數(shù),并且在注釋中被標(biāo)記。此處可忽略。

mnist_1.0_softmax.py:

https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py

我們首先定義 TensorFlow 的變量和占位符。變量是你希望訓(xùn)練算法為你確定的所有的參數(shù)。在我們的例子中參數(shù)是權(quán)重和偏差。

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

  • 28, 28, 1: 圖像是 28x28 每像素 x 1(灰度)。最后一個(gè)數(shù)字對于彩色圖像是 3 但在這里并非是必須的。

  • None: 這是代表圖像在小批量(mini-batch)中的數(shù)量。在訓(xùn)練時(shí)可以得到。

mnist_1.0_softmax.py:

https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py

第一行是我們單層神經(jīng)網(wǎng)絡(luò)的模型。公式是我們在前面的理論部分建立的。tf.reshape 命令將我們的 28×28 的圖像轉(zhuǎn)化成 784 個(gè)像素的單向量。在 reshape 中的「-1」意味著「計(jì)算機(jī),計(jì)算出來,這只有一種可能」。在實(shí)際當(dāng)中,這會是圖像在小批次(mini-batch)中的數(shù)量。

然后,我們需要一個(gè)額外的占位符用于訓(xùn)練標(biāo)簽,這些標(biāo)簽與訓(xùn)練圖像一起被提供。

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

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

mnist_1.0_softmax.py:

https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py)

optimizer = tf.train.GradientDescentOptimizer(0.003)

train_step = optimizer.minimize(cross_entropy)

才是 TensorFlow 發(fā)揮它力量的地方。你選擇一個(gè)適應(yīng)器(optimiser,有許多可供選擇)并且用它最小化交叉熵?fù)p失。在這一步中,TensorFlow 計(jì)算相對于所有權(quán)重和所有偏置(梯度)的損失函數(shù)的偏導(dǎo)數(shù)。這是一個(gè)形式衍生( formal derivation),并非是一個(gè)耗時(shí)的數(shù)值型衍生。

梯度然后被用來更新權(quán)重和偏置。學(xué)習(xí)率為 0.003。

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

TensorFlow 的 “延遲執(zhí)行(deferred execution)” 模型:TensorFlow 是為分布式計(jì)算構(gòu)建的。它必須知道你要計(jì)算的是什么、你的執(zhí)行圖(execution graph),然后才開始發(fā)送計(jì)算任務(wù)到各種計(jì)算機(jī)。這就是為什么它有一個(gè)延遲執(zhí)行模型,你首先使用 TensorFlow 函數(shù)在內(nèi)存中創(chuàng)造一個(gè)計(jì)算圖,然后啟動一個(gè)執(zhí)行 Session 并且使用 Session.run 執(zhí)行實(shí)際計(jì)算任務(wù)。在此時(shí),圖形無法被更改。

由于這個(gè)模型,TensorFlow 接管了分布式運(yùn)算的大量運(yùn)籌。例如,假如你指示它在計(jì)算機(jī) 1 上運(yùn)行計(jì)算的一部分 ,而在計(jì)算機(jī) 2 上運(yùn)行另一部分,它可以自動進(jìn)行必要的數(shù)據(jù)傳輸。

計(jì)算需要將實(shí)際數(shù)據(jù)反饋進(jìn)你在 TensorFlow 代碼中定義的占位符。這是以 Python 的 dictionary 的形式給出的,其中的鍵是占位符的名稱。

mnist_1.0_softmax.py:

https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_1.0_softmax.py

在這里執(zhí)行的 train_step 是當(dāng)我們要求 TensorFlow 最小化交叉熵時(shí)獲得的。這是計(jì)算梯度和更新權(quán)重和偏置的步驟。

最終,我們還需要一些值來顯示,以便我們可以追蹤我們模型的性能。

在訓(xùn)練回路中使用該代碼來計(jì)算準(zhǔn)確度和交叉熵(例如每 10 次迭代):

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

通過在饋送 dictionary 中提供測試而不是訓(xùn)練數(shù)據(jù),可以對測試數(shù)據(jù)進(jìn)行同樣的計(jì)算(例如每 100 次迭代計(jì)算一次。有 10,000 個(gè)測試數(shù)字,所以會耗費(fèi) 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 對象以及基于它的所有科學(xué)計(jì)算庫。這就是使用 matplotlib(基于 Numpy 的標(biāo)準(zhǔn) Python 繪圖庫)為本實(shí)驗(yàn)構(gòu)建實(shí)時(shí)可視化的方法。

這個(gè)簡單的模型已經(jīng)能識別 92% 的數(shù)字了。這不錯(cuò),但是你現(xiàn)在要顯著地改善它。

7、實(shí)驗(yàn):增加層

為了提高識別的準(zhǔn)確度,我們將為神經(jīng)網(wǎng)絡(luò)增加更多的層。第二層神經(jīng)元將計(jì)算前一層神經(jīng)元輸出的加權(quán)和,而非計(jì)算像素的加權(quán)和。這里有一個(gè) 5 層全相連的神經(jīng)網(wǎng)絡(luò)的例子:

我們繼續(xù)用 softmax 來作為最后一層的激活函數(shù),這也是為什么在分類這個(gè)問題上它性能優(yōu)異的原因。但在中間層,我們要使用最經(jīng)典的激活函數(shù):sigmoid:在這一節(jié)中你的任務(wù)是為你的模型增加一到兩個(gè)中間層以提高它的性能。

答案可以在 mnist_2.0_five_layers_sigmoid.py 中找到。只有當(dāng)你實(shí)在想不出來的時(shí)候再使用它!為了增加一個(gè)層,你需要為中間層增加一個(gè)額外的權(quán)重矩陣和一個(gè)額外的偏置向量:

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]))

對,就這么做。通過 2 個(gè)中間層以及例子中 200 個(gè)和 100 個(gè)神經(jīng)元,你現(xiàn)在應(yīng)該能夠把你的神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確度推高到 97% 了。

8、實(shí)驗(yàn):深度網(wǎng)絡(luò)需要特別注意的地方

隨著層數(shù)的增加,神經(jīng)網(wǎng)絡(luò)越來越難以收斂。但現(xiàn)在我們知道如何控制它們的行為了。這里是一些只用 1 行就可以實(shí)現(xiàn)的改進(jìn),當(dāng)你看到準(zhǔn)確度曲線出現(xiàn)如下情況的時(shí)候,這些小技巧會幫到你:

修正線性單元(ReLU)激活函數(shù)

在深度網(wǎng)絡(luò)里,sigmoid 激活函數(shù)確實(shí)能帶來很多問題。它把所有的值都擠到了 0 到 1 之間,而且當(dāng)你重復(fù)做的時(shí)候,神經(jīng)元的輸出和它們的梯度都?xì)w零了。值得一提的是,出于歷史原因,一些現(xiàn)代神經(jīng)網(wǎng)絡(luò)使用了 ReLU(修正線性單元),它大致是如下這個(gè)樣子:

升級 1/4:用 RELU 替換你所有的 sigmoid,然后你會得到一個(gè)更快的初始收斂并且當(dāng)我們繼續(xù)增加層的時(shí)候也避免了一些后續(xù)問題的產(chǎn)生。僅僅在代碼中簡單地用 tf.nn.relu 來替換 tf.nn.sigmoid 就可以了。

一個(gè)更好的優(yōu)化器

在一個(gè)特別多維的空間里,就像當(dāng)前這個(gè)情況——我們有 10K 量級的權(quán)值和偏置值——「鞍點(diǎn) (saddle points)」會頻繁出現(xiàn)。這些點(diǎn)不是局部最小值點(diǎn),但它的梯度卻是零,那么梯度降的優(yōu)化會卡在這里。TensorFlow 有一系列可以用的優(yōu)化器,包括一些帶有一定的慣性,能夠安全越過鞍點(diǎn)的優(yōu)化器。

升級 2/4:現(xiàn)在將你的 tf.train.GradientDescentOptimiser 替換為 tf.train.AdamOptimizer。

隨機(jī)初始化

準(zhǔn)確性一直卡在 0.1?你把你的權(quán)值初始化成隨機(jī)值了沒?對于偏置值,如果用 ReLU 的話,最好的辦法就是把它們都初始化成小的正值,這樣神經(jīng)元一開始就會工作在 ReLU 的非零區(qū)域內(nèi)。

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

升級 3/4:現(xiàn)在檢查是否你所有的權(quán)值和偏置值都被初始化好了。上圖所示的 0.1 會作為偏置值。

不定值(NaN)

如果你看到你的精確曲線陡然下滑并且調(diào)試口輸出的交叉熵是 NaN,不用感到頭疼,你其實(shí)是正在嘗試計(jì)算 log(0),而這肯定是個(gè)不定值(NaN)。還記得嗎,交叉熵的計(jì)算涉及到對 softmax 層的輸出取對數(shù)。鑒于 softmax 基本上是一個(gè)指數(shù),它肯定不是 0,我們?nèi)绻?32 位精度的浮點(diǎn)運(yùn)算就還好,exp(-100) 基本上可以算作是 0 了。

很幸運(yùn),TensorFlow 有一個(gè)非常方便的函數(shù)可以在單步內(nèi)計(jì)算 softmax 和交叉熵,它是以一種數(shù)值上較為穩(wěn)定的方式實(shí)現(xiàn)的。如果要使用它,你需要在應(yīng)用 softmax 之前將原始的權(quán)重和加上你最后一層的偏置隔離開來(在神經(jīng)網(wǎng)絡(luò)的術(shù)語里叫「logits」)。

如果你模型的最后一行是這樣的:

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

你需要把它替換成:

Ylogits = tf.matmul(Y4, W5) B5Y = tf.nn.softmax(Ylogits)

并且你現(xiàn)在能以一種安全的方式計(jì)算交叉熵了:

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

同樣加上下面這行代碼使得測試和訓(xùn)練的交叉熵能夠同框顯示:

cross_entropy = tf.reduce_mean(cross_entropy)*100

升級 4/4:請把 tf.nn.softmax_cross_entropy_with_logits 加到你的代碼里。你也可以跳過這一步,等你真在你的輸出里看到 NaN 以后再來做這步。現(xiàn)在,你已經(jīng)準(zhǔn)備好實(shí)現(xiàn)「深度」了。

9、實(shí)驗(yàn):學(xué)習(xí)速率衰退

通過兩個(gè)、三個(gè)或者四個(gè)中間層,你現(xiàn)在可以將準(zhǔn)確度提升至接近 98%,當(dāng)然,你的迭代次數(shù)要達(dá)到 5000 次以上。不過你會發(fā)現(xiàn)你并不總是會得到這樣的結(jié)果。

這些曲線很嘈雜,看看測試精確度吧:它在全百分比范圍內(nèi)跳上跳下。這意味著即使 0.003 的學(xué)習(xí)率我們還是太快了。但我們不能僅僅將學(xué)習(xí)率除以十或者永遠(yuǎn)不停地做訓(xùn)練。一個(gè)好的解決方案是開始很快隨后將學(xué)習(xí)速率指數(shù)級衰減至比如說 0.0001。

這個(gè)小改變的影響是驚人的。你會看到大部分的噪聲消失了并且測試精確度持續(xù)穩(wěn)定在 98% 以上。

再看看訓(xùn)練精確度曲線。在好多個(gè) epoch 里都達(dá)到了 100%(一個(gè) epoch=500 次迭代=全部訓(xùn)練圖片訓(xùn)練一次)。第一次我們能很好地識別訓(xùn)練圖片了。

請把學(xué)習(xí)率衰退加到你的代碼里。為了把一個(gè)不同的學(xué)習(xí)率在每次迭代時(shí)傳給 AdamOptimizer,你需要定義一個(gè)新的占位符(placeholder)并在每次迭代時(shí)通過 feed_dict 賦給它一個(gè)新的參數(shù)。

這里是一個(gè)指數(shù)級衰減的方程:lr = lrmin (lrmax-lrmin)*exp(-i/2000) 答案可以在這個(gè)文件里找到:mnist_2.1_five_layers_relu_lrdecay.py。如果你被卡住了可以用它。

10、實(shí)驗(yàn):dropout、過擬合

你可能已經(jīng)注意到在數(shù)千次迭代之后,測試和訓(xùn)練數(shù)據(jù)的交叉熵曲線開始不相連。學(xué)習(xí)算法只是在訓(xùn)練數(shù)據(jù)上做工作并相應(yīng)地優(yōu)化訓(xùn)練的交叉熵。它再也看不到測試數(shù)據(jù)了,所以這一點(diǎn)也不奇怪:過了一會兒它的工作不再對測試交叉熵產(chǎn)生任何影響,交叉熵停止了下降,有時(shí)甚至反彈回來。

它不會立刻影響你模型對于真實(shí)世界的識別能力,但是它會使你運(yùn)行的眾多迭代毫無用處,而且這基本上是一個(gè)信號——告訴我們訓(xùn)練已經(jīng)不能再為模型提供進(jìn)一步改進(jìn)了。這種無法連接通常會被標(biāo)明「過擬合(overfitting)」,而且當(dāng)你看到這個(gè)的時(shí)候,你可以嘗試采用一種規(guī)范化(regularization)技術(shù),稱之為「dropout」。

在 dropout 里,在每一次訓(xùn)練迭代的時(shí)候,你可以從網(wǎng)絡(luò)中隨機(jī)地放棄一些神經(jīng)元。你可以選擇一個(gè)使神經(jīng)元繼續(xù)保留的概率 pkeep,通常是 50% 到 75% 之間,然后在每一次訓(xùn)練的迭代時(shí),隨機(jī)地把一些神經(jīng)元連同它們的權(quán)重和偏置一起去掉。在一次迭代里,不同的神經(jīng)元可以被一起去掉(而且你也同樣需要等比例地促進(jìn)剩余神經(jīng)元的輸出,以確保下一層的激活不會移動)。當(dāng)測試你神經(jīng)網(wǎng)絡(luò)性能的時(shí)候,你再把所有的神經(jīng)元都裝回來 (pkeep=1)。

TensorFlow 提供一個(gè) dropout 函數(shù)可以用在一層神經(jīng)網(wǎng)絡(luò)的輸出上。它隨機(jī)地清零一些輸出并且把剩下的提升 1/pkeep。這里是如何把它用在一個(gè)兩層神經(jīng)網(wǎng)絡(luò)上的例子。

# feed in 1 when testing, 0.75 when trainingpkeep = 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)

你現(xiàn)在可以在網(wǎng)絡(luò)中每個(gè)中間層以后插入 dropout。如果你沒時(shí)間深入閱讀的話,這是本項(xiàng)目里的可選步驟。

該解決方案可以在 mnist_2.2_five_layers_relu_lrdecay_dropout.py:

(https://github.com/martin-gorner/tensorflow-mnist-tutorial/blob/master/mnist_2.2_five_layers_relu_lrdecay_dropout.py)

里找到。如果你被難住了,可以用它。

你會看到測試損失已經(jīng)被搞回來了,已經(jīng)在可控范圍內(nèi)了,不過至少在這個(gè)例子中噪聲重新出現(xiàn)了(如果你知道 dropout 的工作原理的話,這一點(diǎn)也不奇怪)。測試的準(zhǔn)確度依然沒變,這倒是有點(diǎn)小失望。這個(gè)「過擬合」一定還有其它原因。在我們繼續(xù)進(jìn)行下一步之前,我們先扼要重述一下我們到目前為止用過的所有工具:

無論我們做什么,我們看上去都不可能很顯著地解決 98% 的障礙,而且我們的損失曲線依然顯示「過擬合」無法連接。什么是真正的「過擬合」?過擬合發(fā)生在該神經(jīng)網(wǎng)絡(luò)學(xué)得「不好」的時(shí)候,在這種情況下該神經(jīng)網(wǎng)絡(luò)對于訓(xùn)練樣本做得很好,對真實(shí)場景卻并不是很好。有一些像 dropout 一樣的規(guī)范化技術(shù)能夠迫使它學(xué)習(xí)得更好,不過過擬合還有更深層的原因。

基本的過擬合發(fā)生在一個(gè)神經(jīng)網(wǎng)絡(luò)針對手頭的問題有太多的自由度的時(shí)候。想象一下我們有如此多的神經(jīng)元以至于所組成的網(wǎng)絡(luò)可以存儲我們所有的訓(xùn)練圖像并依靠特征匹配來識別它們。它會在真實(shí)世界的數(shù)據(jù)里迷失。一個(gè)神經(jīng)網(wǎng)絡(luò)必須有某種程度上的約束以使它能夠歸納推理它在學(xué)習(xí)中所學(xué)到的東西。

如果你只有很少的訓(xùn)練數(shù)據(jù),甚至一個(gè)很小的網(wǎng)絡(luò)都能夠用心學(xué)習(xí)它。一般來說,你總是需要很多數(shù)據(jù)來訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

最后,如果你已經(jīng)做完了所有的步驟,包括實(shí)驗(yàn)了不同大小的網(wǎng)絡(luò)以確保它的自由度已經(jīng)約束好了、采用了 dropout、并且訓(xùn)練了大量的數(shù)據(jù),你可能會發(fā)現(xiàn)你還是被卡在了當(dāng)前的性能層次上再也上不去了。這說明你的神經(jīng)網(wǎng)絡(luò)在它當(dāng)前的形態(tài)下已經(jīng)無法從你提供的數(shù)據(jù)中抽取到更多的信息了,就像我們這個(gè)例子這樣。

還記得我們?nèi)绾问褂梦覀兊膱D像嗎?是所有的像素都展平到一個(gè)向量里么?這是一個(gè)很糟糕的想法。手寫的數(shù)字是由一個(gè)個(gè)形狀組成的,當(dāng)我們把像素展平后我們會丟掉這些形狀信息。不過,有一種神經(jīng)網(wǎng)絡(luò)可以利用這些形狀信息:卷積網(wǎng)絡(luò)(convolutional network)。讓我們來試試。

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

在卷積網(wǎng)絡(luò)層中,一個(gè)「神經(jīng)元」僅對該圖像上的一個(gè)小部分的像素求加權(quán)和。然后,它通常會添加一個(gè)偏置單元,并且將得到的加權(quán)和傳遞給激活函數(shù)。與全連接網(wǎng)絡(luò)相比,其最大的區(qū)別在于卷積網(wǎng)絡(luò)的每個(gè)神經(jīng)元重復(fù)使用相同的權(quán)重,而不是每個(gè)神經(jīng)元都有自己的權(quán)重。

在上面的動畫中,你可以看到通過連續(xù)修改圖片上兩個(gè)方向的權(quán)重(卷積),能夠獲得與圖片上的像素點(diǎn)數(shù)量相同的輸出值(盡管在邊緣處需要填充(padding))。

要產(chǎn)生一個(gè)輸出值平面,我們使用了一張 4x4 大小的彩色圖片作為出輸入。在這個(gè)動畫當(dāng)中,我們需要 4x4x3=48 個(gè)權(quán)重,這還不夠,為了增加更多自由度,我們還需要選取不同組的權(quán)重值重復(fù)實(shí)驗(yàn)。

通過向權(quán)重張量添加一個(gè)維度,能夠?qū)山M或更多組的權(quán)重重寫為一組權(quán)重,這樣就給出了一個(gè)卷積層的權(quán)重張量的通用實(shí)現(xiàn)。由于輸入、輸出通道的數(shù)量都是參數(shù),我們可以開始堆疊式(stacking)和鏈?zhǔn)剑╟haining)的卷積層。

最后,我們需要提取信息。在最后一層中,我們僅僅想使用 10 個(gè)神經(jīng)元來分類 0-9 十個(gè)不同的數(shù)字。傳統(tǒng)上,這是通過「最大池化(max-pooling)」層來完成的。即使今天有許多更簡單的方法能夠?qū)崿F(xiàn)這分類任務(wù),但是,「最大池化」能夠幫助我們直覺地理解卷積神經(jīng)網(wǎng)絡(luò)是怎么工作的。如果你認(rèn)為在訓(xùn)練的過程中,我們的小塊權(quán)重會發(fā)展成能夠過濾基本形狀(水平線、垂直線或曲線等)的過濾器(filter),那么,提取有用信息的方式就是識別輸出層中哪種形狀具有最大的強(qiáng)度。實(shí)際上,在最大池化層中,神經(jīng)元的輸出是在 2x2 的分組中被處理,最后僅僅保留輸出最大強(qiáng)度的神經(jīng)元。

這里有一種更簡單的方法:如果你是以一步兩個(gè)像素移動圖片上的滑塊而不是以每步一個(gè)像素地移動圖片上的滑塊。這種方法就是有效的,今天的卷積網(wǎng)絡(luò)僅僅使用了卷積層。

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

注意,第二與第三卷積層神經(jīng)元數(shù)量以 2x2 為倍數(shù)減少,這就解釋了為什么它們的輸出值從 28x28 減少為 14x14,然后再到 7x7。卷積層的大小變化使神經(jīng)元的數(shù)量在每層下降約為:28x28x14≈3000->14x14x8≈1500 → 7x7x12≈500 → 200。下一節(jié)中,我們將給出該網(wǎng)絡(luò)的具體實(shí)現(xiàn)。

12、實(shí)現(xiàn):一個(gè)卷積網(wǎng)絡(luò)

為了將我們的代碼轉(zhuǎn)化為卷積模型,我們需要為卷積層定義適當(dāng)?shù)臋?quán)重張量,然后將該卷積層添加到模型中。我們已經(jīng)理解到卷積層需要以下形式的權(quán)重張量。下面代碼是用 TensorFlow 語法來對其初始化:

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

在 TensorFlow 中,使用 tf.nn.conv2d 函數(shù)實(shí)現(xiàn)卷積層,該函數(shù)使用提供的權(quán)重在兩個(gè)方向上掃描輸入圖片。這僅僅是神經(jīng)元的加權(quán)和部分,你需要添加偏置單元并將加權(quán)和提供給激活函數(shù)。

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

不要過分在意 stride 的復(fù)雜語法,查閱文檔就能獲取完整的詳細(xì)信息。這里的填充(padding)策略是為了復(fù)制圖片的邊緣的像素。所有的數(shù)字都在一個(gè)統(tǒng)一的背景下,所以這僅僅是擴(kuò)展了背景,并且不應(yīng)該添加不需要的任何樣式。

現(xiàn)在該你了。修改你的模型并將其轉(zhuǎn)化為卷積模型。你可以使用上圖中的值來修改它,你可以減小你的學(xué)習(xí)速率但是務(wù)必先移除 dropout。

你的模型的準(zhǔn)確率應(yīng)該會超過 98%,并且最終達(dá)到約 99%。眼看目標(biāo)就要實(shí)現(xiàn),我們不能停止!看看測試的交叉熵曲線。在你的頭腦中,此時(shí),是否解決方案正在形成?

13、99% 準(zhǔn)確率的挑戰(zhàn)

調(diào)整你的神經(jīng)網(wǎng)絡(luò)的一個(gè)好方法:先去實(shí)現(xiàn)一個(gè)限制較多的神經(jīng)網(wǎng)絡(luò),然后給它更多的自由度并且增加 dropout,使神經(jīng)網(wǎng)絡(luò)避免過擬合。最終你將得到一個(gè)相當(dāng)不錯(cuò)的神經(jīng)網(wǎng)絡(luò)。

例如,我們在第一層卷積層中僅僅使用了 4 個(gè) patch,如果這些權(quán)重的 patch 在訓(xùn)練的過程中發(fā)展成不同的識別器,你可以直觀地看到這對于解決我們的問題是不夠的。手寫數(shù)字模式遠(yuǎn)多于 4 種基本樣式。

因此,讓我們稍微增加 patch 的數(shù)量,將我們卷積層中 patch 的數(shù)量從 4,8,12 增加到 6,12,24,并且在全連接層上添加 dropout。它們的神經(jīng)元重復(fù)使用相同的權(quán)重,在一次訓(xùn)練迭代中,通過凍結(jié)(限制)一些不會對它們起作用的權(quán)重,dropout 能夠有效地工作。

加油吧,去打破 99%的限制。增加 patch 數(shù)量和通道的數(shù)量,如上圖所示,在卷積層中添加 dropout。

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

使用上圖所示的模型,在 10000 個(gè)測試的數(shù)字中,結(jié)果僅僅錯(cuò)誤了 72 個(gè)。你可以在 MNIST 網(wǎng)站上發(fā)現(xiàn),數(shù)字識別準(zhǔn)確率的世界紀(jì)錄大約為 99.7%,這僅比我們用 100 行 Python/TensorFlow 代碼構(gòu)建的模型的準(zhǔn)確率高 0.4%。

最后,不同的 dropout 使我們能夠訓(xùn)練更大的卷積網(wǎng)絡(luò)。增加神經(jīng)網(wǎng)絡(luò)的額外自由度,使模型的最終準(zhǔn)確率從 98.9% 達(dá)到 99.1%。向卷積層中增加 dropout 不僅減少了測試誤差,而且使我們模型的準(zhǔn)確率突破 99%,甚至達(dá)到了 99.3%。

14、恭喜!

你已經(jīng)建立了你的第一個(gè)神經(jīng)網(wǎng)絡(luò),并且訓(xùn)練精度達(dá)到了 99%。在這個(gè)學(xué)習(xí)過程中,你所學(xué)到的技術(shù),并不局限于 MNIST 數(shù)據(jù)集。實(shí)際上,這些技術(shù)在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中被廣泛使用。作為禮物,下面提供的內(nèi)容可以用來幫助你回憶已經(jīng)所學(xué)的內(nèi)容。

  • 在完成了完全神經(jīng)網(wǎng)絡(luò)和卷積網(wǎng)絡(luò)后,你應(yīng)該學(xué)習(xí)循環(huán)神經(jīng)網(wǎng)絡(luò):https://www.tensorflow.org/tutorials/recurrent/。

  • 在本教程中,你已經(jīng)學(xué)習(xí)了如何在矩陣層次構(gòu)建 TensorFlow 模型。Tensorflow 還有更高級的 API,稱為 tf.learn:https://www.tensorflow.org/tutorials/tflearn/

  • 要在云上的分布式框架上訓(xùn)練,我們提供 Cloud ML 服務(wù):https://cloud.google.com/ml

  • 最后,我們希望收到你的反饋。如果你在發(fā)現(xiàn)了本實(shí)驗(yàn)中的些許錯(cuò)誤,或者你認(rèn)為有什么需要改進(jìn)的地方,請告訴我們。我們通過 GitHub 處理反饋。反饋鏈接:https://github.com/googlecodelabs/feedback/issues/new?title=[cloud-tensorflow-mnist]:&labels[]=content-platform&labels[]=cloud

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
深入MNIST 官方教程
【騰訊Bugly干貨分享】人人都可以做深度學(xué)習(xí)應(yīng)用:入門篇
分布式機(jī)器學(xué)習(xí)框架-TensorFlow on Spark(中)
深度學(xué)習(xí)筆記——深度學(xué)習(xí)框架TensorFlow
手把手教TensorFlow(附代碼)
《煉數(shù)成金》.第七課 遞歸神經(jīng)網(wǎng)絡(luò)LSTM的講解,以及LSTM網(wǎng)絡(luò)的使用學(xué)習(xí)筆記
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服