91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python的矩陣傳播機(jī)制

Linux愛(ài)好者 ? 來(lái)源:SimpleAI ? 作者:Beyond ? 2021-09-30 16:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、Python的矩陣傳播機(jī)制(Broadcasting)

我們知道在深度學(xué)習(xí)中經(jīng)常要操作各種矩陣(matrix)。

回想一下,我們?cè)诓僮鲾?shù)組(list)的時(shí)候,經(jīng)常習(xí)慣于用**for循環(huán)(for-loop)**來(lái)對(duì)數(shù)組的每一個(gè)元素進(jìn)行操作。例如:

my_list = [1,2,3,4]

new_list = []

for each in my_list:

new_list.append(each*2)

print(new_list) # 輸出 [2,3,4,5]

如果是矩陣呢:

my_matrix = [[1,2,3,4],

[5,6,7,8]]

new_matrix = [[],[]]

for i in range(2):

for j in range(4):

new_matrix[i].append(my_matrix[i][j]*2)

print(new_matrix)# 輸出 [[2, 4, 6, 8], [10, 12, 14, 16]]

實(shí)際上,上面的做法是十分的低效的!數(shù)據(jù)量小的話還不明顯,如果數(shù)據(jù)量大了,尤其是深度學(xué)習(xí)中我們處理的矩陣往往巨大,那用for循環(huán)去跑一個(gè)矩陣,可能要你幾個(gè)小時(shí)甚至幾天。

Python考慮到了這一點(diǎn),這也是本文主要想介紹的**“Python的broadcasting”即傳播機(jī)制**。

先說(shuō)一句,python中定義矩陣、處理矩陣,我們一般都用numpy這個(gè)庫(kù)。

二、下面展示什么是python的傳播機(jī)制

import numpy as np# 先定義一個(gè)3×3矩陣 A:

A = np.array(

[[1,2,3],

[4,5,6],

[7,8,9]])

print(“A:

”,A)

print(“

A*2:

”,A*2) # 直接用A乘以2print(“

A+10:

”,A+10) # 直接用A加上10

運(yùn)行結(jié)果:

A:

[[1 2 3]

[4 5 6]

[7 8 9]]

A*2:

[[ 2 4 6]

[ 8 10 12]

[14 16 18]]

A+10:

[[11 12 13]

[14 15 16]

[17 18 19]]

接著,再看看矩陣×(+)矩陣:

#定義一個(gè)3×1矩陣(此時(shí)也可叫向量了)

B = np.array([[10],

[100],

[1000]])

print(“

B:

”,B)

print(“

A+B:

”,A+B)

print(“

A*B:

”,A*B)

運(yùn)行結(jié)果:

B:

[[ 10]

[ 100]

[1000]]

A+B:

[[ 11 12 13]

[ 104 105 106]

[1007 1008 1009]]

A*B:

[[ 10 20 30]

[ 400 500 600]

[7000 8000 9000]]

可見(jiàn),雖然A和B的形狀不一樣,一個(gè)是3×3,一個(gè)是3×1,但是我們?cè)趐ython中可以直接相加、相乘,相減相除也可以。

也許看到這,大家都對(duì)broadcasting有感覺(jué)了。

用一個(gè)圖來(lái)示意一下:

所謂“傳播”,就是把一個(gè)數(shù)或者一個(gè)向量進(jìn)行“復(fù)制”,從而作用到矩陣的每一個(gè)元素上。

有了這種機(jī)制,那進(jìn)行向量和矩陣的運(yùn)算,就太方便了!理解了傳播機(jī)制,就可以隨心所欲地對(duì)矩陣進(jìn)行各種便捷的操作了。

利用numpy的內(nèi)置函數(shù)對(duì)矩陣進(jìn)行操作:

numpy內(nèi)置了很多的數(shù)學(xué)函數(shù),例如np.log(),np.abs(),np.maximum()等等上百種。直接把矩陣丟進(jìn)去,就可以算出新矩陣!示例:

print(np.log(A))

輸出把A矩陣每一個(gè)元素求log后得到的新矩陣:

array([[0. , 0.69314718, 1.09861229],

[1.38629436, 1.60943791, 1.79175947],

[1.94591015, 2.07944154, 2.19722458]])

