nD 張量底層實現(xiàn)是使用一塊連續(xù)內(nèi)存的一維數(shù)組,由于 PyTorch 底層實現(xiàn)是 C 語言 (C/C++ 使用行優(yōu)先的存儲方式),所以 PyTorch 中的 nD 張量也按照行優(yōu)先的順序進行存儲的悲幅。
下圖為一個形狀為 ? 的 2D 張量,為了方便將其命名為 ?讹挎。
張量 ? 在內(nèi)存中實際以一維數(shù)組的形式進行存儲如筛,并且使用行優(yōu)先的順序進行存儲,其中一維數(shù)組的形式存儲比較好理解则涯,而行優(yōu)先指的就是存儲順序按照張量 ? 的行依次存儲复局。張量 ? 在內(nèi)存中的實際存儲形式如下所示。
張量 ? 通常稱為存儲的邏輯結(jié)構(gòu)粟判,而實際存儲的一維數(shù)組形式稱為存儲的物理結(jié)構(gòu)亿昏。
如果元素在存儲的邏輯結(jié)構(gòu)上相鄰,在存儲的物理結(jié)構(gòu)中也相鄰档礁,則稱為連續(xù)存儲的張量角钩;
如果元素在存儲的邏輯結(jié)構(gòu)上相鄰,但是在存儲的物理結(jié)構(gòu)中不相鄰,則稱為不連續(xù)存儲的張量递礼;
在 "改變張量形狀" 中提到過惨险,交換維度的操作能夠?qū)⑦B續(xù)存儲的張量轉(zhuǎn)變成不連續(xù)存儲的張量。在 PyTorch 中對于張量是否連續(xù)有一個等式脊髓。nD 張量辫愉,對于任意一個維度 i (? 但是 ?) 都滿足下面的等式則說明 nD 張量連續(xù),不滿足則說明 nD 張量不連續(xù)将硝。
其中 ? 表示邏輯結(jié)構(gòu)中第 ? 個維度上相鄰的元素在物理結(jié)構(gòu)中間隔的元素個數(shù)恭朗,? 表示邏輯結(jié)構(gòu)中第 ? 個維度的元素個數(shù)。
下面使用公式來判斷張量 ? 是否連續(xù)依疼?2D 張量一共有兩個維度痰腮,因此 ? 只能取 0 (因為 ?),接下來只需要判斷下面等式是否成立律罢。
其中:
? 為張量 ? (邏輯結(jié)構(gòu)) 的第 0 個維度上相鄰的元素在一維數(shù)組 (物理結(jié)構(gòu)) 中間隔的元素個數(shù)膀值。張量 ? 中第 0 個維度上相鄰的元素有
(0, 3) (1, 4) (2, 5)
,這些在張量 ? 中相鄰的元素弟翘,在一維數(shù)組中這些相鄰元素的間隔數(shù)都為 3 (計數(shù)包含本身)虫腋,即 ?;? 為張量 ? (邏輯結(jié)構(gòu)) 的第 1 個維度上相鄰的元素在一維數(shù)組 (物理結(jié)構(gòu)) 中間隔的元素個數(shù)稀余。張量 ? 中第 1 個維度上相鄰的元素有
(0, 1) (1, 2) (3, 4) (4, 5)
悦冀,這些在張量 ? 中相鄰的元素,在一維數(shù)組中這些相鄰元素的間隔數(shù)都為 1 (計數(shù)包含本身)睛琳,即 ?盒蟆;? 為張量 ? (邏輯結(jié)構(gòu)) 中第 1 個維度上的元素個數(shù),即 ?师骗;
將這些對應(yīng)的值代入等式 ? 中历等,即 ?,等式成立辟癌,則張量 ? 是連續(xù)的寒屯。
在 PyTorch 中,使用維度變換的操作能夠?qū)⑦B續(xù)存儲的張量轉(zhuǎn)變成不連續(xù)存儲的張量黍少,接下來使用等式判斷交換維度后的張量 ? 是否還是連續(xù)存儲的張量寡夹?
張量 ? 交換維度后的結(jié)果如下。
這里需要注意厂置,我們是通過張量 ? 交換維度后得到的是 ? 的 2D 張量菩掏,為了方便將其命名為 ?。在 PyTorch 中交換維度的操作并沒有改變其實際的存儲昵济,換句話說智绸,交換維度后的張量與原始張量共享同一塊內(nèi)存野揪,因此交換維度后的張量 ? 底層存儲和原始張量 ? 都是相同的一維數(shù)組。
下面來使用公式判斷張量 ? 是否連續(xù)瞧栗?2D 張量一共有兩個維度斯稳,因此 ? 只能取 0 (因為 ?),接下來只需要判斷下面等式是否成立沼溜。
其中:
? 為張量 ? (邏輯結(jié)構(gòu)) 的第 0 個維度上相鄰的元素在一維數(shù)組 (物理結(jié)構(gòu)) 中間隔的元素個數(shù)平挑。張量 ? 中第 0 個維度上相鄰的元素有
(0, 1) (1, 2) (3, 4) (4, 5)
,這些在張量 ? 中相鄰的元素系草,在一維數(shù)組中這些相鄰元素的間隔數(shù)都為 1 (計數(shù)包含本身),即 ?唆涝;? 為張量 ? (邏輯結(jié)構(gòu)) 的第 1 個維度上相鄰的元素在一維數(shù)組 (物理結(jié)構(gòu)) 中間隔的元素個數(shù)找都。張量 ? 中第 1 個維度上相鄰的元素有
(0, 3) (1, 4) (2, 5)
,這些在張量 ? 中相鄰的元素廊酣,在一維數(shù)組中這些相鄰元素的間隔數(shù)都為 3 (計數(shù)包含本身)能耻,即 ?;? 為張量 ? (邏輯結(jié)構(gòu)) 中第 1 個維度上的元素個數(shù)亡驰,即 ?晓猛;
將這些對應(yīng)的值代入公式 ? 中,即 ?凡辱,等式不成立戒职,則張量 ? 是不連續(xù)的。
由于 2D 張量比較容易理解透乾,所以這里都是以 2D 張量為例進行介紹的洪燥,2D 張量只需要滿足 1 個等式即可判斷是否連續(xù),而如果是 nD 張量乳乌,則需要判斷 ? 個等式捧韵。
原文地址:
PyTorch入門筆記-判斷張量是否連續(xù)