深度学习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)
评论(0)
您还未登录,请登录后发表或查看评论