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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

第二周:神经网络的编程基础之Python与向量化

發(fā)布時間:2024/7/5 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二周:神经网络的编程基础之Python与向量化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)課我們將來探討Python和向量化的相關(guān)知識。

1. Vectorization

深度學(xué)習(xí)算法中,數(shù)據(jù)量很大,在程序中應(yīng)該盡量減少使用循環(huán)語句,而可以使用向量運(yùn)算來提高程序運(yùn)行速度。

向量化(Vectorization)就是利用矩陣運(yùn)算的思想,大大提高運(yùn)算速度。例如下面所示在Python中使用向量化要比使用循環(huán)計(jì)算速度快得多。

import numpy as np import timea = np.random.rand(1000000) b = np.random.rand(1000000)tic = time.time() c = np.dot(a,b) toc = time.time()print(c) print("Vectorized version:" + str(1000*(toc-tic)) + "ms")c = 0 tic = time.time() for i in range(1000000):c += a[i]*b[i] toc = time.time()print(c) print("for loop:" + str(1000*(toc-tic)) + "ms")

輸出結(jié)果類似于:

250286.989866 Vectorized version:1.5027523040771484ms 250286.989866 For loop:474.29513931274414ms

從程序運(yùn)行結(jié)果上來看,該例子使用for循環(huán)運(yùn)行時間是使用向量運(yùn)算運(yùn)行時間的約300倍。因此,深度學(xué)習(xí)算法中,使用向量化矩陣運(yùn)算的效率要高得多。

為了加快深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)運(yùn)算速度,可以使用比CPU運(yùn)算能力更強(qiáng)大的GPU。事實(shí)上,GPU和CPU都有并行指令(parallelization instructions),稱為Single Instruction Multiple Data(SIMD)。SIMD是單指令多數(shù)據(jù)流,能夠復(fù)制多個操作數(shù),并把它們打包在大型寄存器的一組指令集。SIMD能夠大大提高程序運(yùn)行速度,例如python的numpy庫中的內(nèi)建函數(shù)(built-in function)就是使用了SIMD指令。相比而言,GPU的SIMD要比CPU更強(qiáng)大一些。

2. More Vectorization Examples

應(yīng)該盡量避免使用for循環(huán)而使用向量化矩陣運(yùn)算。在python的numpy庫中,我們通常使用np.dot()函數(shù)來進(jìn)行矩陣運(yùn)算。

我們將向量化的思想使用在邏輯回歸算法上,盡可能減少for循環(huán),而只使用矩陣運(yùn)算。值得注意的是,算法最頂層的迭代訓(xùn)練的for循環(huán)是不能替換的。而每次迭代過程對J,dw,b的計(jì)算是可以直接使用矩陣運(yùn)算。

3. Vectorizing Logistic Regression

整個訓(xùn)練樣本構(gòu)成的輸入矩陣X的維度是(nxnx,m),權(quán)重矩陣w的維度是(nxnx,1),b是一個常數(shù)值,而整個訓(xùn)練樣本構(gòu)成的輸出矩陣Y的維度為(1,m)。利用向量化的思想,所有m個樣本的線性輸出Z可以用矩陣表示:

在python的numpy庫中可以表示為:

Z = np.dot(w.T,X) + b A = sigmoid(Z)

其中,w.T表示w的轉(zhuǎn)置。

這樣,我們就能夠使用向量化矩陣運(yùn)算代替for循環(huán),對所有m個樣本同時運(yùn)算,大大提高了運(yùn)算速度。

4. Vectorizing Logistic Regression’s Gradient Output

邏輯回歸中的梯度下降算法如何轉(zhuǎn)化為向量化的矩陣形式。對于所有m個樣本,dZ的維度是(1,m),可表示為:

db可表示為:

?對應(yīng)的程序?yàn)?#xff1a;

db = 1/m*np.sum(dZ)

dw可表示為:

?對應(yīng)的程序?yàn)?#xff1a;

dw = 1/m*np.dot(X,dZ.T)

我們把整個邏輯回歸中的for循環(huán)盡可能用矩陣運(yùn)算代替,對于單次迭代,梯度下降算法流程如下所示:

Z = np.dot(w.T,X) + b A = sigmoid(Z) dZ = A-Y dw = 1/m*np.dot(X,dZ.T) db = 1/m*np.sum(dZ)w = w - alpha*dw b = b - alpha*db

其中,alpha是學(xué)習(xí)因子,決定w和b的更新速度。上述代碼只是對單次訓(xùn)練更新而言的,外層還需要一個for循環(huán),表示迭代次數(shù)。

5. Broadcasting in Python

