PyTorch张量创建问题:如何直接在GPU/指定设备创建张量?new()方法弃用后的替代方案
嘿,很高兴能帮你解决这些PyTorch张量创建的问题!让我一步步给你讲清楚:
问题1:直接在GPU上创建张量,或在另一个张量所在设备创建张量
直接在GPU上创建张量:
你可以在创建张量时通过device参数直接指定GPU设备,比如:# 创建一个在默认CUDA设备上的张量 gpu_tensor = torch.tensor([1, 2, 3], device="cuda") # 或者指定具体的CUDA设备编号 gpu_tensor = torch.tensor([1, 2, 3], device="cuda:0")也可以用
torch.cuda系列的张量构造器(比如torch.cuda.FloatTensor([1,2,3])),但更推荐前者,因为它更灵活,能兼容CPU/GPU切换。在另一个张量的设备上创建新张量:
直接复用目标张量的device属性即可,不用手动判断设备类型。比如你有一个张量std,要在它的设备上创建新张量:new_tensor = torch.tensor([4, 5, 6], device=std.device)这样不管
std在CPU还是GPU,新张量都会自动在同一个设备上。
问题2:替代已弃用的
new()方法,简化设备判断代码 你提到的new()方法确实在PyTorch的新版本中被标记为弃用了,现在有更简洁、更符合现代PyTorch风格的方式来替代原来的逻辑:
替代
std.new().normal_()的最简写法:
使用torch.empty_like()方法,它会创建一个和输入张量同形状、同设备、同数据类型的空张量,之后再调用normal_()初始化,一行代码就能替代原来的if-else判断:eps = torch.empty_like(std).normal_()这段代码的效果和你原来的if-else完全一致,但不用再手动判断
std是否在CUDA上,PyTorch会自动处理设备匹配。如果需要自定义形状(非和输入张量同形状):
可以直接在张量构造器中指定device和dtype为目标张量的属性,比如要创建和std同设备、指定形状的正态分布张量:eps = torch.randn(std.size(), device=std.device, dtype=std.dtype)同样不用写if条件,就能保证新张量和
std在同一个设备上。
内容的提问来源于stack exchange,提问作者Gulzar
相关产品推荐
相关产品推荐

