expanded size (4) must match existing size (2):expand 只能扩展单例维

简介: `expand()` 仅支持广播扩展(维度需为1),不能将 `[2,3]` 直接扩为 `[4,3]`(第0维非单例)。应根据语义选 `repeat()`(块重复)或 `repeat_interleave()`(行内重复),注意 `expand` 返回共享内存视图,非独立副本。

原帖想把 [2,3] 直接 expand 成 [4,3];第 0 维已经有两个不同的行,不能作为广播单例扩展:

RuntimeError: The expanded size of the tensor (4) must match the existing size (2) at non-singleton dimension 0.  Target sizes: [4, 3].  Tensor sizes: [2, 3]

expand 表达广播,不表达任意行复制

原题第 0 维有两行不同数据,不能直接从 2 广播成 4。新增长度 1 的轴可以 expand,但随后合并轴可能需要物化。应先确定期望行顺序与是否需要独立存储,再选 repeat、repeat_interleave 或保留额外广播轴。

expand 创建共享存储的视图,不是“任意复制数据”接口。先看要扩展的维度是不是 1。

import torch
x = torch.tensor([[4., 5., 6.], [1., 2., 3.]])
print("josh050608")
print("shape/stride:", x.shape, x.stride())
y = x.repeat(2, 1)
assert y.shape == (4, 3)
print(y)

这会按整块顺序得到第一行、第二行、第一行、第二行。如果希望第一行连续出现两次,再第二行连续出现两次,应使用 x.repeat_interleave(2, dim=0),二者不是同一种排列。

原帖的 x.unsqueeze(0).expand(2,-1,-1) 可以先得到 [2,2,3] 视图,因为新增的第 0 维原本长度为 1。但随后 reshape 为 [4,3] 不保证仍然零拷贝;这种布局可能需要实际物化。

如果下游能接受额外的批次维,可以保留 expand 的三维视图;如果必须要独立的 [4,3] 数据,repeat 的分配往往正是所需行为。不要向 expand 出来的共享视图做原地写入,多个逻辑位置可能指向同一存储。

验证行排列与任务含义一致,再检查下游操作的输入布局。形状变大不等于得到独立副本,也不能把 expand 当成免费的通用数据扩容。

同时检查值、顺序和 stride

下面完整例子用原题两行数据比较三种写法,验证它们的语义:

import torch
x = torch.tensor([[4., 5., 6.], [1., 2., 3.]])
block_repeat = x.repeat(2, 1)
row_repeat = x.repeat_interleave(2, dim=0)
expanded = x.unsqueeze(0).expand(2, -1, -1)
merged = expanded.reshape(4, 3)
assert block_repeat[:, 0].tolist() == [4., 1., 4., 1.]
assert row_repeat[:, 0].tolist() == [4., 4., 1., 1.]
assert torch.equal(merged, block_repeat)
assert expanded.stride()[0] == 0
independent = expanded.clone()
independent[0, 0, 0] = 99
assert x[0, 0].item() == 4
print("expanded/merged strides:", expanded.stride(), merged.stride())

expand 的新增轴 stride 为 0,多个逻辑位置引用相同数据,因此不能把它当作独立可写副本。若下游需要修改,先明确 clone;若只做支持广播的运算,保留额外轴可以避免不必要复制。

reshape 的接口不保证零拷贝,能否成为视图由布局决定。不要用“代码里没有 repeat”证明没有额外分配,也不要只为追求零拷贝改变模型期待的样本顺序。

验收先对照输出行顺序,再检查下游批次轴含义。若重复样本用于训练,还需确认目标标签按相同顺序重复;只把特征扩到 4 行而标签仍是 2 行,会引出下一处接口错误。

参考:原始求助帖;技术依据:Tensor.expand(2.5)、Tensor.repeat(2.5)、Tensor.view(2.5)。

相关文章
|
2天前
|
缓存 Unix PyTorch
OSError: [Errno 24] Too many open files:两个 DataLoader 可以 zip,先查文件描述符
原帖双Loader并发读取ZIP导致“Too many open files”(Errno 24),实为文件描述符泄漏或生命周期管理不当,非ZIP不支持DataLoader。需排查Dataset中图像/HDF5/ZIP句柄是否及时释放,并优先采用单Loader配对Dataset保障数据一致性与资源可控性。(239字)
|
2天前
|
并行计算 PyTorch 算法框架/工具
Expected all tensors to be on the same device, cuda:0 and cpu:恢复训练时检查 SGD 动量
该问题源于断点续训时优化器状态(如SGD动量缓冲区)未与模型参数同设备,导致`optimizer.step()`中跨设备张量运算失败。前向/反向可正常执行,但动量更新报错“cuda:0 and cpu”。需检查并统一`param`、`grad`及`optimizer.state`中所有Tensor的设备。
|
2天前
|
并行计算 PyTorch Linux
libtorch_python.so: cannot open shared object file:文件缺失时先修复 torch 安装
该问题核心是 PyTorch 1.0.1.post2 安装不完整,`torch/lib/` 下缺失关键文件 `libtorch_python.so`,非环境变量(LD_LIBRARY_PATH)可解决。需先用 `importlib.util.find_spec` 定位真实安装路径,核对文件存在性;再通过 `pip show -f torch` 验证分发完整性。切勿混用版本或复制库文件。
|
2天前
|
并行计算 PyTorch Linux
RuntimeError: CUDA error: device-side assert triggered:Colab 先重启,再找首次断言
该文详解CUDA断言错误调试策略:强调先重启运行时、启用`CUDA_LAUNCH_BLOCKING=1`,用最小张量验证环境;区分“会话已坏”与新操作触发,主张逐段定位而非臆测标签越界,提供实用边界检查函数与验证流程。(239字)
|
2天前
|
并行计算 PyTorch 异构计算
can’t convert CUDA tensor to numpy:只取分类索引时直接用 torch.argmax
原帖因直接对CUDA张量调用`.data.numpy().argmax()`报错:“无法将CUDA张量转为NumPy”。正确做法是:在GPU上用`output.argmax(dim=1).item()`获取单图预测索引,避免全量拷贝,仅传回标量,高效且安全。(239字)
|
2天前
|
PyTorch 算法框架/工具 索引
ValueError: only one element tensors can be converted to Python scalars:张量列表先检查形状,再 stack
该文解析PyTorch中`list(tensor)`引发的`ValueError`根源:列表含多元素张量时,不可直接转Python标量。强调应通过`tensor.shape`或遍历打印各张量尺寸来查形状;同形张量用`torch.stack`(增维)而非`cat`或`item`;异形则保留原结构,避免强行转换。
|
2天前
|
数据可视化 PyTorch 算法框架/工具
only batches of spatial targets supported:三通道分割 one-hot 转为每像素类别编号
该报错源于PyTorch交叉熵要求标签为`[N, H, W]`(3D),但输入了`[N, 3, H, W]`(4D)掩码。需先验证三通道是否为互斥one-hot,再用`argmax(dim=1)`转为整型标签,并妥善处理全零未标注像素(设`ignore_index`),避免误判为背景类。(239字)
|
2天前
|
PyTorch 算法框架/工具 异构计算
Expected object of scalar type Float but got scalar type Double for argument #4 'mat1':NumPy 输入与 Linear 权重怎样统一类型
PyTorch中`RuntimeError: Expected Float but got Double`常因输入Tensor(float64)与模型权重(float32)类型不一致导致。关键在第一层Linear的输入与权重dtype需统一:可将数据转为float32(推荐),或模型整体升为float64。务必检查`tensor.dtype`而非数值显示,并确保`loss.backward()`前类型已对齐。(239字)
|
2天前
|
机器学习/深度学习 索引
The size of tensor a (133) must match tensor b (10):分类任务换 MSELoss 后先查标签含义
原帖网络输出133类logits,CrossEntropyLoss支持类别索引输入(如`[10]`),而MSELoss要求`outputs`与`target`形状严格匹配(如`[10,133]`)。报错因`target`为`[10]`,无法广播匹配`[10,133]`输出,本质是两类损失对标签格式约定不同。
|
2天前
|
PyTorch 算法框架/工具 索引
RuntimeError: expected scalar type Long but found Float:NLLLoss 要改 labels,不要把 images 转 long
该问题源于`NLLLoss`要求标签为`torch.long`类型(类别索引),但输入为`float`。需确保标签是整数编号(非概率/小数),并在`DataLoader`中统一配对图像与标签,避免双Loader错位;推荐改用`CrossEntropyLoss`配原始logits,或`LogSoftmax+NLLLoss`组合。(239字)

热门文章

最新文章