下面介紹使用python的另一種技巧:廣播(Broadcasting)。python中的廣播機(jī)制可由下面四條表示:

  • 讓所有輸入數(shù)組都向其中shape最長的數(shù)組看齊,shape中不足的部分都通過在前面加1補(bǔ)齊
  • 輸出數(shù)組的shape是輸入數(shù)組shape的各個軸上的最大值
  • 如果輸入數(shù)組的某個軸和輸出數(shù)組的對應(yīng)軸的長度相同或者其長度為1時,這個數(shù)組能夠用來計(jì)算,否則出錯
  • 當(dāng)輸入數(shù)組的某個軸的長度為1時,沿著此軸運(yùn)算時都用此軸上的第一組值
  • 簡而言之,就是python中可以對不同維度的矩陣進(jìn)行四則混合運(yùn)算,但至少保證有一個維度是相同的。下面給出幾個廣播的例子,具體細(xì)節(jié)可參閱python的相關(guān)手冊,這里就不贅述了。

    值得一提的是,在python程序中為了保證矩陣運(yùn)算正確,可以使用reshape()函數(shù)來對矩陣設(shè)定所需的維度。這是一個很好且有用的習(xí)慣。

    6. A note on python/numpy vectors

    接下來我們將總結(jié)一些python的小技巧,避免不必要的code bug。

    python中,如果我們用下列語句來定義一個向量:

    a = np.random.randn(5)

    這條語句生成的a的維度是(5,)。它既不是行向量也不是列向量,我們把a(bǔ)叫做rank 1 array。這種定義會帶來一些問題。例如我們對a進(jìn)行轉(zhuǎn)置,還是會得到a本身。所以,如果我們要定義(5,1)的列向量或者(1,5)的行向量,最好使用下來標(biāo)準(zhǔn)語句,避免使用rank 1 array。

    a = np.random.randn(5,1) b = np.random.randn(1,5)

    除此之外,我們還可以使用assert語句對向量或數(shù)組的維度進(jìn)行判斷,例如:

    assert(a.shape == (5,1))

    assert會對內(nèi)嵌語句進(jìn)行判斷,即判斷a的維度是不是(5,1)的。如果不是,則程序在此處停止。使用assert語句也是一種很好的習(xí)慣,能夠幫助我們及時檢查、發(fā)現(xiàn)語句是否正確。

    另外,還可以使用reshape函數(shù)對數(shù)組設(shè)定所需的維度:

    a.reshape((5,1))

    7. Quick tour of Jupyter/iPython Notebooks

    Jupyter notebook(又稱IPython notebook)是一個交互式的筆記本,支持運(yùn)行超過40種編程語言。本課程所有的編程練習(xí)題都將在Jupyter notebook上進(jìn)行,使用的語言是python。

    8. Explanation of logistic regression cost function(optional)

    在上一節(jié)課的筆記中,我們介紹過邏輯回歸的Cost function。接下來我們將簡要解釋這個Cost function是怎么來的。

    首先,預(yù)測輸出y^y^的表達(dá)式可以寫成:


    其中,

    y^可以看成是預(yù)測輸出為正類(+1)的概率:

    那么,當(dāng)y=1時:

    當(dāng)y=0時:

    ?我們把上面兩個式子整合到一個式子中,得到:

    由于log函數(shù)的單調(diào)性,可以對上式P(y|x)進(jìn)行l(wèi)og處理:

    我們希望上述概率P(y|x)越大越好,對上式加上負(fù)號,則轉(zhuǎn)化成了單個樣本的Loss function,越小越好,也就得到了我們之前介紹的邏輯回歸的Loss function形式。

    如果對于所有m個訓(xùn)練樣本,假設(shè)樣本之間是獨(dú)立同分布的(iid),我們希望總的概率越大越好:

    ?同樣引入log函數(shù),加上負(fù)號,將上式轉(zhuǎn)化為Cost function:


    上式中,1/m表示對所有m個樣本的Cost function求平均,是縮放因子。?

    9. Summary
    本節(jié)課我們主要介紹了神經(jīng)網(wǎng)絡(luò)基礎(chǔ)——python和向量化。在深度學(xué)習(xí)程序中,使用向量化和矩陣運(yùn)算的方法能夠大大提高運(yùn)行速度,節(jié)省時間。以邏輯回歸為例,我們將其算法流程包括梯度下降轉(zhuǎn)換為向量化的形式。同時,我們也介紹了python的相關(guān)編程方法和技巧。

    總結(jié)

    以上是生活随笔為你收集整理的第二周:神经网络的编程基础之Python与向量化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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