动手学深度学习-数据操作

93 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

数据操作

N维数组样例

图片.png

图片.png

0维

0维标量

图片.png

1维

1维向量

图片.png

2维

2维特征矩阵

图片.png

3维

3维 RGB

图片.png

4维

4维 一批RGB

图片.png

5维

5维 视频

图片.png

创建数组

图片.png

访问元素

图片.png

数据操作实现

首先,我们导入torch。请注意,虽然它被称为PyTorch,但我们应该导入torch而不是pytorch

import torch

张量表示的是一个数值组成的数组,这个数组可能有多个维度。

x = torch.arange(12)
x
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

我们可以通过张量的shape属性来范围更张量的形状张量中元素的总数

x.shape
torch.Size([12])
x.numel()
12

要改变一个张量的形状而不改变元素数量和元素值,我们可以带哦用reshape函数。

X = x.reshape(3, 4)
X
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

使用全0、全1、其他常量或者从特定分布中随机采样的数字。

2维3行4列

torch.zeros((2, 3, 4))
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])
torch.ones((2, 3, 4))
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])

通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值。

ts = torch.tensor([[[2,2],[3,3]],[[4,4],[5,5]]])
ts.shape
torch.Size([2, 2, 2])

常见的标准算数运算符(+,-,*,/**)都可以被升级为按元素运算。

x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x+y,x-y,x*y,x/y,x**y
(tensor([ 3.,  4.,  6., 10.]),
 tensor([-1.,  0.,  2.,  6.]),
 tensor([ 2.,  4.,  8., 16.]),
 tensor([0.5000, 1.0000, 2.0000, 4.0000]),
 tensor([ 1.,  4., 16., 64.]))

我们也可以多个张量连结在一起。

dim=0 在0维合并,追加行在后面 dim=1 在1维合并,追加列在后面

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,torch.cat((X,Y), dim=0),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.],
         [4., 3., 2., 1.]]),
 tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [ 2.,  1.,  4.,  3.],
         [ 1.,  2.,  3.,  4.],
         [ 4.,  3.,  2.,  1.]]),
 tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
         [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
         [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))
X == Y
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])

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

X.sum()
tensor(66.)

即使形状不同,我们仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作。

3x1 矩阵 1x2 矩阵

-》 3x2 矩阵 (复制)

a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a,b
(tensor([[0],
         [1],
         [2]]),
 tensor([[0, 1]]))
a + b
tensor([[0, 1],
        [1, 2],
        [2, 3]])

如何广播

a = torch.tensor([[0,0],[1,1],[2,2]])
b = torch.tensor([[0,1],[0,1],[0,1]])

a,b
(tensor([[0, 0],
         [1, 1],
         [2, 2]]),
 tensor([[0, 1],
         [0, 1],
         [0, 1]]))
a+b
tensor([[0, 1],
        [1, 2],
        [2, 3]])

元素访问

X,X[-1],X[1,3]
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]]),
 tensor([ 8.,  9., 10., 11.]),
 tensor(7.))
X[1,2] = 9
X
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  9.,  7.],
        [ 8.,  9., 10., 11.]])
X[0:2,:] = 12
X
tensor([[12., 12., 12., 12.],
        [12., 12., 12., 12.],
        [ 8.,  9., 10., 11.]])

转换为NumPy张量

A = X.numpy()
B = torch.tensor(A)
type(A),type(B)
(numpy.ndarray, torch.Tensor)

将大小为1的张量转换为Python标量

a = torch.tensor([3.5])
a,a.item(),float(a),int(a)
(tensor([3.5000]), 3.5, 3.5, 3)