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

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

生活随笔

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

python

第02课:深度学习 Python 必备知识点

發(fā)布時(shí)間:2025/3/15 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第02课:深度学习 Python 必备知识点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

無(wú)論是在機(jī)器學(xué)習(xí)還是深度學(xué)習(xí)中,Python 已經(jīng)成為主導(dǎo)性的編程語(yǔ)言。而且,現(xiàn)在許多主流的深度學(xué)習(xí)框架,例如 PyTorch、TensorFlow 也都是基于 Python。這門(mén)課主要是圍繞 “理論 + 實(shí)戰(zhàn)” 同時(shí)進(jìn)行的,所以本文,我將重點(diǎn)介紹深度學(xué)習(xí)中 Python 的必備知識(shí)點(diǎn)。

為什么選擇 Python

Python 是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,由荷蘭人 Guido van Rossum 于 1989 年發(fā)明,第一個(gè)公開(kāi)發(fā)行版發(fā)行于 1991 年。Python 具有豐富和強(qiáng)大的庫(kù)。它常被昵稱為膠水語(yǔ)言,能夠把用其他語(yǔ)言制作的各種模塊(尤其是 C/C++)很輕松地聯(lián)結(jié)在一起。

為什么人工智能、深度學(xué)習(xí)會(huì)選擇 Python 呢?一方面是因?yàn)?Python 作為一門(mén)解釋型語(yǔ)言,入門(mén)簡(jiǎn)單、容易上手。另一方面是因?yàn)?Python 的開(kāi)發(fā)效率高,Python 有很多庫(kù)很方便做人工智能,比如 Numpy、Scipy 做數(shù)值計(jì)算的,Sklearn 做機(jī)器學(xué)習(xí)的,Matplotlib 將數(shù)據(jù)可視化的,等等。總的來(lái)說(shuō),Python 既容易上手,又是功能強(qiáng)大的編程語(yǔ)言。按照《Python 學(xué)習(xí)手冊(cè)》作者的說(shuō)法,Python 可以從支持航空航天器系統(tǒng)的開(kāi)發(fā)到小游戲開(kāi)發(fā)的幾乎所有的領(lǐng)域。

其實(shí),人工智能的核心算法的底層還是由 C/C++ 編寫(xiě)的,因?yàn)槭怯?jì)算密集型,需要非常精細(xì)的優(yōu)化,還需要 GPU、專用硬件之類的接口,這些都只有 C/C++ 能做到。Python 實(shí)際上是實(shí)現(xiàn) API 調(diào)用的功能,例如所有的深度學(xué)習(xí)框架 PyTorch、TensorFlow 等,底層都是由 C/C++ 編寫(xiě)的。由于 Python 是頂層高級(jí)語(yǔ)言,它的缺點(diǎn)就是運(yùn)行速度慢,但是這絲毫不影響 Python 的普及。如今,在 GPU 加速的前提下,Python 的運(yùn)行速度已經(jīng)很快了。在眾多因素影響下,Python 毫無(wú)疑問(wèn)成為了人工智能的最主要的編程語(yǔ)言。

下面這張圖來(lái)自 TIOBE 編程社區(qū) Top 10 編程語(yǔ)言 TIOBE 指數(shù)走勢(shì)(2002-2018):

如今,Python 排名已經(jīng)僅次于 Java、C、C++ 之后,排名第四,且呈逐年上升的趨勢(shì)。而在人工智能領(lǐng)域,Python 是當(dāng)之無(wú)愧的第一。

Python 目前有兩個(gè)版本:2 和 3。人工智能領(lǐng)域主要使用 Python 3,建議安裝 Python 3 版本。你也可以使用如下命令來(lái)查看當(dāng)前安裝的是哪個(gè)版本:

python --version

函數(shù) Function 與類 Class

Python 中的函數(shù)以關(guān)鍵字 def 來(lái)定義,例如:

def sign(x):if x > 0:return 'positive'elif x < 0:return 'negative'else:return 'zero'for x in [-1, 0, 1]:print(sign(x)) # Prints "negative", "zero", "positive"

