深度学习PyTorch笔记(4):Tensor的其它操作


这是《动手学深度学习》(PyTorch版)(Dive-into-DL-PyTorch)的学习笔记,里面有一些代码是我自己拓展的。

其他笔记在专栏 深度学习 中。

1.2.3 改变形状

用view()或者reshape()来改变Tensor的形状:

x = torch.tensor([[0,2,4], [1,3,5]])
print(x, x.size())

a = x.view(6)
print(a, a.size())

b = x.view(1, 6)  #注意这就是两个维度了
print(b, b.size())

c = x.view(6, 1)
print(c, c.size())

d = x.reshape(3, 2)
print(d, d.size())

d = x.view(3, -1)
print(d, d.size())
tensor([[0, 2, 4],
        [1, 3, 5]]) torch.Size([2, 3])
tensor([0, 2, 4, 1, 3, 5]) torch.Size([6])
tensor([[0, 2, 4, 1, 3, 5]]) torch.Size([1, 6])
tensor([[0],
        [2],
        [4],
        [1],
        [3],
        [5]]) torch.Size([6, 1])
tensor([[0, 2],
        [4, 1],
        [3, 5]]) torch.Size([3, 2])
tensor([[0, 2],
        [4, 1],
        [3, 5]]) torch.Size([3, 2])

张量在给出其他部分后可以自动计算出一个维度。比如d = x.view(3, 2)就可以用d = x.view(3, -1)代替,结果一样。

view仅仅是改变了对这个张量的观察角度,内部数据并未改变。
即,x改变时,后面的abcd的数据都会随之改变。
如果希望不共享data内存,可以先用clone创造一个副本然后再使用view:

x_cp = x.clone().view(6)
print(x, x_cp)
x -= 1
print(x, x_cp)
tensor([[0, 2, 4],
        [1, 3, 5]]) tensor([0, 2, 4, 1, 3, 5])
tensor([[-1,  1,  3],
        [ 0,  2,  4]]) tensor([0, 2, 4, 1, 3, 5])

从结果可以看出:x减少了1,但是x_cp并没有变。
另外一个常用的函数就是item(), 它可以将一个标量Tensor转换成一个Python number:

x = torch.tensor([1.2345678])
print(x)
print(x.item())
tensor([1.2346])
1.2345677614212036

1.2.4 一些简单的矩阵操作

x = torch.tensor([[0,2,4,5], [1,3,5,2], [7,8,9,6]])
print(x)
print(x.trace())  #矩阵的迹(对角线之和)
print(x.diag())  #对角线元素
print(x.triu())  #上三角
print(x.tril())  #下三角
print(x.t())  #转置
tensor([[0, 2, 4, 5],
        [1, 3, 5, 2],
        [7, 8, 9, 6]])
tensor(12)
tensor([0, 3, 9])
tensor([[0, 2, 4, 5],
        [0, 3, 5, 2],
        [0, 0, 9, 6]])
tensor([[0, 0, 0, 0],
        [1, 3, 0, 0],
        [7, 8, 9, 0]])
tensor([[0, 1, 7],
        [2, 3, 8],
        [4, 5, 9],
        [5, 2, 6]])

1.2.5 把多个张量连结(concatenate)在一起

x = torch.arange(12).view((3, 4))
print(x)
y = torch.tensor([[2,1,4,3], [1,2,3,4], [5,6,7,8]])
print(y)

print(torch.cat((x, y), dim=0))  #按行连结
print(torch.cat((x, y), dim=1))  #按列连结
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([[2, 1, 4, 3],
        [1, 2, 3, 4],
        [5, 6, 7, 8]])
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [ 2,  1,  4,  3],
        [ 1,  2,  3,  4],
        [ 5,  6,  7,  8]])
tensor([[ 0,  1,  2,  3,  2,  1,  4,  3],
        [ 4,  5,  6,  7,  1,  2,  3,  4],
        [ 8,  9, 10, 11,  5,  6,  7,  8]])

1.2.6 通过逻辑运算符构建二维张量

print(x == y)
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])

1.2.7 求和

对张量中的所有元素进行求和会产生一个只有一个元素的张量。

print(x.sum())
tensor(66)