pytorch api文档:torch.ones_like()复用已有张量的形状、数据类型、设备等属性来创建全1张量

介绍

torch.ones_like() 函数,它是 torch.ones() 的“配套函数”,核心优势是能直接复用已有张量的形状、数据类型、设备等属性来创建全1张量

语法

以一个已有张量为参照,创建一个和它形状、数据类型、设备完全相同,且所有元素为 1 的新张量

torch.ones_like(input, dtype=None, device=None, requires_grad=False, memory_format=torch.preserve_format)

参数

参数 作用
input 必选参数,参照张量(新张量会复用它的形状、默认 dtype/device)
dtype 可选,覆盖参照张量的数据类型(如指定 torch.int64 替代原 float32)
device 可选,覆盖参照张量的存储设备(如从 cpu 改为 cuda:0)
requires_grad 可选,布尔值,是否需要计算梯度,默认 False
memory_format 可选,内存布局格式,默认 torch.preserve_format(保留原张量布局)

例子

import torch

# 第一步:创建一个参照张量(模拟实际场景中已有的张量)
# 形状:2行3列,数据类型:float32,设备:cpu,带梯度
x = torch.tensor([[1.2, 3.4, 5.6], [7.8, 9.0, 2.3]], 
                 dtype=torch.float32, 
                 device="cpu", 
                 requires_grad=True)
print("参照张量 x:")
print(x)
# 输出:
# tensor([[1.2000, 3.4000, 5.6000],
#         [7.8000, 9.0000, 2.3000]], requires_grad=True)

# 示例1:基础用法(完全复用x的所有属性)
y1 = torch.ones_like(x)
print("\n示例1 - 完全复用x属性的全1张量 y1:")
print(y1)
# 输出:
# tensor([[1., 1., 1.],
#         [1., 1., 1.]], requires_grad=True)
print("y1的形状:", y1.shape)  # 输出:torch.Size([2, 3])(和x一致)
print("y1的数据类型:", y1.dtype)  # 输出:torch.float32(和x一致)

# 示例2:覆盖数据类型(复用形状/设备,修改dtype)
y2 = torch.ones_like(x, dtype=torch.int64)
print("\n示例2 - 覆盖dtype的全1张量 y2:")
print(y2)
# 输出:
# tensor([[1, 1, 1],
#         [1, 1, 1]])
print("y2的数据类型:", y2.dtype)  # 输出:torch.int64(覆盖后)

# 示例3:覆盖设备(需确保有GPU,否则会报错)
# 若有GPU,可执行:y3 = torch.ones_like(x, device="cuda:0")
# 示例用cpu演示,仅展示用法:
y3 = torch.ones_like(x, device="cpu", requires_grad=False)
print("\n示例3 - 关闭梯度的全1张量 y3:")
print(y3)
# 输出:tensor([[1., 1., 1.], [1., 1., 1.]])(无requires_grad=True)

与 torch.ones() 比较

使用 torch.ones_like() 有以下优点:

  • 简化代码:不用手动写 torch.ones(x.shape, dtype=x.dtype, device=x.device),一行 torch.ones_like(x) 就能搞定;

  • 避免错误:尤其是在深度学习中,张量可能在 GPU 上、数据类型复杂,手动指定容易出错,复用已有张量属性更安全;

  • 适配动态形状:如果参照张量的形状是动态变化的(比如批量训练时的不同 batch_size),ones_like 能自动适配,无需修改代码。

注意

  • 如果只指定 dtype 或 device,未指定的属性仍会复用参照张量的;
  • 若参照张量是稀疏张量(torch.sparse),ones_like 会创建同结构的稀疏全1张量;
  • 和 torch.ones() 一样,ones_like 创建的张量默认是浮点型,除非显式指定 dtype 或参照张量本身是整型。

总结

  1. torch.ones_like(input) 核心是复用参照张量的属性创建全1张量,比 torch.ones() 更适配“基于已有张量创建全1张量”的场景;
  2. 可通过 dtype/device/requires_grad 灵活覆盖部分属性,不指定则完全复用;
  3. 优势是简化代码、避免手动指定形状/类型/设备的错误,尤其适合深度学习中动态张量的场景。

原文出处:/show_1GW2crxBuP4N.html