上面呢,就是定義一個(gè) sign 函數(shù),根據(jù)輸入 x 與 0 的大小關(guān)系,返回 positive、negative 或 zero。

函數(shù)的形參也可以設(shè)置成默認(rèn)值,例如:

def greet(name, loud=False):if loud:print('HELLO, %s!' % name.upper())else:print('Hello, %s' % name)greet('Will') # Prints "Hello, Will" greet('Tony', loud=True) # Prints "HELLO, TONY!"

Python 中的類的概念和其他語(yǔ)言相比沒(méi)什么不同,例如:

class Greeter(object):# Constructordef __init__(self, name):self.name = name # Create an instance variable# Instance methoddef greet(self, loud=False):if loud:print('HELLO, %s!' % self.name.upper())else:print('Hello, %s' % self.name)g = Greeter('Will') # Construct an instance of the Greeter class g.greet() # Call an instance method; prints "Hello, Will" g.greet(loud=True) # Call an instance method; prints "HELLO, WILL!"

__init__ 函數(shù)是類的初始化函數(shù),所有成員變量都是 self 的,所以初始化函數(shù)一般都包含 self 參數(shù)。name 是類中函數(shù)將要調(diào)用的輸入?yún)?shù)。

Python 中類的繼承也非常簡(jiǎn)單,最基本的繼承方式就是定義類的時(shí)候把父類往括號(hào)里一放就行了:

class Know(Greeter):"""Class Know inheritenced from Greeter"""def meet(self):print('Nice to meet you!') k = Know('Will') # Construct an instance of the Greater class k.greet() # Call an instance method; prints "Hello, Will" k.meet() # Call an instance method; prints "Nice to meet you!"

向量化和矩陣

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型包含了大量的矩陣相乘運(yùn)算,如果使用 for 循環(huán),運(yùn)算速度會(huì)大大降低。Python 中可以使用 dot 函數(shù)進(jìn)行向量化矩陣運(yùn)算,來(lái)提高網(wǎng)絡(luò)運(yùn)算效率。我們用一個(gè)例子來(lái)比較說(shuō)明 for 循環(huán)和矩陣運(yùn)算各自的時(shí)間差異性。

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

輸出結(jié)果為:

>> 274877.869751 >> for loop:99.99990463256836ms >> 24986.1673877 >> Vectorized:0.9999275207519531ms

顯然,兩個(gè)矩陣相乘,使用 for 循環(huán)需要大約 100 ms,而使用向量化矩陣運(yùn)算僅僅需要大約 1 ms,效率得到了極大的提升。值得一提的是,神經(jīng)網(wǎng)絡(luò)模型有的矩陣維度非常大,這時(shí)候,使用矩陣直接相乘會(huì)更大程度地提高速度。所以,在構(gòu)建神經(jīng)網(wǎng)絡(luò)模型時(shí),我們應(yīng)該盡量使用矩陣相乘運(yùn)算,減少 for 循環(huá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ù)制多個(gè)操作數(shù),并把它們打包在大型寄存器的一組指令集。SIMD 能夠大大提高程序運(yùn)行速度,并行運(yùn)算也就是向量化矩陣運(yùn)算更快的原因。相比而言,GPU 的 SIMD 要比 CPU 更強(qiáng)大。

廣播 Broadcasting

Python 中的廣播(Broadcasting)機(jī)制非常強(qiáng)大,在神經(jīng)網(wǎng)絡(luò)模型矩陣運(yùn)算中非常有用。廣播機(jī)制主要包括以下幾個(gè)部分:

  • 讓所有輸入數(shù)組都向其中 shape 最長(zhǎng)的數(shù)組看齊,shape 中不足的部分都通過(guò)在前面加1補(bǔ)齊。
  • 輸出數(shù)組的 shape 是輸入數(shù)組 shape 的各個(gè)軸上的最大值。
  • 如果輸入數(shù)組的某個(gè)軸和輸出數(shù)組的對(duì)應(yīng)軸的長(zhǎng)度相同或者其長(zhǎng)度為 1 時(shí),這個(gè)數(shù)組能夠用來(lái)計(jì)算,否則出錯(cuò)。
  • 當(dāng)輸入數(shù)組的某個(gè)軸的長(zhǎng)度為 1 時(shí),沿著此軸運(yùn)算時(shí)都用此軸上的第一組值。

