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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度学习入门笔记(五):神经网络的编程基础

發(fā)布時(shí)間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习入门笔记(五):神经网络的编程基础 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎關(guān)注WX公眾號:【程序員管小亮】

專欄——深度學(xué)習(xí)入門筆記

聲明

1)該文章整理自網(wǎng)上的大牛和機(jī)器學(xué)習(xí)專家無私奉獻(xiàn)的資料,具體引用的資料請看參考文獻(xiàn)。
2)本文僅供學(xué)術(shù)交流,非商用。所以每一部分具體的參考資料并沒有詳細(xì)對應(yīng)。如果某部分不小心侵犯了大家的利益,還望海涵,并聯(lián)系博主刪除。
3)博主才疏學(xué)淺,文中如有不當(dāng)之處,請各位指出,共同進(jìn)步,謝謝。
4)此屬于第一版本,若有錯(cuò)誤,還需繼續(xù)修正與增刪。還望大家多多指點(diǎn)。大家都共享一點(diǎn)點(diǎn),一起為祖國科研的推進(jìn)添磚加瓦。

文章目錄

  • 歡迎關(guān)注WX公眾號:【程序員管小亮】
    • 專欄——深度學(xué)習(xí)入門筆記
    • 聲明
    • 深度學(xué)習(xí)入門筆記(五):神經(jīng)網(wǎng)絡(luò)的編程基礎(chǔ)
      • 1、Jupyter/iPython Notebooks快速入門
      • 2、Python 中的廣播
      • 3、關(guān)于numpy向量的說明
      • 4、編程框架的選擇問題
    • 推薦閱讀
    • 參考文章

深度學(xué)習(xí)入門筆記(五):神經(jīng)網(wǎng)絡(luò)的編程基礎(chǔ)

1、Jupyter/iPython Notebooks快速入門

學(xué)到現(xiàn)在,你需要知道常用的python的編譯器,推薦使用anaconda而不是官方的python,這樣的話更容易安裝各種第三方庫,如何安裝可以看一下這個(gè)博客——Windows10 下 Anaconda和 PyCharm 的詳細(xì)的安裝教程(圖文并茂)。

至于IDE的話,pycharm 適合于大型項(xiàng)目的編寫和調(diào)試,Jupyter Notebook 適合于學(xué)習(xí)和數(shù)據(jù)挖掘探索,這里我們就快速地學(xué)習(xí)一下 Jupyter Notebook 工具。

這就是 Jupyter Notebook 的界面,讓我快速地講解下它的一些特性。

這里有一些空白區(qū)域的代碼塊,可以編寫代碼,而較長的灰色區(qū)域就是代碼塊。

比如,編寫打印輸出著名的程序員入門語句——Hello World 的代碼,然后執(zhí)行這一代碼塊,最終,它就會輸出我們想要的 Hello World。

在運(yùn)行一個(gè)單元格 cell 時(shí),你也可以選擇運(yùn)行其中的一塊代碼區(qū)域。通過點(diǎn)擊 Cell 菜單的 Run Cells 執(zhí)行這部分代碼。

在你的計(jì)算機(jī)上,運(yùn)行 cell 的鍵盤快捷方式是 Ctrl + enter。但是也可以使用 shift + enter 來運(yùn)行 cell,不過這樣會默認(rèn)跳轉(zhuǎn)到下一個(gè)代碼區(qū)域。

當(dāng)閱讀指南時(shí),如果不小心雙擊了它,點(diǎn)中的區(qū)域就會變成 markdown 語言形式。如果不小心使其變成了這樣的文本框,只要運(yùn)行下單元格 cell,就可以回到原來的形式。所以,點(diǎn)擊 cell 菜單的 Run Cells 或者使用 Ctrl + enter,就可以使得它變回原樣。markdown 格式可以用來寫筆記,以免自己忘記了代碼中的知識。

這里還有一些其他的小技巧。比如當(dāng)執(zhí)行上面所使用的代碼時(shí),它實(shí)際上會使用一個(gè)內(nèi)核在服務(wù)器上運(yùn)行這段代碼。如果你正在運(yùn)行超負(fù)荷的進(jìn)程,或者電腦運(yùn)行了很長一段時(shí)間,或者在運(yùn)行中出了錯(cuò),又或者網(wǎng)絡(luò)連接失敗,這里依然有機(jī)會讓 Kernel 重新工作。你只要點(diǎn)擊 Kernel,選擇 Restart,它會重新運(yùn)行 Kernel 使程序繼續(xù)工作。

