马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
PyTorch 中的 repeat 和 expand 方法都用于调解张量的形状或重复张量,但它们在实现方式和内存使用上有明显的区别。以下是详细对比:
1. repeat 方法
- 功能:通过现实复制数据来重复张量的内容。
- 内存:会分配新的内存存储重复后的张量,导致数据真正被复制,可能增加内存消耗。
- 适用场景:须要创建一个新的张量并包含现实重复的数据。
示例
- import torch
- x = torch.tensor([1, 2, 3])
- y = x.repeat(2, 3) # 沿第 0 维重复 2 次,沿第 1 维重复 3 次
- print(y)
- # 输出:
- # tensor([[1, 2, 3, 1, 2, 3, 1, 2, 3],
- # [1, 2, 3, 1, 2, 3, 1, 2, 3]])
复制代码
- 原始张量 x 的数据被现实复制。
- 内存使用增大,重复后的数据存储在一个新的张量中。
2. expand 方法
- 功能:通过调解视图的方式广播张量,而不复制数据。
- 内存:不会分配新的内存,数据不会真正被复制,只是修改了张量的形状以满意广播需求。
- 适用场景:当须要重复张量但不须要现实数据复制时(如用于广播计算)。
示例
- x = torch.tensor([[1, 2, 3]])
- y = x.expand(2, 3) # 将 x 的形状广播为 (2, 3)
- print(y)
- # 输出:
- # tensor([[1, 2, 3],
- # [1, 2, 3]])
复制代码
- x 的数据并没有被现实复制,y 共享 x 的内存。
- 对 y 的修改会反映到原始数据上(假如 x 是可变的)。
主要区别对比
特性repeatexpand数据复制是,数据会被现实复制否,仅调解张量视图内存使用高,因数据复制导致内存占用增加低,内存险些不变广播支持不直接支持广播专为广播设计返回值一个新的张量,数据被复制一个新的视图,数据未复制适用场景须要真正的数据复制时只须要形状调解或用于广播计算时 注意事项
- 性能和内存:
- 假如只须要调解形状(如举行广播计算),应优先使用 expand,制止不须要的内存开销。
- 假如须要独立的数据副本,应使用 repeat。
- 形状要求:
- expand 方法要求被扩展的维度对应的大小为 1,才能举行广播。假如张量的维度大小不是 1,则会报错。
- repeat 不要求维度大小为 1,可以重复任何形状的张量。
示例:expand 报错的情况
- x = torch.tensor([[1, 2, 3]])
- y = x.expand(2, 4) # 错误,因为 x 的形状不能直接广播为 (2, 4)
复制代码 示例:repeat 的灵活性
- x = torch.tensor([[1, 2, 3]])
- y = x.repeat(2, 4) # 正确,无论原始形状如何都能重复
- print(y.shape) # 输出: torch.Size([2, 12])
复制代码 总结
- repeat:适用于须要现实复制数据以天生新张量的场景。
- expand:适用于须要广播形状但不须要现实数据复制的场景,更高效且节省内存。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |