《动手学深度学习》笔记——深度学习基础(一)
为了巩固深度学习的基础,跟着李沐老师的《动手学深度学习》进行学习,结合本人情况记录学习过程的相关内容。
目录
学习材料
参考资料:
-
《动手学深度学习》笔记——该团队整理了《动手学深度学习》详细的markdown笔记和相关的jupyter代码,还包括课程相关视频和课件,资料较为全面。
-
动手学深度学习 · 语雀——课程视频评论区中发现的别人做的笔记。
-
动手学深度学习习题解答——该团队完成了书中的所有习题,并提供代码和运行之后的截图。
课程资源:
- B站教学网址:动手学习深度学习(已完结)
- 教材网址:《动手学深度学习》(中文版), 《Dive into Deep Learning》 0.17.1 documentation
- 课程主页:课程安排 - 动手学深度学习课程
- 论坛网址:discuss.d2l.ai,discuss.pytorch
学习笔记
1 深度学习介绍 Q&A
◆ 机器学习的可解释性?机器学习在图片分割为什么有效,目前有没有定论?
模型的可解释性不管是深度学习还是机器学习都是非常受人关注的点,因为这像是一个黑盒,训练了一个模型,也不知道为什么work或者为什么不work。对于深度学习来说,模型的可解释性是做得不够好的;对于机器学习来说,我们对简单的模型可以理解,但当模型变得很深的时候,几乎只能放弃理解的过程。
特别地,为什么有效和可解释性是两个不同的概念,所有提出的新模型都会解释一下为什么有效,可解释性是说人是不是能理解这个模型,理解模型为什么工作是一个方面,还需要知道它什么时候不工作以及在什么地方会出现偏差。
目前来说,一个模型在一个应用/领域上为什么可以工作,会有一些解释,我们会在解释不同的模型的时候给大家进行讲解。
◆ 深度学习无法用数学规范表述,只能用直觉理解是吗?
不一定,深度学习模型可以用数学形式表示,接下来也会讲到很多数学的东西,但是说具体用数学解释它为什么工作,为什么不工作,这个是目前我们做的不好的地方。
◆ 符号学可以和机器学习融合起来吗?
确实是可以的。目前来说,符号学在深度学习有一些新的进展,以前说符号学就是做一些符号上的推理,目前深度学习如图神经网络,可以做一些比较复杂的推理。
◆ 以无人驾驶中的环境识别为例,误判率在不断下降,但误判的影响还是很严重的,有可能从已有的判断case(样例)得到修正,从而完全避免这样的错误吗?
无人驾驶中,任何一次出现的错误,都可能带来毁灭性的灾难。大家可能看到,特斯拉今天撞了,明天又撞了。所以说,无人驾驶对于错误率确实是非常注重的。
机器学习在学术界现在有很多关于uncertainty或者robustness的研究,就是说模型在数据偏移或者极端情况下会不会给出很不好的答案,我们不会特别深入去讲这个事情,但是无人驾驶这一块确实会涉及大量的技术,比如说把不同的模型融合在一起,不是仅仅train一个模型,而是用多个模型来做投票。汽车有雷达、摄像头等很多传感器,它会通过不同的传感器来进行模型的融合,从而降低误差。
我们这个课程不会特别地讲,因为涉及到评价无人驾驶的特别技术,但在竞赛中我们会给大家看到如何通过融合多个模型提升精度的做法。
2 安装
本节在安装python和conda环境(anaconda/miniconda)的基础上。(本人使用的是ubuntu系统)
在安装深度学习框架之前,请先查看计算机是否装有NVIDIA GPU并已安装CUDA。 如果机器没有任何GPU,没有必要担心,因为CPU在前几章完全够用。 但是,如果想流畅地学习全部章节,请提早获取GPU并且安装深度学习框架的GPU版本。
-
创建一个新的conda环境
conda create --name d2l python=3.9 -y conda activate d2l - 安装深度学习框架和d2l软件包:
# 可以按如下方式安装PyTorch的CPU或GPU版本: pip install torch==1.12.0 pip install torchvision==0.13.0 -
也可以访问官网 https://pytorch.org/get-started/locally/ 选择适合自己电脑pytorch版本下载
-
安装d2l包,以方便调取本书中经常使用的函数和类
pip install d2l==0.17.6 -
本课程的jupyter notebook代码详见https://zh-v2.d2l.ai/d2l-zh-2.0.0.zip,也可以点击本书HTML页面顶部的“Jupyter 记事本”选项下载后解压代码。
-
下载 jupyter notebook:输入命令 pip install jupyter notebook (若pip失灵可以尝试pip3),输入命令 jupyter notebook 即可打开。
-
在不考虑版本的情况下(直接安装最新版本):
pip install -y jupyter d2l torch torchvision
3 基本概念
一张图来概括各种学习方法之间的关系