再比如深度學(xué)習(xí)中常用的ReLU激活函數(shù),就是y=max(0,x),

也可以對(duì)矩陣直接運(yùn)算:

X = np.array([[1,-2,3,-4], [-9,4,5,6]])Y = np.maximum(0,X)print(Y)

得到:

[[1 0 3 0] [0 4 5 6]]

更多的numpy數(shù)學(xué)函數(shù),可以參見(jiàn)文檔:https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html

三、定義自己的函數(shù)來(lái)處理矩陣

其實(shí)這才是我寫(xiě)下本文的目的。。。前面扯了這么多,只是做個(gè)鋪墊(/ω\)

我昨天遇到個(gè)問(wèn)題,就是我要對(duì)ReLU函數(shù)求導(dǎo),易知,y=max(0,x)的導(dǎo)函數(shù)是:y’ = 0 if x《0y’ = 1 if x》0但是這個(gè)y’(x)numpy里面沒(méi)有定義,需要自己構(gòu)建。即,我需要將矩陣X中的小于0的元素變?yōu)?,大于0的元素變?yōu)?。搞了好久沒(méi)弄出來(lái),后來(lái)在StackOverflow上看到了解決辦法:

def relu_derivative(x):

x[x《0] = 0

x[x》0] = 1

return x

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(relu_derivative(X))

輸出:

[[1 0 1 0]

[0 1 1 1]]

