關(guān)于維度的預(yù)備知識(shí)
在Tensor張量中,共有三維數(shù)據(jù)進(jìn)行順序存放,分別是Channels(維度),Rows(行高), Cols(行寬),三維矩陣我們可以看作多個(gè)連續(xù)的二維矩陣組成,最簡(jiǎn)單的方法就是使用嵌套的vector數(shù)組,但是這種方法非常不利于數(shù)據(jù)的訪問(尤其是內(nèi)存不連續(xù)的問題)修改以及查詢,特別是在擴(kuò)容的時(shí)候非常不方便,能滿足使用需求。
因此,綜合考慮靈活性和開發(fā)的難易度,我們會(huì)以Armadillo類中的arma::mat(矩陣 matrix)類和arma::cube作為數(shù)據(jù)管理(三維矩陣)類來實(shí)現(xiàn)Tensor 我們庫(kù)中類的主體,一個(gè)cube由多個(gè)matrix組成,cube又是Tensor類中的數(shù)據(jù)實(shí)際管理者。
首先我們講講Tensor類和Armadillo中兩個(gè)類的關(guān)系,可以從下方圖看出Tensor類中的數(shù)據(jù)均由arma::cube類進(jìn)行管理擴(kuò)充,我們?cè)O(shè)計(jì)的類以arma::cube為基礎(chǔ)實(shí)現(xiàn)了Tensor類,我們主要是提供了更方便的訪問方式和對(duì)外接口。
arma::cube是一個(gè)三維矩陣,分別是通道維度(slices或者channels),行維度(rows)和列維度(cols),請(qǐng)看下圖1, 圖中是兩個(gè)5行3列的矩陣,藍(lán)色的區(qū)域是數(shù)據(jù)的實(shí)際存儲(chǔ)區(qū),灰色和和白色部分僅用作示意,在內(nèi)存中實(shí)際不存在。
一個(gè)cube類由多個(gè)這樣的Matrix組成,圖1中表示的情況是arma::cube(2, 5, 3), 表示當(dāng)前的三維矩陣共有2個(gè)矩陣構(gòu)成,每個(gè)矩陣都是5行3列的。如果放在我們項(xiàng)目中會(huì)以這形式提供 Tensor tensor(2, 5, 3).
下圖2是這種情況下的三維結(jié)構(gòu)圖,可以看出一個(gè)Cube一共有兩個(gè)Matrix,也就是共有兩個(gè)Channel. 一個(gè)Channel放一個(gè)Matrix. Matrix的行寬均為Rows和Cols.
Tensor方法總覽
我們從上面可以知道,我們的Tensor類是對(duì)armdillo庫(kù)中cube類的封裝,cube是多個(gè)Matrix的集合(二維矩陣的集合),關(guān)系圖如上圖1、圖2. 我們?cè)谶@里對(duì)KuiperInfer中Tensor類的方法進(jìn)行一個(gè)總覽,其中我們會(huì)讓大家親自動(dòng)手實(shí)現(xiàn)兩個(gè)方法(加粗的兩個(gè)),只有動(dòng)手起來才能參與其中。
類名 | 功能 |
---|---|
rows() | 返回Tensor的行數(shù) |
cols() | 返回Tensor的列數(shù) |
Fill(float value) | 填充Cube中的數(shù)據(jù),以value值填充 |
「Padding(std::vector |
調(diào)整Matrix的維度,讓Rows和Cols變大一點(diǎn):) |
at(uint32_t channel, row, col) | 返回Cube中第channel維,第row行,第col列的數(shù)據(jù)。 |
index(uint32_t offset) | 以另外一種方法來返回?cái)?shù)據(jù),返回Cube中第offset個(gè)數(shù)據(jù),比如說在row行,col列,c維的一個(gè)數(shù)據(jù),除了可以用tensor.at(c, row, col)方法訪問。我們也可以通過tensor.index(c × Rows × Cols + row × Cols + col)這種方式來訪問。可以參考圖4, 展平后的Matrix, at接口更適合用來存放展平后的數(shù)據(jù)。 |
「Fill(std::vector |
另外一個(gè)Fill方法, 我們需要以values中的所有數(shù)據(jù)去填充Tensor中的數(shù)據(jù)管理器cube類,注意values中數(shù)據(jù)的數(shù)量要等于Cube的行數(shù)×列數(shù)×維度 |
Flatten() | 將三維的矩陣展開鋪平為一維的。 |
Tensor類模板
Tensor共有兩個(gè)類型,一個(gè)類型是Tensor
如何創(chuàng)建一個(gè)Tensor
Tensor
如何訪問Tensor中數(shù)據(jù)(我們要大家實(shí)現(xiàn)的功能)
我們將在這個(gè)項(xiàng)目中為Tensor類定義多種訪問內(nèi)部數(shù)據(jù)的方式。首先要講的是順序訪問方式,在tensor變量中,我們可以使用tensor.at(0, 1, 2)得到tensor變量中第0通道,第1行,第2列中存放的元素。
另外一種,我們可以使用tensor.index(0)這種方法來得到tensor變量中第0個(gè)數(shù)據(jù) 。我會(huì)在作業(yè)系統(tǒng)中給予大家充分的提示,讓大家準(zhǔn)確無誤地把代碼寫出來。從下圖中可以看出,tensor.at(0,1,2)就是訪問圖中對(duì)應(yīng)位置的點(diǎn)。第1個(gè)矩陣(channel = 0)中第2行(row = 1),第3列(col=2)中的數(shù)據(jù)。
再談?wù)凾ensor類中數(shù)據(jù)的排布
我們以具體的圖片作為例子,來講講Tensor中數(shù)據(jù)管理類arma::cube的數(shù)據(jù)排布方式,Tensor類是arma::cube對(duì)外更方便的接口,所以說armadillo::cube怎么管理內(nèi)存的,Tensor類就是怎么管理內(nèi)存的,希望大家的能理解到位。
如下圖中的一個(gè)Cube,Cube的維度是2,每個(gè)維度上存放的是一個(gè)Matrix,一個(gè)Matrix中的存儲(chǔ)空間被用來存放一張圖像(lena) . 一個(gè)框內(nèi)(channel) 是一個(gè)Matrix,Matrix1存放在Cube第1維度(channel 1)上,Matrix2存放在Cube的第2維度上(channel 2). Matrix1和Matrix2的Rows和Cols均代表著圖像的高和寬,在本例中就是512和384.
如果將順序的一組數(shù)據(jù)[0,1,2,3,4,5....128]存放到一個(gè)大小為4×4的Matrix中,那么大家需要注意一個(gè)問題,我們的數(shù)據(jù)管理類Tensor(arma::cube)是列主序的,這一點(diǎn)和Opencv cv::Mat或者python numpy有一些不同。列主序在內(nèi)存中的順序如下表:
審核編輯:劉清
-
tensorflow
+關(guān)注
關(guān)注
13文章
328瀏覽量
60474
原文標(biāo)題:自制深度學(xué)習(xí)推理框架-張量類Tensor的實(shí)現(xiàn)-第二課
文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論