所以,如果只是運(yùn)行相對較小的工作并且才剛剛啟動你的臺式電腦或筆記本電腦,這種情況應(yīng)該是不會發(fā)生的。但是,如果你看見錯(cuò)誤信息,比如 Kernel 已經(jīng)中斷或者其他信息,你可以試著重啟 Kernel,這樣就簡單地重啟程序了。

當(dāng)使用 Notebook 時(shí)會有多個(gè)代碼區(qū)域塊。盡管并沒有在前面的代碼塊中添加自己的代碼,但還是要確保先執(zhí)行這塊代碼。因?yàn)樵谶@個(gè)例子,它導(dǎo)入了 numpy 包并另命名為 np 等,并聲明了一些可能需要的變量。為了能順利地執(zhí)行下面的代碼,就必須確保先執(zhí)行上面的代碼,即使不要求寫其他的代碼,這樣其他程序就可以默認(rèn)是在這些庫的調(diào)用下運(yùn)行了。

最后就是編譯環(huán)境的選擇,正常情況下 Notebook 的編譯環(huán)境是默認(rèn)的,但是你也可以自己新建一個(gè)環(huán)境,這個(gè)具體操作在這個(gè)博客中——Windows10 下 Anaconda和 PyCharm 的詳細(xì)的安裝教程(圖文并茂),比如我這里新建的環(huán)境 Pytorch for Deeplearning,就是專門為 pytorch 的學(xué)習(xí)而建立的,可以通過 Kernel 下的 Change kernel,選擇 Pytorch for Deeplearning,就ok了。

這個(gè)就是默認(rèn)的 kernel

這個(gè)是我自己建的 kernel。

你會發(fā)現(xiàn)這種交互式的 shell 命令,在 Notebooks 是非常有用的,能使你快速地實(shí)現(xiàn)代碼并且查看輸出結(jié)果,便于學(xué)習(xí),同時(shí)還可以記錄在這個(gè)過程中的想法。好好學(xué)習(xí)它的使用,你會發(fā)現(xiàn)更多的驚喜。

2、Python 中的廣播


這是一個(gè)不同食物(每100g)中不同營養(yǎng)成分的卡路里含量表格,表格為3行4列,列表示不同的食物種類,從左至右依次為蘋果(Apples),牛肉(Beef),雞蛋(Eggs),土豆(Potatoes)。行表示不同的營養(yǎng)成分,從上到下依次為碳水化合物,蛋白質(zhì),脂肪。

那么,現(xiàn)在假設(shè)我們想要計(jì)算不同食物中不同營養(yǎng)成分中的卡路里百分比,應(yīng)該怎么做?

以計(jì)算蘋果中的碳水化合物卡路里百分比含量為例,首先計(jì)算蘋果(Apples)(100g)中三種營養(yǎng)成分卡路里總和 56+1.2+1.8 = 59,然后用 56 / 59 = 94.9% 算出結(jié)果??梢悦黠@地看出蘋果(Apples)中的卡路里大部分來自于碳水化合物(Carb),而牛肉(Beef)則不同。對于其他食物,計(jì)算方法類似。首先,按列求和,計(jì)算每種食物中(100g)三種營養(yǎng)成分總和,然后分別用不用營養(yǎng)成分的卡路里數(shù)量除以總和,計(jì)算百分比。

那么,能否在向量化(深度學(xué)習(xí)入門筆記(四):向量化)的基礎(chǔ)上用代碼完成這樣的一個(gè)計(jì)算過程呢?

當(dāng)然是可以的,假設(shè)上圖的表格是一個(gè)4行3列的矩陣 AAA,記為 A3×4A_{3\times 4}A3×4?,接下來使用 Pythonnumpy 庫完成這樣的計(jì)算。使用兩行代碼就可以完成整個(gè)過程,第一行代碼對每一列進(jìn)行求和,第二行代碼分別計(jì)算每種食物每種營養(yǎng)成分的百分比。

jupyter notebook 中輸入如下代碼,按 Ctrl + Enter 運(yùn)行,輸出如下:

下面再計(jì)算每列的和,可以看到輸出是每種食物(100g)的卡路里總和。

