PyTorch 張量尺寸為 1 時,步長為何不具語意?

當張量中某個維度的尺寸為 1 時,步長實際上可以是任意值。

我們直接用程式碼來驗證。首先中規中矩地使用 torch.arange 建立一個一維張量 x:

python 复制代码
x = torch.arange(10)
x.shape
x.stride()

輸出:

复制代码
torch.Size([10])
(1,)

接著使用 slice 語法,把步長拉大到 100,再取第一個元素:

python 复制代码
y = x[::100][:1]
y
y.shape
y.stride()

輸出:

复制代码
tensor([0])
torch.Size([1])
(100,)

這裡的關鍵是:

  • x[::100] 先把步長變成 100
  • 再取 [:1],把尺寸變成 1
  • 因此最後得到的是尺寸為 1、但步長為 100 的張量

也就是說:只要先用 ::k 拉大步長,再把結果切成單一元素,就能得到尺寸為 1、但步長為 k 的 view。


剛剛的例子是從 x 的第 0 個元素開始取的。我們也可以透過 slice 的 start 參數,讓 view 從別的位置開始:

python 复制代码
y = x[3::100][:1]
y
y.shape
y.stride()

輸出:

复制代码
tensor([3])
torch.Size([1])
(100,)

跟剛剛的例子一樣,尺寸皆為 1,但步長皆為 100。但是張量中唯一一個元素的值變成了 3,而不是原本的 0。

我們可以用 storage_offset 函數來查看張量在底層記憶體中的 offset:

python 复制代码
y.storage_offset()

輸出:

复制代码
3

可以看到,view 張量在底層記憶體中的offset隨著 slice 的起始點改變了。


我們可以把它總結成一般公式:

python 复制代码
x = torch.arange(N)
y = x[offset::k][:1]

以後如果要製造一個「尺寸為 1、但步長和起始位置皆任意」的 view,就可以套用這個公式:

  • offset 控制 storage_offset
  • k 設定步長
  • [:1] 只取第0個元素,使尺寸變為 1

以上程式驗證了本文一開始的說法:當某個維度的尺寸為 1 時,其步長可以是任意值。

相关推荐
小oo呆1 小时前
【学习心得】Python多线程
python
happylifetree5 小时前
Python70:核心语法-函数进阶-案例2
python
irislinAmelia5 小时前
缺陷检测AI关键点在哪
人工智能·嵌入式硬件·1024程序员节
Ai-_Man5 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
安托智造5 小时前
MBD:从二维图纸到三维模型的制造革命(下)
大数据·人工智能·制造·mbd
火山引擎开发者社区5 小时前
VeOps 深度调查:让 AI 排障从“能用”走向“可靠”
人工智能
梓豪csd5 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
王中阳Go5 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳5 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
武天旭5 小时前
AI安全--AI大模型的隐私保护与法律法规
人工智能·安全