机器学习(machine learning,ML)是一类强大的可以从经验中学习的技术。 通常采用观测数据或与环境交互的形式,机器学习算法会积累更多的经验,其性能也会逐步提高。
3.1 日常生活中的机器学习
书中以编写手机的语音识别唤醒系统为例,需要编写程序来响应手机的唤醒词(如“小爱同学”)。问题看似很难解决:麦克风每秒钟将收集大约44000个样本,每个样本都是声波振幅的测量值。而该测量值与唤醒词难以直接关联。如何编写程序,使其输入麦克风采集到的的原始音频片段,输出{是,否}(表示该片段是否包含唤醒词)的可靠预测呢?我们对编写这个程序毫无头绪,这就是需要机器学习的原因。

利用机器学习算法,不需要设计一个“明确地”识别唤醒词的系统,即我们不知道怎样明确地告诉计算机如何从输入映射到输出,但仍能够识别唤醒词。 我们可以收集一个包含大量音频样本的数据集(dataset),并对包含和不包含唤醒词的样本进行标记。 只需要定义一个灵活的程序算法,其输出由许多参数决定,然后使用数据集来确定当下的“最佳参数集”,这些参数通过某种性能度量方式来达到完成任务的最佳性能。
参数(parameter):参数可以被看作旋钮,旋钮的转动可以调整程序的行为;
模型(model):任一调整参数后的程序被称为模型;
学习算法(learning algorithm):使用数据集来选择参数的元程序。
当模型所有的按钮(模型参数)都被随机设置时,就不太可能识别出“小爱同学”或任何其他单词。 在机器学习中,学习(learning)是一个训练模型的过程。 通过这个过程,我们可以发现正确的参数集,从而使模型强制执行所需的行为。 换句话说,我们用数据训练(train)模型。 训练过程通常包含如下步骤:

- 从一个随机初始化参数的模型开始,这个模型基本没有“智能”;
- 获取一些数据样本(例如,音频片段以及对应的是或否标签);
- 调整参数,使模型在这些样本中表现得更好;
- 重复第(2)步和第(3)步,直到模型在任务中的表现令人满意。
总结:这种“通过用数据集来确定程序行为”的方法可以被看作用数据编程(programming with data)。 比如,可以通过向机器学习系统提供许多猫和狗的图片来设计一个“猫图检测器”。 检测器最终可以学会:如果输入是猫的图片就输出一个非常大的正数,如果输入是狗的图片就会输出一个非常小的负数。 如果检测器不确定输入的图片中是猫还是狗,它会输出接近于零的数。
3.2 机器学习中的关键组件
无论什么类型的机器学习问题,都会遇到这些组件:
可以用来学习的数据(data);
如何转换数据的模型(model);
一个目标函数(objective function),用来量化模型的有效性;
调整模型参数以优化目标函数的算法(algorithm)。
3.2.1 数据
每个数据集由一个个样本(example, sample)组成,大多时候,它们遵循独立同分布(independently and identically distributed, i.i.d.)。 样本有时也叫做数据点(data point)或者数据实例(data instance),通常每个样本由一组称为特征(features,或协变量(covariates))的属性组成。 机器学习模型会根据这些属性进行预测。 在上面的监督学习问题中,要预测的是一个特殊的属性,它被称为标签(label,或目标(target))。
当处理图像数据时,每一张单独的照片即为一个样本,它的特征由每个像素数值的有序列表表示。 比如, 的彩色照片由
个数值组成,其中的“3”对应于每个空间位置的红、绿、蓝通道的强度。
当每个样本的特征类别数量都是相同的时候,其特征向量是固定长度的,这个长度被称为数据的维数(dimensionality)。 固定长度的特征向量是一个方便的属性,它可以用来量化学习大量样本。然而,并不是所有的数据都可以用“固定长度”的向量表示(如不同分辨率的图片,不同长度的文本数据)。与传统机器学习方法相比,深度学习的一个主要优势是可以处理不同长度的数据。
更多的数据可以被用来训练出更强大的模型,减少对预先设想假设的依赖。 数据集的由小变大为现代深度学习的成功奠定基础。
此外,还需要正确的数据: 如果数据中充满了错误,或者如果数据的特征不能预测任务目标,那么模型很可能无效。
3.2.2 模型
大多数机器学习会涉及到数据的转换。 比如通过一组传感器读数预测读数的异常程度。 虽然简单的模型能够解决如上简单的问题,但本书中关注的问题超出了经典方法的极限。深度学习与经典方法的区别主要在于:前者关注功能强大的模型,这些模型由神经网络错综复杂的交织在一起,包含层层数据转换,因此被称为深度学习(deep learning)。
3.2.3 目标函数
机器学习“从经验中学习”—— 这里所说的“学习”,是指自主提高模型完成某些任务的效能。 但是,什么才算真正的提高呢? 在机器学习中,我们需要定义模型优劣程度的度量,这个度量在大多数情况是“可优化”的,这被称之为目标函数(objective function),有时也被称为损失函数(loss function,或cost function)。损失函数是根据模型参数定义的,并取决于数据集。在一个数据集上,我们可以通过最小化总损失来学习模型参数的最佳值。
因此,数据集通常可以分成两部分:训练数据集(training dataset,或称为训练集(training set))用于拟合模型参数,测试数据集(test dataset,或称为测试集(test set))用于评估拟合的模型。 “模型在训练数据集上的性能”可以被想象成“学生在模拟考试中的分数”。这个分数用来为真正的期末考试做参考,即使成绩令人鼓舞,也不能保证期末考试成功,也就是测试性能可能会显著偏离训练性能。 当一个模型在训练集上表现良好,但不能推广到测试集时,这个模型被称为过拟合(overfitting)。
3.2.4 优化算法
用于搜索最佳参数,最小化损失函数的算法。 深度学习中,大多流行的优化算法通常基于一种基本方法——梯度下降(gradient descent)。 在每个步骤中,梯度下降法都会检查损失函数的梯度,寻找使损失函数下降最快的方向,然后优化参数以搜索函数的极小值。
3.3 各种机器学习问题
3.3.1 监督学习
监督学习(supervised learning)擅长在“给定输入特征”的情况下预测标签。 每个“特征-标签”对都称为一个样本(example)。在训练参数时,会为模型提供一个每个样本都有真实标签的数据集。例如,要预测患者的心脏病是否会发作,那么观察结果“心脏病发作”或“心脏病没有发作”将是样本的标签,输入特征可能是生命体征,如心率、舒张压和收缩压等。我们的目标是生成一个模型,能够将任何输入特征映射到标签(即预测)。
工业中,大部分机器学习的成功应用都使用了监督学习。 这是因为在一定程度上,许多重要的任务可以清晰地描述为,在给定一组特定的可用数据的情况下,估计未知事物的概率。
监督学习的学习过程一般可以分为三大步骤:
从已知大量数据样本中随机选取一个子集,为每个样本获取或人工标注真实标签。这些输入和相应的标签一起构成了训练数据集;
选择监督学习算法,将训练数据集作为输入,并输出一个“已完成学习的模型”;
将新的样本特征输入“已完成学习的模型”中,模型的输出即为对标签的预测。