其中 sum 的參數(shù) axis=0 表示求和運(yùn)算按列執(zhí)行,之后會詳細(xì)解釋。

接下來計(jì)算百分比,這條指令將 3×43\times 43×4 的矩陣 AAA 除以一個(gè) 1×41 \times 41×4 的矩陣,得到了一個(gè) 3×43 \times 43×4 的結(jié)果矩陣,這個(gè)結(jié)果矩陣就是要求的百分比含量。

到這里問題就解決了,現(xiàn)在來解釋一下 A.sum(axis = 0) 中的參數(shù) axis。axis用來指明將要進(jìn)行的運(yùn)算是沿著哪個(gè)軸執(zhí)行,在numpy中,0軸是垂直的,也就是列,而1軸是水平的,也就是行。 而第二個(gè) A / cal.reshape(1, 4) 指令則調(diào)用了 numpy 中的廣播機(jī)制。這里使用 3×43 \times 43×4 的矩陣 AAA 除以 1×41 \times 41×4 的矩陣 calcalcal。技術(shù)上來講,其實(shí)并不需要再將矩陣 calcalcal reshape (重塑)成 1×41 \times 41×4,因?yàn)榫仃?calcalcal 本身已經(jīng)是 1×41 \times 41×4 了。但是當(dāng)我們寫代碼的過程中出現(xiàn)不確定矩陣維度的時(shí)候,通常會對矩陣進(jìn)行重塑來確保得到想要的列向量或行向量。重塑操作 reshape 是一個(gè)常量時(shí)間的操作,時(shí)間復(fù)雜度是 O(1)O(1)O(1),它的調(diào)用代價(jià)極低,所以使用是沒問題的,也推薦大家使用。

那么一個(gè) 3×43 \times 43×4 的矩陣是怎么和 1×41 \times 41×4 的矩陣做除法的呢?來看一些廣播的例子:

numpy 中,當(dāng)一個(gè) 4×14 \times 14×1 的列向量與一個(gè)常數(shù)做加法時(shí),實(shí)際上會將常數(shù)擴(kuò)展為一個(gè) 4×14 \times 14×1 的列向量,然后兩者做逐元素加法。結(jié)果就是右邊的這個(gè)向量。這種廣播機(jī)制對于行向量和列向量均可以使用。

再看下一個(gè)例子。

用一個(gè) 2×32 \times 32×3 的矩陣和一個(gè) 1×31 \times 31×3 的矩陣相加,其泛化形式是 m×nm \times nm×n 的矩陣和 1×n1 \times n1×n 的矩陣相加。在執(zhí)行加法操作時(shí),其實(shí)是將 1×n1 \times n1×n 的矩陣復(fù)制成為 m×nm \times nm×n 的矩陣,然后兩者做逐元素加法得到結(jié)果。針對這個(gè)具體例子,相當(dāng)于在矩陣的第一列全部加100,第二列全部加200,第三列全部加300。這就是在前面例子中計(jì)算卡路里百分比的廣播機(jī)制,只不過那里是除法操作,這里是加法操作(廣播機(jī)制與執(zhí)行的運(yùn)算種類無關(guān))。

下面是最后一個(gè)例子。

這里相當(dāng)于是一個(gè) m×nm \times nm×n 的矩陣加上一個(gè) m×1m \times 1m×1 的矩陣。在進(jìn)行運(yùn)算時(shí),會先將 m×1m \times 1m×1 矩陣水平復(fù)制 nnn 次,變成一個(gè) m×nm \times nm×n 的矩陣,然后再執(zhí)行逐元素加法。

廣播機(jī)制的一般原則如下:

  • 首先是 numpy 廣播機(jī)制

這里的廣播和播音廣播是完全不同的,它的要求是什么呢?什么樣的條件下可以使用廣播?

要求:如果兩個(gè)數(shù)組的后緣維度的軸長度相符或其中一方的軸長度為1,則認(rèn)為它們是廣播兼容的。廣播會在缺失維度和軸長度為1的維度上進(jìn)行。