**居然這么簡(jiǎn)潔就出來(lái)了!??!**ミ?Д?彡 (?Д?#)

這個(gè)函數(shù)relu_derivative中最難以理解的地方,就是**x[x》0]**了。于是我試了一下:

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(X[X》0])

print(X[X《0])

輸出:

[1 3 4 5 6]

[-2 -4 -9]

它直接把矩陣X中滿足條件的元素取了出來(lái)!原來(lái)python對(duì)矩陣還有這種操作!

震驚了我好久~

所以可以這么理解,X[X》0]相當(dāng)于一個(gè)“選擇器”,把滿足條件的元素選出來(lái),然后直接全部賦值。

用這種方法,我們便可以定義各種各樣我們需要的函數(shù),然后對(duì)矩陣整體進(jìn)行更新操作了!

四、綜上

可以看出,python以及numpy對(duì)矩陣的操作簡(jiǎn)直神乎其神,方便快捷又實(shí)惠。其實(shí)上面忘了寫(xiě)一點(diǎn),那就是計(jì)算機(jī)進(jìn)行矩陣運(yùn)算的效率要遠(yuǎn)遠(yuǎn)高于用for-loop來(lái)運(yùn)算,

不信可以用跑一跑:

# vetorization vs for loop# define two arrays a, b:

a = np.random.rand(1000000)

b = np.random.rand(1000000)

# for loop version:

t1 = time.time()

c = 0

for i in range(1000000):

c += a[i]*b[i]

t2 = time.time()

print(c)

print(“for loop version:”+str(1000*(t2-t1))+“ms”)

time1 = 1000*(t2-t1)

# vectorization version:

t1 = time.time()

c = np.dot(a,b)

t2 = time.time()

print(c)

print(“vectorization version:”+str(1000*(t2-t1))+“ms”)

time2 = 1000*(t2-t1)

print(“vectorization is faster than for loop by ”+str(time1/time2)+“ times!”)

運(yùn)行結(jié)果:

249765.8415288075

for loop version:627.4442672729492ms

249765.84152880745

vectorization version:1.5032291412353516ms

vectorization is faster than for loop by 417.39762093576525 times!

可見(jiàn),用for方法和向量化方法,計(jì)算結(jié)果是一樣,但是后者比前者快了400多倍!

因此,在計(jì)算量很大的時(shí)候,我們要盡可能想辦法對(duì)數(shù)據(jù)進(jìn)行Vectorizing,即“向量化”,以便讓計(jì)算機(jī)進(jìn)行矩陣運(yùn)算。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • for
    for
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    16286
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90076
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5599

    瀏覽量

    124408

原文標(biāo)題:消滅 for 循環(huán)!Python 的矩陣傳播機(jī)制和矩陣運(yùn)算

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    算法工程師需要具備哪些技能?

    、鏈?zhǔn)椒▌t等。應(yīng)用場(chǎng)景:梯度下降優(yōu)化算法、反向傳播計(jì)算等。 優(yōu)化理論核心內(nèi)容:凸優(yōu)化、非凸優(yōu)化、拉格朗日乘數(shù)法等。應(yīng)用場(chǎng)景:模型參數(shù)調(diào)優(yōu)、資源分配問(wèn)題等。 編程語(yǔ)言Python:主流選擇,用于數(shù)據(jù)處理、模型
    發(fā)表于 02-27 10:53

    高格欣科技液晶廣告機(jī):全場(chǎng)景智能顯示,賦能商業(yè)傳播新體驗(yàn)

    行業(yè)提供高效的視覺(jué)傳播解決方案。全尺寸矩陣覆蓋,精準(zhǔn)適配不同空間需求?!靖吒裥馈恳壕V告機(jī)提供從15.6寸到110寸的全尺寸選擇,兼顧精致空間與大型場(chǎng)館的差異化需求
    的頭像 發(fā)表于 01-13 16:57 ?562次閱讀
    高格欣科技液晶廣告機(jī):全場(chǎng)景智能顯示,賦能商業(yè)<b class='flag-5'>傳播</b>新體驗(yàn)

    沒(méi)有專(zhuān)利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無(wú) contrib 擴(kuò)展)都無(wú)專(zhuān)利風(fēng)險(xiǎn)——專(zhuān)利問(wèn)題僅存在于 opencv-contrib-python 擴(kuò)展模塊中的少數(shù)算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    高清混合矩陣 vs 傳統(tǒng)矩陣:別再瞎選!3 大核心差異 + 行業(yè)選型攻略,選錯(cuò)可能虧大了

    在數(shù)字化視聽(tīng)系統(tǒng)快速發(fā)展的當(dāng)下,矩陣切換器作為信號(hào)傳輸與調(diào)度的 “核心樞紐”,其性能差異直接影響著視聽(tīng)體驗(yàn)的質(zhì)量與系統(tǒng)運(yùn)行的穩(wěn)定性。目前市場(chǎng)上主流的矩陣切換器主要分為 “高清混合矩陣切換器
    的頭像 發(fā)表于 11-12 10:42 ?348次閱讀
    高清混合<b class='flag-5'>矩陣</b> vs 傳統(tǒng)<b class='flag-5'>矩陣</b>:別再瞎選!3 大核心差異 + 行業(yè)選型攻略,選錯(cuò)可能虧大了

    中興通訊斬獲ESG年度傳播影響力先鋒獎(jiǎng)

    近日,在“2025零碳使命國(guó)際氣候峰會(huì)暨綠色發(fā)展年度致敬典禮”上,中興通訊憑借在環(huán)境、社會(huì)與公司治理(ESG)領(lǐng)域的卓越實(shí)踐及全球傳播影響力,榮獲鳳凰衛(wèi)視“ESG年度傳播影響力先鋒”獎(jiǎng)。這一殊榮不僅充分肯定了中興通訊的可持續(xù)發(fā)展戰(zhàn)略和
    的頭像 發(fā)表于 10-29 15:10 ?785次閱讀

    淘寶商品詳情接口(item_get)企業(yè)級(jí)全解析:參數(shù)配置、簽名機(jī)制Python 代碼實(shí)戰(zhàn)

    本文詳解淘寶開(kāi)放平臺(tái)taobao.item_get接口對(duì)接全流程,涵蓋參數(shù)配置、MD5簽名生成、Python企業(yè)級(jí)代碼實(shí)現(xiàn)及高頻問(wèn)題排查,提供可落地的實(shí)戰(zhàn)方案,助你高效穩(wěn)定獲取商品數(shù)據(jù)。
    的頭像 發(fā)表于 09-26 09:13 ?862次閱讀
    淘寶商品詳情接口(item_get)企業(yè)級(jí)全解析:參數(shù)配置、簽名<b class='flag-5'>機(jī)制</b>與 <b class='flag-5'>Python</b> 代碼實(shí)戰(zhàn)

    termux調(diào)試python猜數(shù)字游戲

    用termux做一個(gè)猜數(shù)字游戲 下面是在Termux中創(chuàng)建猜數(shù)字游戲的步驟及完整實(shí)現(xiàn)方案,結(jié)合Python實(shí)現(xiàn)(最適配Termux環(huán)境): ? 一、環(huán)境準(zhǔn)備(Termux基礎(chǔ)配置) 1.
    發(fā)表于 08-29 17:15

    termux如何搭建python游戲

    termux如何搭建python游戲 Termux搭建Python游戲開(kāi)發(fā)環(huán)境的完整指南 一、Termux基礎(chǔ)環(huán)境準(zhǔn)備 Termux是一款無(wú)需root即可在安卓設(shè)備上運(yùn)行的Linux終端
    發(fā)表于 08-29 07:06

    python app不能運(yùn)行怎么解決?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    發(fā)表于 08-06 06:27

    軟通動(dòng)力斬獲年度企業(yè)公關(guān)傳播案例獎(jiǎng)

    近日,在2025第十三屆TopDigital創(chuàng)新?tīng)I(yíng)銷(xiāo)盛典上,憑借在公關(guān)傳播領(lǐng)域的卓越實(shí)踐與創(chuàng)新突破,軟通動(dòng)力從數(shù)百家參評(píng)企業(yè)中脫穎而出,斬獲“年度企業(yè)公關(guān)傳播案例”獎(jiǎng),成為本年度數(shù)字經(jīng)濟(jì)服務(wù)領(lǐng)域品牌建設(shè)的標(biāo)桿典范。
    的頭像 發(fā)表于 07-22 16:59 ?975次閱讀

    CAN總線傳播延遲過(guò)大導(dǎo)致通信異?,F(xiàn)象解析

    應(yīng)答信號(hào),影響數(shù)據(jù)傳輸確認(rèn)機(jī)制;也可能會(huì)引發(fā)數(shù)據(jù)采樣錯(cuò)誤,導(dǎo)致發(fā)送與接收位不一致,產(chǎn)生位錯(cuò)誤。本文將在不考慮其它影響下,對(duì)傳播延遲過(guò)大造成的應(yīng)答錯(cuò)誤現(xiàn)象進(jìn)行詳細(xì)解析。相
    的頭像 發(fā)表于 07-15 11:47 ?954次閱讀
    CAN總線<b class='flag-5'>傳播</b>延遲過(guò)大導(dǎo)致通信異?,F(xiàn)象解析

    信號(hào)如何在PCB中傳播

    為電磁兼容性(EMC)設(shè)計(jì)印刷電路板(PCB)時(shí),需要從電磁場(chǎng)和電流的角度深入理解信號(hào)傳播。這些概念之所以重要,是因?yàn)樗鼈儙椭覀冊(cè)O(shè)計(jì)出電磁場(chǎng)輻射低、對(duì)外部輻射或干擾敏感度低的 PCB。
    的頭像 發(fā)表于 06-09 16:08 ?5019次閱讀
    信號(hào)如何在PCB中<b class='flag-5'>傳播</b>

    矩陣混音技術(shù)快速入門(mén)

    A&H矩陣混音技術(shù)快速入門(mén)Live_Matrix_MixingChinese
    發(fā)表于 03-26 14:12 ?0次下載

    ?如何在虛擬環(huán)境中使用 Python,提升你的開(kāi)發(fā)體驗(yàn)~

    RaspberryPiOS預(yù)裝了Python,你需要使用其虛擬環(huán)境來(lái)安裝包。今天出版的最新一期《TheMagPi》雜志刊登了我們文檔負(fù)責(zé)人NateContino撰寫(xiě)的一篇實(shí)用教程,幫助你入門(mén)
    的頭像 發(fā)表于 03-25 09:34 ?818次閱讀
    ?如何在虛擬環(huán)境中使用 <b class='flag-5'>Python</b>,提升你的開(kāi)發(fā)體驗(yàn)~

    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行Python程序?

    在這篇文章中,我將為你簡(jiǎn)要介紹Python程序是什么、Python程序可以用來(lái)做什么,以及如何在RaspberryPi上編寫(xiě)和運(yùn)行一個(gè)簡(jiǎn)單的Python程序。什么是Python程序?
    的頭像 發(fā)表于 03-25 09:27 ?2058次閱讀
    零基礎(chǔ)入門(mén):如何在樹(shù)莓派上編寫(xiě)和運(yùn)行<b class='flag-5'>Python</b>程序?