![Deep Learning Preliminary knowledge(1):Data Operation](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052201832.jpg)
Deep Learning Preliminary knowledge(1):Data Operation
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052032318.jpg)
什么是深度学习
深度学习(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 | import torch |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052206264.png)
可以通过张量的 shape 属性来访问张量的形状
1 | x.shape |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052207721.png)
如果只想知道张量中元素的总数,可以检查它的大小
1 | x.numel() |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052207572.png)
如果想改变张量的形状而不改变元素数量和元素值,可以调用reshape函数
1 | x.reshape(3,4) #3行4列,一般可以省略一个,会自动计算出来 |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052208313.png)
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052208231.png)
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052208788.png)
有时,我们希望使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。
1 | torch.zeros((2,3,4)) #三维 |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052209728.png)
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]]) |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052212835.png)
运算符
对于任意具有相同形状的张量, 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。
1 | x = torch.tensor([1.0, 2, 4, 8]) |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052210052.png)
也可以进行求幂这样的一元运算符。
1 | torch.exp(x) |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052212557.png)
除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法,后面再说!!! 我们也可以把多个张量连结(concatenate)在一起, 把它们端对端地叠起来形成一个更大的张量。
1 | X = torch.arange(12, dtype=torch.float32).reshape((3,4)) #生成0~11的浮点数,3行4列 |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052213681.png)
还可以通过 == 运算符来构建二元张量。当两个对应元素相等时,为true;反之为false
对张量中的所有元素进行求和,会产生一个单元素张量。
广播机制
前面是对形状相同的张量进行计算,下面看看形状不同的张量是否可以进行计算。首先来了解一下广播的概念。 广播:对不同形状的张量进行数学运算。 看来咱们可以通过广播的方式来对形状不同的张量进行计算,但是需要满足下面的条件。 * 每个张量至少有一个维度。 * 迭代维度尺寸时,从尾部的维度开始,维度尺寸。 或者相等; 或者其中一个张量的维度尺寸为 1 ; 或者其中一个张量不存在这个维度。 而广播后的结果为:当维度不同时,在维数较少的张量上添加尺寸为1的维度(复制其他维度的)。结果维度尺寸是x、y相应维度尺寸的较大者。
1 | a = torch.arange(3).reshape((3, 1)) |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052214053.png)
进行加法时,a 变成了 [[0,0],[1,1],[2,2]],b变成了 [[0,1],[0,1],[0,1]],这样才得出了结果。
节省内存
当有特别太的矩阵的时候,需要考虑节省内存的事情。但是运行一些操作会导致为新结果分配内存,所以咱们选择执行原地操作。 我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] =1
2
3
4
5
6
7
8
9
10import 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 | import torch |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052215984.png)
转化为其他py对象
torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
1 | import torch |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052215839.png)
要将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。
1 | import torch |
![](https://cdn.jsdelivr.net/gh/renyuhui0415/blogimg@main/202311052215938.png)
- 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.