Python中的shape()詳解
shape()含義
在筆者debug深度學(xué)習(xí)相關(guān)代碼的時(shí)候,很容易出現(xiàn)shape()這樣形式的東西,用來告知輸出數(shù)據(jù)的形式
由于shape()里出現(xiàn)的數(shù)字?jǐn)?shù)量不同,還經(jīng)常有shape(?,64,512)這樣的數(shù)據(jù)存在
因此上網(wǎng)查了一些信息,作出比較通俗易懂的解釋:
import numpy as np a = np.array([[[1,2,3],[4,5,6]]]) print(a.shape) (1, 2, 3)
表示該數(shù)組有1個(gè),是2行3列的數(shù)組。每一個(gè)shape里的數(shù)字對(duì)應(yīng)數(shù)組中的一對(duì)中括號(hào),第一個(gè)數(shù)字1表示最外層的中括號(hào)。以此類推,數(shù)字2表示第二層中括號(hào),數(shù)字3表示最里層的中括號(hào)。如果定義array時(shí)去掉了最外層的括號(hào)那么輸出的shape為(2, 3)。
區(qū)分一維數(shù)組和二維數(shù)組
有幾個(gè)中括號(hào)就為幾維數(shù)組
因此在上文中,有三對(duì)中括號(hào),是3維數(shù)組,shape()中有3個(gè)數(shù)。
a = np.array([1,2]) #a.shape值(2,),意思是一維數(shù)組,數(shù)組中有2個(gè)元素。 b = np.array([[1],[2]]) #b.shape值是(2,1),意思是一個(gè)二維數(shù)組,每行有1個(gè)元素。 c = np.array([[1,2]]) #c.shape值是(1,2),意思是一個(gè)二維數(shù)組,每行有2個(gè)元素。
shape()中“?”的含義
而在debug相關(guān)程序時(shí),可能會(huì)出現(xiàn)shape(?,2,3)這便代表數(shù)組每一個(gè)都是2行3列的,前面這個(gè)“?”便代表批處理個(gè)數(shù)
若為1則有1個(gè),為2則有兩個(gè),但是在debug的時(shí)候不知道有幾個(gè),所以以“?”的形式顯示。
shape()中有四個(gè)數(shù),第一個(gè)數(shù)表示時(shí)間序列(批處理數(shù))
from keras.models import Input,Model from keras.layers import Dense,Conv2D,TimeDistributed input_ = Input(shape=(12,32,32,3)) out = TimeDistributed(Conv2D(filters=32,kernel_size=(3,3),padding='same'))(input_) model = Model(inputs=input_,outputs=out) model.summary()
而這里,shape()中有四個(gè)數(shù)。第一個(gè)12代表就是時(shí)間序列,32,32,3指的是高,寬,通道數(shù)。
卷積操作使用TimeDistributed就相當(dāng)與這12個(gè)時(shí)間序列共享一個(gè)卷積層參數(shù)信息
無論時(shí)間序列值為多少,參數(shù)總量還是一定的。此處一共有896個(gè)參數(shù),卷積核weights有3×3×3×32=864個(gè),卷積核bias有32個(gè)。
附TimeDistributed解釋
關(guān)于TimeDistributed有一個(gè)比較通俗的示例解釋: 考慮一批32個(gè)樣本,其中每個(gè)樣本是一個(gè)由16個(gè)維度組成的10個(gè)向量的序列。該層的批輸入形狀然后(32, 10, 16)。
可以這么理解,輸入數(shù)據(jù)是一個(gè)特征方程,X1+X2+…+X10=Y,從矩陣的角度看,拿出未知數(shù),就是10個(gè)向量,每個(gè)向量有16個(gè)維度,這16個(gè)維度是評(píng)價(jià)Y的16個(gè)特征方向。
TimeDistributed層的作用就是把Dense層應(yīng)用到這10個(gè)具體的向量上,對(duì)每一個(gè)向量進(jìn)行了一個(gè)Dense操作,假設(shè)是下面這段代碼:
model = Sequential()model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
輸出還是10個(gè)向量,但是輸出的維度由16變成了8,也就是(32,10,8)。
TimeDistributed層給予了模型一種一對(duì)多,多對(duì)多的能力,增加了模型的維度。
到此這篇關(guān)于Python中的shape()詳解的文章就介紹到這了,更多相關(guān)Python的shape()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch常用函數(shù)之torch.randn()解讀
這篇文章主要介紹了pytorch常用函數(shù)之torch.randn()解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲
大家好,本篇文章主要講的是Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Python爬蟲小練習(xí)之爬取并分析騰訊視頻m3u8格式
讀萬卷書不如行萬里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來,本篇文章手把手帶你爬下騰訊視頻的m3u8格式來分析,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10關(guān)于Python?中IndexError:list?assignment?index?out?of?rang
這篇文章主要介紹了Python?中IndexError:list?assignment?index?out?of?range?錯(cuò)誤解決,概述了兩個(gè)常見的列表函數(shù),它們可以幫助我們?cè)谔鎿Q兩個(gè)列表時(shí)幫助我們處理?Python?中的索引錯(cuò)誤,需要的朋友可以參考下2023-05-05