如果覺(jué)得上面幾條機(jī)制比較晦澀難懂,沒(méi)關(guān)系。簡(jiǎn)而言之,就是 Python 中可以對(duì)不同維度的矩陣進(jìn)行四則混合運(yùn)算,但至少保證有一個(gè)維度是相同的。下面我舉幾個(gè)簡(jiǎn)單的例子,你就明白了。

是不是覺(jué)得廣播機(jī)制很方便?這也正是 Python 強(qiáng)大的地方,能夠幫我們省很多事。

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

x.reshape(2,3)

關(guān)于矩陣維度,還有一些需要注意的地方。例如,我們定義一個(gè)向量,可能會(huì)這樣寫(xiě):

a = np.random.randn(6)

上面這條語(yǔ)句生成的向量維度既不是(6,1),也不是(1,6),而是(6,)。它既不是列向量也不是行向量,而是 rank 1 array。rank 1 array 的特點(diǎn)是它的轉(zhuǎn)置還是它本身。這種定義實(shí)際應(yīng)用中可能會(huì)帶來(lái)一些問(wèn)題,如果我們想要定義行向量或者列向量的話,最好這樣寫(xiě):

a = np.random.randn(1,6) a = np.random.randn(6,1)

另外,我們還可以使用 assert 語(yǔ)句對(duì)向量或者數(shù)組維度進(jìn)行判斷。如果與給定的維度不同,則程序在此處停止運(yùn)行。assert 的靈活使用可以幫助我們及時(shí)檢查神經(jīng)網(wǎng)絡(luò)模型中參數(shù)的維度是否正確。

assert(a == shape(6,1))

Matplotlib 繪圖

Matplotlib 是 Python 一個(gè)強(qiáng)大的繪圖庫(kù),下面我將簡(jiǎn)單介紹一下 matplotlib.pyplot 模塊。

plot 是 Matplotlib 主要的 2D 繪圖函數(shù),舉個(gè)簡(jiǎn)單的例子:

import numpy as np import matplotlib.pyplot as plt# Compute the x and y coordinates x = np.arange(0, 4 * np.pi, 0.1) y = np.sin(x)# Plot the points using matplotlib plt.plot(x, y) plt.show() # You must call plt.show() to make graphics appear.

我們也可以在一張圖片中同時(shí)畫(huà)多個(gè)曲線:

import numpy as np import matplotlib.pyplot as plt# Compute the x and y coordinates x = np.arange(0, 4 * np.pi, 0.1) y_sin = np.sin(x) y_cos = np.cos(x)# Plot the points using matplotlib plt.plot(x, y_sin) plt.plot(x, y_cos) plt.xlabel('x axis label') plt.ylabel('y axis label') plt.title('Sine and Cosine') plt.legend(['Sine', 'Cosine']) plt.show()

最后介紹一下圖片如何顯示:

import numpy as np from scipy.misc import imread, imresize import matplotlib.pyplot as pltimg = imread('./dog.jpg') img_tinted = img * [0.9, 0.9, 0.8]# Show the original image plt.subplot(2, 1, 1) plt.imshow(img)# Show the tinted image plt.subplot(2, 1, 2)# we explicitly cast the image to uint8 before displaying it. plt.imshow(np.uint8(img_tinted)) plt.show()

總結(jié)

本文主要介紹了一些 Python 的基礎(chǔ)知識(shí),包括為什么選擇 Python、函數(shù)和類、向量化和矩陣、廣播、Matplotlib 繪圖等。Python 的功能非常強(qiáng)大,其包含的內(nèi)容也太多了,我們不可能在一篇文章里介紹所有的 Python 知識(shí)。我在本文介紹的幾點(diǎn)內(nèi)容是神經(jīng)網(wǎng)絡(luò)編程的必備知識(shí)點(diǎn),這些內(nèi)容都會(huì)在接下來(lái)的章節(jié)編程中用到。

總結(jié)

以上是生活随笔為你收集整理的第02课:深度学习 Python 必备知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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