pytorch-tenor-细节

本文探讨了PyTorch中张量的视图(view)操作如何实现内存共享,通过实例展示了视图修改如何影响原始张量。同时,介绍了使用mask进行slice并fill时创建新对象的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: tesor.view的共享内存机制:
a = torch.rand(3, 4)
print("before a\n", a)
b = a.contiguous().view(4, 3)
print("before b\n", b)


b[:, 1].fill_(0)
print("after a\n",a)
print("after b\n",b)

输出为下面可以看到共享内存的效果

before a
 tensor([[0.0521, 0.9051, 0.5144, 0.9332],
        [0.0840, 0.0737, 0.1924, 0.4252],
        [0.9632, 0.7977, 0.4351, 0.7341]])
before b
 tensor([[0.0521, 0.9051, 0.5144],
        [0.9332, 0.0840, 0.0737],
        [0.1924, 0.4252, 0.9632],
        [0.7977, 0.4351, 0.7341]])
after a
 tensor([[0.0521, 0.0000, 0.5144, 0.9332],
        [0.0000, 0.0737, 0.1924, 0.0000],
        [0.9632, 0.7977, 0.0000, 0.7341]])
after b
 tensor([[0.0521, 0.0000, 0.5144],
        [0.9332, 0.0000, 0.0737],
        [0.1924, 0.0000, 0.9632],
        [0.7977, 0.0000, 0.7341]])

二: 如果是用mask进行slice并进行fill, 则会创建新的对象.
b = torch.rand(3, 4)
a = b.contiguous().view(4, 3)
print("a:\n", a)
print("-------after-----")

a[a>0.7].fill_(0)
print("a:\n", a)

输出结果如下

a:
 tensor([[0.6165, 0.9024, 0.3824],
        [0.5746, 0.4745, 0.6394],
        [0.0516, 0.8359, 0.6028],
        [0.2508, 0.0475, 0.8515]])
-------after-----
a:
 tensor([[0.6165, 0.9024, 0.3824],
        [0.5746, 0.4745, 0.6394],
        [0.0516, 0.8359, 0.6028],
        [0.2508, 0.0475, 0.8515]])

可以看到这中fill的方式连tensor自身都没改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值