3.3.1.1 回归
回归(regression)是最简单的监督学习任务之一。当标签取任意数值时,我们称之为回归问题,此时的目标是生成一个模型,使它的预测非常接近实际标签值。生活中的许多问题都可归类为回归问题。 比如,预测用户对一部电影的评分可以被归类为一个回归问题。总而言之,判断回归问题的一个很好的经验法则是,任何有关“有多少”的问题很可能就是回归问题。比如:这个手术需要多少小时;这个镇在未来6小时会有多少降雨量等。
在这些情况下,我们将尝试学习最小化“预测值和实际标签值的差异”的模型。 本书大部分章节将关注平方误差损失函数的最小化。
3.3.1.2 分类
分类(classification)问题希望模型能够预测样本属于哪个类别(category,正式称为类 (class) ),例如,手写数字可能有10类,标签被设置为数字0~9,这种有两个以上类别的问题称为多项分类(multiclass classification)问题。 最简单的分类问题是只有两类,这被称之为二项分类(binomial classification),例如,数据集可能由动物图像组成,标签可能是猫狗两类。(更复杂的还有层次分类) 回归是训练一个回归函数来输出一个数值; 分类是训练一个分类器来输出预测的类别。
然而模型怎么判断这种“是”或“不是”的硬分类预测呢? 可以试着用概率语言来理解模型。 给定一个样本特征,模型为每个可能的类分配一个概率。 比如,在猫狗分类中,分类器可能会输出图像是猫的概率为0.9。 0.9这个数字表达什么意思呢? 可以这样理解:分类器90%确定图像描绘的是一只猫。 预测类别的概率的大小传达了一种模型的不确定性,本书后面章节将讨论其他运用不确定性概念的算法。
与解决回归问题不同,分类问题的常见损失函数被称为交叉熵(cross-entropy)。
3.3.1.3 标记问题
学习预测不相互排斥的类别的问题称为多标签分类(multi-label classification)。 例如,CSDN博客的文章标签包括“深度学习”、“编程语言”、“ubuntu”等。 一篇文章可能具有多个标签,因为这些概念是相互关联的。 关于“ubuntu”的帖子可能会提到“编程语言”,而关于“机器学习”的帖子也可能涉及“编程语言”。
3.3.1.4 搜索
在信息检索领域,我们希望对一组项目进行排序。 以网络搜索为例,目标不是简单的“查询(query)-网页(page)”分类,而是在海量搜索结果中找到用户最需要的那部分。 搜索结果的排序也十分重要,学习算法需要输出有序的元素子集。 即使结果集是相同的,集内的顺序有时也很重要。该问题的一种可能的解决方案:首先为集合中的每个元素分配相应的相关性分数,然后检索评级最高的元素。
3.3.1.5 推荐系统
推荐系统(recommender system)的目标是向特定用户进行“个性化”推荐。 例如,对于电影推荐,科幻迷和喜剧爱好者的推荐结果页面可能会有很大不同。 类似的应用也会出现在零售产品、音乐和新闻推荐等等。总的来说,推荐系统会为“给定用户和物品”的匹配性打分,这个“分数”可能是估计的评级或购买的概率。 由此,对于任何给定的用户,推荐系统都可以检索得分最高的对象集,然后将其推荐给用户。
3.3.1.6 序列学习
以上大多数问题都具有固定大小的输入和产生固定大小的输出。如果输入的样本之间没有任何关系,以上模型可能完美无缺。 但是如果输入是连续的,模型可能就需要拥有“记忆”功能。 比如视频片段该如何处理? 每个视频片段可能由不同数量的帧组成。 通过前一帧的图像,我们可能对后一帧中发生的事情更有把握。 语言也是如此,机器翻译的输入和输出都为文字序列。
这些问题是序列学习的实例,是机器学习最令人兴奋的应用之一。 序列学习需要摄取输入序列或预测输出序列,或两者兼而有之。 具体来说,输入和输出都是可变长度的序列,例如机器翻译和从语音中转录文本。
3.3.2 无监督学习
监督学习需要向模型提供巨大数据集,每个样本包含特征和相应标签值。但是,如果样本中不存在标签,又该如何完成任务呢?这种数据中不含有“目标”的机器学习问题通常被为无监督学习(unsupervised learning)。
聚类(clustering)问题:没有标签的情况下,我们是否能给数据分类呢?比如,给定一组照片,我们能把它们分成风景照片、狗、婴儿、猫和山峰的照片吗?同样,给定一组用户的网页浏览记录,我们能否将具有相似行为的用户聚类呢?
主成分分析(principal component analysis)问题:我们能否找到少量的参数来准确地捕捉数据的线性相关属性?比如,一个球的运动轨迹可以用球的速度、直径和质量来描述。再比如,裁缝们已经开发出了一小部分参数,这些参数相当准确地描述了人体的形状,以适应衣服的需要。
因果关系(causality)和概率图模型(probabilistic graphical models)问题:我们能否描述观察到的许多数据的根本原因?例如对于关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,能否简单地根据经验数据发现它们之间的关系?
生成对抗性网络(generative adversarial networks):提供了一种合成数据的方法,甚至像图像和音频这样复杂的非结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域。
3.3.3 与环境互动
不管是监督学习还是无监督学习,都会预先获取大量数据,然后启动模型,不再与环境交互。 这里所有学习都是在算法与环境断开后进行的,被称为离线学习(offline learning)。 离线学习好的一面是,我们可以孤立地进行模式识别,而不必分心于其他问题。 但缺点是,解决的问题相当有限。 这时我们可能会期望人工智能(指“智能体”,而不仅是“预测模型”)不仅能够做出预测,而且能够与真实环境互动。 与预测不同,“与真实环境互动”实际上会影响环境。 因此,我们必须考虑到它的行为可能会影响未来的观察结果。