如何計(jì)算后緣維度的軸長度?可以使用代碼 A.shape[-1] 即矩陣維度元組中的最后一個(gè)位置的值,就是矩陣維度的最后一個(gè)維度,比如卡路里計(jì)算的例子中,矩陣 A3,4A_{3,4}A3,4? 后緣維度的軸長度是4,而矩陣 cal1,4cal_{1,4}cal1,4? 的后緣維度也是4,故滿足了后緣維度軸長度相符的條件,可以進(jìn)行廣播。廣播會在軸長度為1的維度上進(jìn)行,軸長度為1的維度對應(yīng) axis=0,即垂直方向,矩陣 cal1,4cal_{1,4}cal1,4? 沿 axis=0 (垂直方向)復(fù)制成為 calTemp3,4calTemp_{3,4}calTemp3,4? ,之后兩者進(jìn)行逐元素除法運(yùn)算。

簡單概括總結(jié)就是,先變成一樣大,再逐元素除法。

  • 然后解釋圖中的例子

矩陣 Am,nA_{m,n}Am,n? 和矩陣 B1,nB_{1,n}B1,n? 進(jìn)行四則運(yùn)算,后緣維度軸長度相符,符合條件,可以廣播,廣播沿著軸長度為1的軸進(jìn)行,即 B1,nB_{1,n}B1,n? 廣播成為 Bm,n′{B_{m,n}}'Bm,n? ,之后做逐元素四則運(yùn)算。

矩陣 Am,nA_{m,n}Am,n? 和矩陣 Bm,1B_{m,1}Bm,1? 進(jìn)行四則運(yùn)算,后緣維度軸長度不相符,但其中一方軸長度為1,符合條件,可以廣播,廣播沿著軸長度為1的軸進(jìn)行,即 Bm,1B_{m,1}Bm,1? 廣播成為 Bm,n′{B_{m,n}}'Bm,n? ,之后做逐元素四則運(yùn)算。

矩陣 Am,1A_{m,1}Am,1? 和常數(shù) RRR 進(jìn)行四則運(yùn)算,后緣維度軸長度不相符,但其中一方軸長度為1,符合條件,可以廣播,廣播沿著缺失維度的軸進(jìn)行,缺失維度就是 axis=0,軸長度為1的軸是 axis=1,即 RRR 廣播成為 Bm,1′{B_{m,1}}'Bm,1? ,之后做逐元素四則運(yùn)算。

最后總結(jié)一下 broadcasting,可以看看下面的圖:

3、關(guān)于numpy向量的說明

Python 的特性允許你使用 廣播(broadcasting) 功能,這是 Pythonnumpy 程序語言庫中最靈活的地方,但這是程序語言的優(yōu)點(diǎn),也是缺點(diǎn)。

  • 優(yōu)點(diǎn)的原因,在于它們創(chuàng)造出語言的表達(dá)性,Python 語言巨大的靈活性使得你僅僅通過一行代碼就能做很多事情。
  • 缺點(diǎn)的原因,由于廣播巨大的靈活性,有時(shí)候?qū)τ趶V播的特點(diǎn)以及廣播的工作原理這些細(xì)節(jié)不熟悉的話,可能會產(chǎn)生很細(xì)微或者看起來很奇怪的 bug

為了演示 Python-numpy 的一個(gè)容易被忽略的效果,特別是怎樣在 Python-numpy 中構(gòu)造向量,來做一個(gè)快速示范。

首先設(shè)置 a=np.random.randn(5)a=np.random.randn(5)a=np.random.randn(5),這樣會生成存儲在數(shù)組 aaa 中的5個(gè)高斯隨機(jī)數(shù)變量;然后輸出 aaa,從屏幕上可以得知,此時(shí) aaashape(形狀) 是一個(gè) (5,)(5, )(5,) 的結(jié)構(gòu)同樣地,a.Ta.Ta.Tshape 也是這樣的。這在 Python 中被稱作 一個(gè)一維數(shù)組。它既不是一個(gè)行向量也不是一個(gè)列向量,這也導(dǎo)致它有一些不是很直觀的效果。

比如 aaaaaa 的轉(zhuǎn)置陣最終結(jié)果看起來一樣,shape 也是一樣的。但是輸出 aaaaaa 的轉(zhuǎn)置陣的內(nèi)積,你可能會想,aaa 乘以 aaa 的轉(zhuǎn)置,返回的可能會是一個(gè)矩陣。但如果這樣做,你只會得到一個(gè)數(shù)。

