Deep Learning Preliminary knowledge(1):Data Operation

Deep Learning Preliminary knowledge(1):Data Operation

StarHui Lv3

什么是深度学习

深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。 深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据

下面是李沐老师给出的AI地图。

x轴表示的是人工智能领域中的三个主流方法:符号学、概率模型和机器学习。
y轴表示的是人工智能的四个核心任务:感知、推理、知识和规划。 * 感知指的是从外部环境中获取并处理信息,比如图像识别、语音识别等任务; * 推理指的是通过逻辑推论和演绎等方式,从已有知识中得出新的结论或判断,如证明定理、诊断疾病等任务; * 知识指的是人工智能系统对实际世界的认知和理解,包括知识表示、知识库和专家系统等技术 * 规划指的是根据目标和限制条件,设计出适合实现目标的行动路径或策略,比如路径规划和控制系统设计等任务。

配置环境

暂时先略过,没有GPU服务器,后面有的时候再捣鼓。想搞的可以看一下李沐老师的视频。
配置环境 我使用的是Google的colab,需要科学上网,登录Google账号, 直达colab

数据操作

数据概念

N维数组(张量)是机器学习和神经网络的主要数据结构。 * 0-d(标量):0维数组,一个数字,表示一个类别 * 1-d(向量):1维数组,如[1.0,2.7,3.4] ,把一些样本抽象成一行数字,表示一个特征向量 * 2-d(矩阵):2维数组,有行有列,每一行表示每一个样本,每一列表示不同的特征,表示一个样本的特征矩阵 * 3-d:比如rgb图片 * 4-d:n个三维数组放在一起,比如n个图片放在一起。

访问元素

和py里面访问元素一样,下标从0开始。以二维数组(矩阵)为例 访问单个元素:[x,y],第 x + 1行、第 y + 1个元素。 访问某一行:[x,:] 第 x + 1行所有元素。 访问某一列:[:,y],第y + 1列所有元素 访问子区域: [x1:x2,y1:y2],开区间,表示x1~x2 - 1 行的 y1 ~ y2 - 1列的所有元素。

还可以跳着访问,隔几行或者隔几列进行访问。[x1:x2:n,y1:y2:m]表示 x1 ~ x2 -1行隔n行、y1~y2 -1隔 m列的元素。

实现

可以使用arange创建一个行向量,默认从0开始的前 n 个整数,也可以指定创建类型为浮点型。张量里面的每一个值都叫张量的元素。

1
2
3
4
5
import torch

x = torch.arange(12)

x

可以通过张量的 shape 属性来访问张量的形状

1
x.shape

如果只想知道张量中元素的总数,可以检查它的大小

1
x.numel()

如果想改变张量的形状而不改变元素数量和元素值,可以调用reshape函数

1
2
3
4
x.reshape(3,4) #3行4列,一般可以省略一个,会自动计算出来
x.reshape(3,-1)
x.reshape(-1,4)

有时,我们希望使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。

1
torch.zeros((2,3,4)) #三维

1
torch.ones((2, 3, 4))

1
torch.rand((2, 3, 4))

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

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

运算符

对于任意具有相同形状的张量, 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。

1
2
3
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 # **运算符是求幂运算

也可以进行求幂这样的一元运算符。

1
torch.exp(x)

除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法,后面再说!!! 我们也可以把多个张量连结(concatenate)在一起, 把它们端对端地叠起来形成一个更大的张量。

1
2
3
X = torch.arange(12, dtype=torch.float32).reshape((3,4)) #生成0~11的浮点数,3行4列
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) #指定的3行4列元素
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1) #(x,y)为input,dim为选择的扩围,必须在0~len(input[0])之间。在这里,0是第一个维度,也就是行,1是第二个维度,也就是列

还可以通过 == 运算符来构建二元张量。当两个对应元素相等时,为true;反之为false

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

广播机制

前面是对形状相同的张量进行计算,下面看看形状不同的张量是否可以进行计算。首先来了解一下广播的概念。 广播:对不同形状的张量进行数学运算。 看来咱们可以通过广播的方式来对形状不同的张量进行计算,但是需要满足下面的条件。 * 每个张量至少有一个维度。 * 迭代维度尺寸时,从尾部的维度开始,维度尺寸。 或者相等;​ 或者其中一个张量的维度尺寸为 1 ;​ 或者其中一个张量不存在这个维度。 而广播后的结果为:当维度不同时,在维数较少的张量上添加尺寸为1的维度(复制其他维度的)。结果维度尺寸是x、y相应维度尺寸的较大者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 变成了 [[0,0],[1,1],[2,2]],b变成了 [[0,1],[0,1],[0,1]],这样才得出了结果。

节省内存

当有特别太的矩阵的时候,需要考虑节省内存的事情。但是运行一些操作会导致为新结果分配内存,所以咱们选择执行原地操作。 我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] =

1
2
3
4
5
6
7
8
9
10
import torch

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]])

#当前值还需要用到的时候,拷贝一下再进行原地操作
Z = torch.zeros_like(Y) #拷贝一下
print('id(Z):', id(Z)) #py通过id函数可以找到地址
Z[:] = X + Y
print('id(Z):', id(Z))

如果某些值后面不会用到,直接对该值进行操作即可

1
2
3
4
5
6
7
8
import torch

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]])

before = id(X)
X += Y // x[:] = x + y
id(X) == before #看看是否相等

转化为其他py对象

torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。

1
2
3
4
5
6
7
import torch

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

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

要将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。

1
2
3
4
import torch

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)
参考链接:数据操作

  • Title: Deep Learning Preliminary knowledge(1):Data Operation
  • Author: StarHui
  • Created at : 2023-06-12 21:58:40
  • Updated at : 2023-11-05 22:16:09
  • Link: https://renyuhui0415.github.io/post/data_operation.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments