精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python的矩陣傳播機制

Linux愛好者 ? 來源:SimpleAI ? 作者:Beyond ? 2021-09-30 16:53 ? 次閱讀

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

我們知道在深度學習中經常要操作各種矩陣(matrix)。

回想一下,我們在操作數組(list)的時候,經常習慣于用**for循環(for-loop)**來對數組的每一個元素進行操作。例如:

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

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

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

先說一句,python中定義矩陣、處理矩陣,我們一般都用numpy這個庫。

二、下面展示什么是python的傳播機制

import numpy as np# 先定義一個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

運行結果:

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

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

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

B = np.array([[10],

[100],

[1000]])

print(“

B:

”,B)

print(“

A+B:

”,A+B)

print(“

A*B:

”,A*B)

運行結果:

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

可見,雖然A和B的形狀不一樣,一個是3×3,一個是3×1,但是我們在python中可以直接相加、相乘,相減相除也可以。

也許看到這,大家都對broadcasting有感覺了。

用一個圖來示意一下:

所謂“傳播”,就是把一個數或者一個向量進行“復制”,從而作用到矩陣的每一個元素上。

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

利用numpy的內置函數對矩陣進行操作:

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

print(np.log(A))

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

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

[1.38629436, 1.60943791, 1.79175947],

[1.94591015, 2.07944154, 2.19722458]])

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

也可以對矩陣直接運算:

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數學函數,可以參見文檔:https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html

三、定義自己的函數來處理矩陣

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

我昨天遇到個問題,就是我要對ReLU函數求導,易知,y=max(0,x)的導函數是:y’ = 0 if x《0y’ = 1 if x》0但是這個y’(x)numpy里面沒有定義,需要自己構建。即,我需要將矩陣X中的小于0的元素變為0,大于0的元素變為1。搞了好久沒弄出來,后來在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]]