所以在編寫神經(jīng)網(wǎng)絡(luò)時(shí),不要使用 shape 為 (5,)、(n,) 或者其他一維數(shù)組的數(shù)據(jù)結(jié)構(gòu)。相反,設(shè)置 aaa(5,1)(5,1)(5,1),這樣就是一個(gè)5行1列的向量。在先前的操作里 aaaaaa 的轉(zhuǎn)置看起來一樣,而現(xiàn)在這樣的 aaa 變成一個(gè)新的 aaa 的轉(zhuǎn)置,并且它是一個(gè)行向量。當(dāng)輸出 aaa 的轉(zhuǎn)置時(shí)有兩對方括號,而之前只有一對方括號,所以這就是 1行5列的矩陣和一維數(shù)組的差別

如果這次再輸出 aaaaaa 的轉(zhuǎn)置的乘積,會返回一個(gè)向量的外積,也就是一個(gè)矩陣。這就符合我們的預(yù)期了,也就是在可控范圍內(nèi)了,因?yàn)槟阒雷约旱拇a輸出是什么了。

除了,輸入確定維度的矩陣或向量之外,還有一件事,就是如果你不能完全確定一個(gè)向量的維度,建議你扔一個(gè) 斷言語句(assertion statement) 進(jìn)去。這樣,就可以確保在這種情況下是否是一個(gè) (5,1)(5,1)(5,1) 向量了,或者說是一個(gè)列向量。

如果不對的話,就會報(bào)一個(gè)叫做 AssertionError 的錯(cuò)誤!!!

4、編程框架的選擇問題

這個(gè)我在 大話卷積神經(jīng)網(wǎng)絡(luò)CNN(干貨滿滿) 中講過,目前主流的是 Google的TensorFlow、Facebook的pytorch 還有 百度的paddlepaddle,如果是研究的話,我建議使用TensorFlow,因?yàn)樗美斫庖幌禄A(chǔ)原理,而不是單純的調(diào)包俠。大話卷積神經(jīng)網(wǎng)絡(luò)CNN(干貨滿滿) 博客中也寫了相關(guān)的資源推薦,這里就不詳細(xì)說了。

推薦閱讀

  • 深度學(xué)習(xí)入門筆記(一):深度學(xué)習(xí)引言
  • 深度學(xué)習(xí)入門筆記(二):神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
  • 深度學(xué)習(xí)入門筆記(三):求導(dǎo)和計(jì)算圖
  • 深度學(xué)習(xí)入門筆記(四):向量化
  • 深度學(xué)習(xí)入門筆記(五):神經(jīng)網(wǎng)絡(luò)的編程基礎(chǔ)
  • 深度學(xué)習(xí)入門筆記(六):淺層神經(jīng)網(wǎng)絡(luò)
  • 深度學(xué)習(xí)入門筆記(七):深層神經(jīng)網(wǎng)絡(luò)
  • 深度學(xué)習(xí)入門筆記(八):深層網(wǎng)絡(luò)的原理
  • 深度學(xué)習(xí)入門筆記(九):深度學(xué)習(xí)數(shù)據(jù)處理
  • 深度學(xué)習(xí)入門筆記(十):正則化
  • 深度學(xué)習(xí)入門筆記(十一):權(quán)重初始化
  • 深度學(xué)習(xí)入門筆記(十二):深度學(xué)習(xí)數(shù)據(jù)讀取
  • 深度學(xué)習(xí)入門筆記(十三):批歸一化(Batch Normalization)
  • 深度學(xué)習(xí)入門筆記(十四):Softmax
  • 深度學(xué)習(xí)入門筆記(十五):深度學(xué)習(xí)框架(TensorFlow和Pytorch之爭)
  • 深度學(xué)習(xí)入門筆記(十六):計(jì)算機(jī)視覺之邊緣檢測
  • 深度學(xué)習(xí)入門筆記(十七):深度學(xué)習(xí)的極限在哪?
  • 深度學(xué)習(xí)入門筆記(十八):卷積神經(jīng)網(wǎng)絡(luò)(一)
  • 深度學(xué)習(xí)入門筆記(十九):卷積神經(jīng)網(wǎng)絡(luò)(二)
  • 深度學(xué)習(xí)入門筆記(二十):經(jīng)典神經(jīng)網(wǎng)絡(luò)(LeNet-5、AlexNet和VGGNet)

參考文章

  • 吳恩達(dá)——《神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)》視頻課程

總結(jié)

以上是生活随笔為你收集整理的深度学习入门笔记(五):神经网络的编程基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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