先拆 batch:输入与标签必须切同一段
🎯 先猜一猜
batch_size=8、accum_steps=4,循环正在处理 idx=3。
这一轮 xb 应该取哪一段?
先补的知识
- 张量的第 0 维是 batch 维。Notebook 中 x.shape=[8,4]、y.shape=[8,2],同一行的 x 和 y 属于同一条样本。
- accum_steps 表示把完整 batch 分成几段;micro_size=x.size(0)//accum_steps 表示每段有几条样本。
- Python 切片 start:stop 包含 start、不包含 stop。普通切片会保留原张量的 dtype 和 device。
- Notebook 已先检查 batch size 能被 accum_steps 整除,因此本题不需要处理最后一段大小不同的情况。
图解原理
把 8 份练习按顺序分成 4 叠,每叠 2 份。第 idx 轮只取第 idx 叠,而且题目 x 与答案 y 必须使用相同起止下标;否则模型会拿一条样本的输入去拟合另一条样本的目标。
| 对象 | 完整 shape | idx=2 的切片 | 切片后 shape |
|---|---|---|---|
x → xb | [8,4] | x[4:6] | [2,4] |
y → yb | [8,2] | y[4:6] | [2,2] |
正确:沿样本维切
tensor[start:stop] 省略了其余维度,等价于沿第 0 维取行。
错误:沿特征维切
x[:, start:stop] 会改变每条样本的特征数,第一层 Linear 的输入维度会对不上。
语法热身:把 12 位读者分成 3 个阅读小组
pages = torch.randn(12, 5)
ratings = torch.randn(12, 1)
group_count = 3
group_size = pages.size(0) // group_count
for group_idx in range(group_count):
start = group_idx * group_size
stop = (group_idx + 1) * group_size
page_group = pages[start:stop]
rating_group = ratings[start:stop]
print(page_group.shape, rating_group.shape)把独立例子迁移回 Notebook
pages / ratings对应x / y;两者必须共享同一个start:stop。group_count / group_idx对应accum_steps / idx。group_size对应 Notebook 已经算好的micro_size。page_group / rating_group对应当前循环的xb / yb。
巩固一下
四轮切片 [0:2]、[2:4]、[4:6]、[6:8] 共同满足什么条件?
学完这一段,试着做
用一个小动作确认自己理解了;最后再进入官方题目。