**居然這么簡潔就出來了!!!**ミ?Д?彡 (?Д?#)

這個函數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中滿足條件的元素取了出來!原來python對矩陣還有這種操作!

震驚了我好久~

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

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

四、綜上

可以看出,python以及numpy對矩陣的操作簡直神乎其神,方便快捷又實惠。其實上面忘了寫一點,那就是計算機進行矩陣運算的效率要遠遠高于用for-loop來運算,

不信可以用跑一跑:

# 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!”)

運行結果:

249765.8415288075

for loop version:627.4442672729492ms

249765.84152880745

vectorization version:1.5032291412353516ms

vectorization is faster than for loop by 417.39762093576525 times!

可見,用for方法和向量化方法,計算結果是一樣,但是后者比前者快了400多倍!

因此,在計算量很大的時候,我們要盡可能想辦法對數據進行Vectorizing,即“向量化”,以便讓計算機進行矩陣運算。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • for
    for
    +關注

    關注

    0

    文章

    44

    瀏覽量

    15797
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84461
  • 深度學習
    +關注

    關注

    73

    文章

    5493

    瀏覽量

    120983

原文標題:消滅 for 循環!Python 的矩陣傳播機制和矩陣運算

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【每天學點AI】前向傳播、損失函數、反向傳播

    在深度學習的領域中,前向傳播、反向傳播和損失函數是構建和訓練神經網絡模型的三個核心概念。今天,小編將通過一個簡單的實例,解釋這三個概念,并展示它們的作用。前向傳播:神經網絡的“思考”過程前向
    的頭像 發表于 11-15 10:32 ?483次閱讀
    【每天學點AI】前向<b class='flag-5'>傳播</b>、損失函數、反向<b class='flag-5'>傳播</b>

    MATLAB中的矩陣索引

    矩陣進行索引是從矩陣中選擇或修改部分元素的一種方式。MATLAB 有幾種索引樣式,它們不僅功能強大、靈活,而且可讀性強、表現力強。矩陣是 MATLAB 用來組織和分析數據的一個核心組件,索引是以可理解的方式有效操作
    的頭像 發表于 09-05 09:28 ?388次閱讀
    MATLAB中的<b class='flag-5'>矩陣</b>索引

    BP神經網絡的學習機制

    BP神經網絡(Backpropagation Neural Network),即反向傳播神經網絡,是一種基于梯度下降算法的多層前饋神經網絡,其學習機制的核心在于通過反向傳播算法
    的頭像 發表于 07-10 15:49 ?459次閱讀

    神經網絡前向傳播和反向傳播區別

    神經網絡是一種強大的機器學習模型,廣泛應用于各種領域,如圖像識別、語音識別、自然語言處理等。神經網絡的核心是前向傳播和反向傳播算法。本文將詳細介紹神經網絡的前向傳播和反向傳播的區別,以
    的頭像 發表于 07-02 14:18 ?669次閱讀

    光學雨量計雨量傳感器的原理與工作機制

    來計算雨量。 光學雨量計雨量傳感器的原理與工作機制 光學雨量計的核心部分是一個發射器和一個接收器。發射器發射一束光束,該光束在空中傳播。當光束遇到空氣中的雨滴時,部分光線會被雨滴散射,并沿不同的方向傳播。 接收
    的頭像 發表于 04-26 13:55 ?620次閱讀
    光學雨量計雨量傳感器的原理與工作<b class='flag-5'>機制</b>

    頻率對地波傳播的影響

    地波無線電信號傳播非常適合白天在這些頻率上進行相對較短距離的傳播。由于電離層中的D區引起這些頻率上的信號衰減,因此白天不可能進行天波電離層傳播
    的頭像 發表于 02-09 02:34 ?1115次閱讀
    頻率對地波<b class='flag-5'>傳播</b>的影響

    矩陣led掃描頻率怎么調

    矩陣LED掃描頻率是指LED矩陣在單位時間內刷新顯示的次數。LED矩陣是由多個發光二極管(LED)組成的顯示設備,通過掃描控制來實現各個LED的亮滅,從而顯示出不同的圖像或信息。調整矩陣
    的頭像 發表于 01-02 17:30 ?1220次閱讀

    python環境變量的配置pip

    開始,然后討論如何找到Python的安裝路徑以及如何配置環境變量。接下來,我們將詳細講解pip的用途和安裝方法,并解決一些與pip相關的常見問題。 一、環境變量的概念 環境變量是操作系統提供的一種機制,用于存儲和傳遞一些全局的配置信息。每個進程都
    的頭像 發表于 12-15 15:41 ?2361次閱讀

    混合矩陣是干什么用的?高清混合矩陣怎么使用?

    混合矩陣是干什么用的?高清混合矩陣怎么使用? 混合矩陣(confusion matrix),也被稱為錯誤矩陣(error matrix),是用來評估分類模型性能的一種工具。它可以對分類
    的頭像 發表于 12-04 14:40 ?1017次閱讀

    python運行環境的安裝和配置

    Python是一種非常流行的編程語言,廣泛應用于科學計算、Web開發、人工智能等領域。為了能夠正常運行Python程序,我們需要先安裝和配置Python運行環境。本文將為您詳盡介紹Python
    的頭像 發表于 11-29 16:17 ?1104次閱讀

    python軟件對電腦配置要求

    Python是一種流行的編程語言,它在許多不同的領域中被廣泛使用,例如網站開發、數據科學和機器學習等。對于使用Python的開發者來說,了解Python軟件的電腦配置要求是非常重要的。本文將詳細介紹
    的頭像 發表于 11-29 14:58 ?9794次閱讀

    查看python安裝路徑的方法

    Python是一種高級編程語言,常用于開發Web應用、數據分析、人工智能等領域。在使用Python進行開發之前,我們需要先安裝Python解釋器,并了解Python解釋器的安裝路徑。本
    的頭像 發表于 11-29 14:54 ?1.1w次閱讀

    python shell怎么用

    Python Shell是一種交互式解釋器,可以通過命令行直接運行Python代碼。在Shell中,可以輸入一行代碼并立即得到結果,非常適合于測試、嘗試新代碼或進行簡單的任務。本文將詳細介紹
    的頭像 發表于 11-29 14:36 ?1107次閱讀

    python第三方庫有哪些

    Python) NumPy 是 Python 中最重要且最常用的科學計算庫之一。它提供了支持大型、多維數組和矩陣運算的高性能數學函數和計算工具。NumPy 的使用極為廣泛,尤其在數據處理、數值計算
    的頭像 發表于 11-29 14:31 ?2096次閱讀

    python軟件怎么運行代碼

    Python是一種高級編程語言,它被廣泛用于開發各種類型的應用程序,從簡單的腳本到復雜的網絡應用和機器學習模型。要運行Python代碼,您需要一個Python解釋器,它可以將您的代碼翻譯成計算機可以
    的頭像 發表于 11-28 16:02 ?862次閱讀