2.1数据操作
一、重点内容总结
1.变量的析构
这个概念是我之前比较模糊的,李沐老师在这里提到了,记录一下:
用一个例子来看
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
before = id(Y)
Y = Y + X
id(Y) == before
输出结果:
False
这个例子说明在运行一些操作的时候,可能会导致为新结构分配内存。
将Y
的地址记录在before
变量中,然后进行了将Y + X
赋值给了一个新的变量Y
的操作,虽然表面上还是Y
,但是此Y
已经非彼Y
了!Y
的地址发生了变化。
2.执行原地操作
延续上面的例子 ,我们可以这样操作执行原地操作:
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))
输出结果:
id(Z): 140040758378960
id(Z): 140040758378960
构造一个和Y同维度的Z,Z的所有元素都为0,之后进行Z[:] = X + Y
操作,相当于对Z的元素的一个改写,地址不发生变化,实现原地操作。
二、习题答案
1.运行本节中的代码。将本节中的条件语句X == Y更改为X < Y或X > Y,然后看看你可以得到什么样的张量。
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
X, Y
输出结果:
(tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]), tensor([[2., 1., 4., 3.],
[1., 2., 3., 4.],
[4., 3., 2., 1.]]))
X > Y
输出结果:
tensor([[False, False, False, False],
[ True, True, True, True],
[ True, True, True, True]])
2.用其他形状(例如三维张量)替换广播机制中按元素操作的两个张量。结果是否与预期相同?
A = torch.tensor([[[1, 2, 3], [4, 5, 6]]])
B = torch.tensor([[[10, 20, 30]], [[40, 50, 60]]])
C = A + B
A.shape,B.shape, C, C.shape
输出结果:
(torch.Size([1, 2, 3]), torch.Size([2, 1, 3]), tensor([[[11, 22, 33],
[14, 25, 36]],
[[41, 52, 63],
[44, 55, 66]]]), torch.Size([2, 2, 3]))