当前位置:   article > 正文

从零开始的深度学习_从零开始学深度学习

从零开始学深度学习

一、万里之行始于足下——环境配置

我的环境配置流程是基于李沐老师在windows下的配置流程

参考资料:

windows上配置深度学习(李沐-动手学深度学习)_动手学深度学习 windows_zhaoylai的博客-CSDN博客

【Windows 下安装 CUDA 和 Pytorch 跑深度学习 - 动手学深度学习v2-哔哩哔哩】 https://b23.tv/B3G2RYF

 二、万丈高楼平地起,学习基础要牢固

在正式学习之前先要对我们使用编程库pytorch使用有初步的了解:

PyTorch(Torch)是一个开源的深度学习框架,它最初由 Facebook AI Research 开发,现在由 PyTorch 的开发团队维护。PyTorch 旨在为机器学习和深度学习任务提供高效、灵活和便捷的实现。它的设计目标是支持各种硬件,并提供广泛的功能,包括自动微分、自动求导、硬件加速的张量计算等。

PyTorch 的主要特点包括:

  1. 灵活性:PyTorch 提供了丰富的工具和库,用于构建和训练各种深度学习模型,包括卷积神经网络(CNN)、循环神经网络(RNN)、自编码器、生成对抗网络(GAN)等。这些库和工具使得开发者可以更加灵活地选择和组合模型,以适应不同的任务和数据。
  2. 高效性:PyTorch 具有高效的内存管理机制,可以处理大规模数据集和模型。此外,它还支持分布式训练,可以充分利用多个计算节点的计算能力,提高训练效率。
  3. 跨平台:PyTorch 可以在多种操作系统(如 Linux、macOS、Windows、Android 等)上运行,并支持多种硬件平台,包括 GPU、CPU、FPGA 等。这使得它可以广泛应用于各种场景,包括桌面、移动、嵌入式系统等。
  4. 可扩展性:PyTorch 的设计目标是支持各种硬件,并提供广泛的功能和工具,以支持不同的应用场景。因此,它具有很高的可扩展性,可以根据不同的需求添加新的功能和特性。
  5. 总之,PyTorch 是一个非常优秀的深度学习框架,具有灵活性、高效性、跨平台性和可扩展性等特点,已经成为了许多机器学习和深度学习项目的首选工具。

本文使用的编译工具为Jupyter Notebook,其使用方法非常简洁易懂,可以在网上找到大量学习资料

数据操作:

导入pytorch库,注意程序为torch

 之后,我们通过arrange()函数来定义一个连续的整数数组,通过dtype可以自定义其类型为浮点数组。

 通过.shape来访问张量的大小

 通过.numel来获得元素个数

 通过reshape来重新分配大小

 值得注意的是,在指定n-1维大小后,reshape能自动分配剩余维度大小

zeros和ones可以快捷创造出全0全1矩阵

 

我们还可以通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。 在这里,最外层的列表对应于轴0,内层的列表对应于轴1。

 

张量运算与实际没有区别即:

x + y, x - y, x * y, x / y, x ** y

之后则是对于维度函数dim=0,1,2...的学习,以sum函数为例子,当dim=0时,是以z轴为向量进行加减,当dim=1时,以行为向量进行加减,当dim=2时,以列为向量进行加减,通俗来讲,就是以什么进行加减,就要消去谁,不写dim时默认等于加和成为一个标量

 广播机制: 

  1. 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;

  2. 对生成的数组执行按元素操作。实现代码如下:

接下来则是内存管理 

 id()类似与c和c++的指针操作,图中操作告诉我们Y再执行完操作后会指向一个新的地址,而这对于我们来说不一定是一件好事。

  1. 首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;

  2. 如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。

解决这个问题可以通过切片表示法将操作的结果分配给先前分配的数组

数组转换的方式如下: 

数据预处理:

下图为读取csv的方式:

 读取文件后,可利用切分来选择自己想要处理的数据集,利用fillna()可以填充缺失的数据为“Nah”

 由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。

 

线性代数:

线性代数中,需要格外注意的是矩阵乘法的部分,

 *符号对应的乘法原理如图所示,两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号⊙)。 对于矩阵B∈Rm×n, 其中第i行和第j列的元素是bij。 矩阵A(在 (2.3.2)中定义)和B的Hadamard积为:

 

 下图为点乘运算,给定两个向量x,y∈Rd, 它们的点积(dot product)x⊤y (或〈x,y〉) 是相同位置的按元素乘积的和:x⊤y=∑i=1dxiyi。最终结果为一个标量

也可以通过对元素相乘,最后来求和来得到最终结果。

 

在代码中使用张量表示矩阵-向量积,我们使用mv函数。 当我们为矩阵A和向量x调用torch.mv(A, x)时,会执行矩阵-向量积。 注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同。

我们可以将矩阵-矩阵乘法AB看作简单地执行m次矩阵-向量积,并将结果拼接在一起,形成一个n×m矩阵。 在下面的代码中,我们在AB上执行矩阵乘法。 这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。 两者相乘后,我们得到了一个5行3列的矩阵。

 L2范数:

                                           

L1范数:

                         

查阅文档:

调用dir函数。 例如,我们可以查询随机数生成模块中的所有属性: 

通常可以忽略以“__”(双下划线)开始和结束的函数,它们是Python中的特殊对象, 或以单个“_”(单下划线)开始的函数,它们通常是内部函数。 根据剩余的函数名或属性名,我们可能会猜测这个模块提供了各种生成随机数的方法, 包括从均匀分布(uniform)、正态分布(normal)和多项分布(multinomial)中采样。

通过help函数我们能获得更加详细的数据支持。

自动微分:

在实现自动微分之前,首先我们需要了解链式积分法则,在深度学习中,多元函数通常是复合(composite)的,运用一般的求微分方法很难实现对这些函数的求微操作,这时候就需要链式法则的帮助。在单变量的情况下,假设函数y=f(u)和u=g(x)都是可微的,根据链式法则:

在多变量这种更为普遍的情况下,假设可微分函数y有变量u1,u2,…,um,其中每个可微分函数ui都有变量x1,x2,…,xn。 注意,y是,x1,x2,…,xn的函数。 对于任意i=1,2,…,n,链式法则给出:

 

接下来让我们正式进入到自动求导部分:

在我们计算y关于x的梯度之前,需要一个地方来存储梯度。 重要的是,我们不会在每次对一个参数求导时都分配新的内存。 因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。requires_grad=True 的作用是让 backward 可以追踪这个参数并且计算它的梯度。

 代码定义了一个(1,2,3,4)的张量,求导函数为y=4x^{2}, 求导后应该为8x,通过backward()进行自动求导,对每一个x值进行带入计算。

这里需要注意,每次求导需要对梯度进行清零,不然会每求一次导就加和一次。

值得注意的是,backward()只能实现对标量输出的自动求导,如果对矩阵这么使用就会出现

 grad can be implicitly created only for scalar outputs的错误

我们可以通过sum()将矩阵转化为一维标量的形式进行。最后得到相应的导数

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/79164
推荐阅读
  

闽ICP备14008679号