从环境中为监督学习收集数据
考虑“与真实环境互动”将打开一整套新的建模问题,例如:
环境还记得我们以前做过什么吗?
环境是否有助于我们建模?
环境是否重要?
环境是否变化?例如,未来的数据是否总是与过去相似,还是随着时间的推移会发生变化?是自然变化还是响应我们的自动化工具而发生变化?
当训练和测试数据不同时,最后一个问题提出了分布偏移(distribution shift)的问题。 接下来的内容将简要描述强化学习问题,这是一类明确考虑与环境交互的问题。
3.3.4 强化学习
如果你对使用机器学习开发与环境交互并采取行动感兴趣,那么最终可能会专注于强化学习(reinforcement learning)。 这可能包括应用到机器人、对话系统,甚至开发视频游戏的人工智能(AI)。 深度强化学习(deep reinforcement learning)将深度学习应用于强化学习的问题,是非常热门的研究领域。 AlphaGo在围棋比赛中击败世界冠军是典型的强化学习的例子。
在强化学习问题中,智能体(agent)在一系列的时间步骤上与环境交互。 在每个特定时间点,智能体从环境接收一些观测(observation),并且选择一个动作(action),然后通过某种机制(有时称为执行器)将其传输回环境,最后智能体从环境中获得奖励(reward)。 此后新一轮循环开始,智能体接收后续观测,并选择后续操作,依此类推。 强化学习的目标是产生一个好的策略(policy),智能体选择“动作”受策略控制,即一个从环境观测映射到动作的功能。

强化学习框架的通用性十分强大。 例如,我们可以将任何监督学习问题转化为强化学习问题。 假设我们有一个分类问题,可以创建一个强化学习智能体,每个分类对应一个“动作”。 然后,我们可以创建一个环境,该环境给予智能体的奖励。 这个奖励与原始监督学习问题的损失函数是一致的。当然,强化学习还可以解决许多监督学习无法解决的问题。 例如,在监督学习中,我们总是希望输入与正确的标签相关联。 但在强化学习中,我们并不假设环境告诉智能体每个观测的最优动作。 一般来说,智能体只是得到一些奖励,甚至可能不会告诉是哪些行为导致了奖励。
以强化学习在国际象棋的应用为例。 唯一真正的奖励信号出现在游戏结束时:当智能体获胜时,智能体可以得到奖励1;当智能体失败时,智能体将得到奖励-1。 因此,强化学习者必须处理学分分配(credit assignment)问题:决定哪些行为是值得奖励的,哪些行为是需要惩罚的。
最后,在任何时间点上,强化学习智能体可能知道一个好的策略,但可能有许多更好的策略从未尝试过的。智能体必须不断地做出选择:是应该利用当前最好的策略,还是探索新的策略空间(放弃一些短期回报来换取知识)。
一般的强化学习问题是一个非常普遍的问题。 智能体的动作会影响后续的观测,而奖励只与所选的动作相对应。 环境可以是完整观察到的,也可以是部分观察到的。当环境可被完全观察到时,强化学习问题被称为马尔可夫决策过程(markov decision process)。 当状态不依赖于之前的操作时,我们称该问题为上下文赌博机(contextual bandit problem)。 当没有状态,只有一组最初未知回报的可用动作时,这个问题就是经典的多臂赌博机(multi-armed bandit problem)。
4 数据读取和操作
4.1 数据操作
主要涉及到的一些Python的基本操作,有过Python基础的上手会比较快。主要记录一些需要注意的点。(推荐Python学习网站:简介 - Python教程 - 廖雪峰的官方网站)
n 维数组,也称为张量(tensor)。PyTorch的张量类与Numpy的ndarray类似。但在深度学习框架中应用PyTorch的张量类,又比Numpy的ndarray多一些重要功能:
tensor可以很好地支持GPU加速计算,而NumPy仅支持CPU计算;
tensor支持自动微分。
这些功能使得张量类更适合深度学习。
1 基本操作
(1)我们可以使用arange创建一个行向量,这个行向量包含从0开始的指定个整数。张量中的每个值都称为张量的元素(element)。例如,张量x中有12个元素。除非额外指定,新的张量默认将存储在内存中,并采用基于CPU的计算。
>>> x = torch.arange(12)
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
(2)可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状。
>>> x.shape
torch.Size([12])
(3)要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。
>>> X = x.reshape(3, 4)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
此外,我们不需要手动指定每个维度来改变形状,如果目标形状是(高度 x 宽度),那么在知道宽度后,高度会被自动计算得出。我们可以通过-1来调用此自动计算出维度的功能即可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。
2 简单运算
在数据上执行数学运算,最简单且最有用的操作是按元素(elementwise)运算。它们将标准标量运算符应用于数组的每个元素,即应用于两个数组中的每对位置对应的元素。我们可以在同一形状的任意两个张量上调用按元素操作,[常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算]。
3 广播机制
在某些情况下,[即使形状不同,我们仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作]。广播是一种虚拟维度扩展技术,通过逻辑上扩展小张量的维度,使其与较大张量的形状兼容,从而执行元素级运算。
(1) 广播机制定义:如果一个PyTorch操作支持广播,则其Tensor参数可以自动扩展为相等大小(不需要复制数据)。通常情况下,小一点的数组会被 broadcast 到大一点,以保持大小一致。
(2)广播机制规则
机制的工作条件:每个tensor至少有一个维度。遍历tensor所有维度时,两个tensor满足“三维度法则”:(参考博客:张量广播机制(Broadcasting)深度解析-CSDN博客)
-
尾部对齐原则:比较维度时从最右侧维度开始向左进行
张量A: (3, 4, 5) 张量B: (4, 5) # 自动对齐为 (1, 4, 5) - 单一维度扩展:大小为1的维度可扩展为任意大小
张量A: (3, 4, 5) 张量B: (3, 1, 5) # 中间维度扩展为4缺失维度补位:维度不足时在前面补1
张量A: (3, 4, 5) 张量B: (5) # 补位为 (1, 1, 5)
机制的工作方式:如果两个tensor是“可广播的”,则
- 如果两个
tensor的维度不同,则在维度较小的tensor的前面增加维度,使它们维度相等。- 对于每个维度,计算结果的维度值取两个
tensor中较大的那个值。- 两个
tensor扩展维度的过程是将数值进行复制。
4 节约内存
运行一些操作可能会导致为新结果分配内存。 例如,Y = X + Y会使Y指向新分配的内存处的张量。Python的id()函数提供了内存中引用对象的确切地址。 运行Y = X + Y后,我们会发现id(Y)指向另一个位置。 这是因为Python首先计算X + Y,然后为结果分配新的内存,使Y 指向内存中的这个新位置。
>>> before = id(Y)
>>> Y = Y + X
>>> id(Y) == before
False
这可能是不可取的,原因有两个:
首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;
如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
原地执行:使用切片表示法将操作的结果分配给先前分配的数组,如 Z[ : ] = X + Y。如果在后续计算中没有重复使用X,也可以使用 X[:] = X + Y 或 X += Y 来减少操作的内存开销。
4.2 数据预处理
为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始。在Python常用的数据分析工具中,通常使用pandas软件包。像庞大的Python 生态系统中的许多其他扩展包一样,pandas可以与张量兼容。
4.3 Q&A
Q1: reshape和view的区别?
Q2: Tensor和Array的区别?
Tensor是数学上定义的张量,Array是计算机概念数组,但在深度学习中有时将Tensor视为多维数组。
Q3:新分配了y的内存,那么之前y对应的内存会自动释放吗?
Python会在不需要时自动释放内存。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)