机器学习和神经网络 - 页 17

 

用于深度学习和机器学习的 PyTorch – 完整课程(第 11-16 部分)


用于深度学习和机器学习的 PyTorch – 完整课程


第 11 部分

  • 10:00:00 在视频课程的这一部分中,讲师概述了 PyTorch 中常用的用于神经网络分类的各种损失函数和优化器。讲师解释了二元交叉熵损失、交叉熵损失、平均绝对误差和均方误差,以及哪些通常用于回归与分类任务。对于二进制分类任务,提供的代码示例包括 torch.nn BCE loss with logits 和 BCE loss。该视频还涵盖了深度学习中 logit 的概念,并探讨了两种常用的优化器 SGD 和 Adam。讲师指出,虽然可能还有其他可用的优化器,但坚持使用这两个仍然可以在许多问题上取得良好的效果。

  • 10:05:00 在视频的这一部分中,演讲者在 PyTorch 中设置了深度学习和机器学习的损失函数和优化器。损失函数称为 BCE with logits loss,它内置了 sigmoid 激活函数。演讲者解释说,如果想了解更多有关神经网络中激活函数的信息,可以使用在线资源。选择的优化器是随机梯度下降(SGD),学习率为 0.1,参数设置为根据损失更新模型参数。最后,演讲者创建一个评估指标。

  • 10:10:00 在本节中,讲师讨论了准确性作为评估指标的重要性,并演示了如何使用 pytorch 创建准确性函数。 accuracy 函数将预测与真实标签进行比较,并返回正确预测占样本总数的百分比。讲师还概述了 pytorch 训练循环中涉及的步骤,包括正向传递、损失计算、优化器零梯度、反向传播和梯度下降。列出了步骤并讨论了每个步骤的重要性。

  • 10:15:00 在本节中,讲师解释了如何从原始对数到预测概率再到预测标签。模型的原始输出称为 logits,可以通过将它们传递给激活函数(例如用于二元分类的 sigmoid 和用于多类分类的 softmax)来转换为预测概率。然后可以通过将预测概率四舍五入进行二元分类或采用 argmax 进行多类分类,将预测概率转换为预测标签。讲师还将激活函数的概念解释为与层分开的东西,并展示了通过线性层的数据如何通过点积和偏置项对传入数据应用线性变换。

  • 10:20:00 在视频的这一部分中,讲师解释了如何使用 sigmoid 激活函数将模型的原始输出(称为 logits)转换为可用于二元分类的预测概率。讲师演示了如何在模型 logits 上使用 sigmoid 函数来创建 predprobs,然后可以将其传递给 torch dot round 函数以获得预测标签。这些预测标签用于确定输入属于哪个类别,使用通常设置为 0.5 的决策边界。讲师还强调了对原始 logits 执行此步骤的重要性,以确保预测概率与测试数据的格式相同。

  • 10:25:00 在本节中,视频讨论了使用激活函数将模型的原始 logits 转换为预测概率,然后将其转换为预测标签的过程。这些步骤通过一些代码进行演示,其中 y-pred 是使用完整步骤从 y-pred 探针创建的,包括预测、logits 到 pred 探针到 pred 标签。将模型的预测与测试标签进行比较,并使用挤压功能创建相同的格式。下一步是建立一个训练和测试循环,包括进行前向传播、计算损失和优化梯度。该视频鼓励观看者在继续观看下一个视频以获取进一步说明之前自行尝试此操作。

  • 10:30:00 在本节中,讲师设置了可重复性的手动种子,特别是用于在 CUDA 设备上操作的 CUDA 随机种子。然后他们继续将数据放在目标设备上并构建训练和评估循环。讲师在前向传递中强调了一个小花絮,其中输出原始对数并且必须通过 torch.round 和 torch.sigmoid 将它们转换为预测概率和标签。最后,他们计算损失和准确度,并指出虽然计算准确度不是必需的,但在模型训练时可视化不同的指标可能很有用。

  • 10:35:00 在本节中,视频讨论了 PyTorch 中 BCE 损失和 BCE with logits 损失的区别。具有 logits 损失的 BCE 期望 logits 作为输入,并结合了 sigmoid 层和 BCE 损失,使其在数值上更稳定。另一方面,BCE 损失期望预测概率作为输入,因此需要在 logits 上调用 torch sigmoid 将它们转换为概率。该视频还概述了 PyTorch 优化循环的步骤,包括将梯度归零、执行反向传播以及更新参数以减少梯度。同样,在进行测试或预测时,应将模型置于推理模式,并通过调用 sigmoid 函数处理测试 logits 以获得预测概率。

  • 10:40:00 在本节中,讲师讨论如何计算分类模型的测试损失和准确性。为了计算测试损失,讲师使用具有 logits 损失函数的 BCE 并将其与 Y 测试标签进行比较。为计算测试准确度,讲师对 Y true 和 Y pred 变量使用准确度函数。精度函数的变量顺序是相反的,因为讲师基于 scikit-learn 的指标包。最后,指导员每 10 个 epoch 打印一次 epoch 编号、训练损失和准确度以及测试损失和准确度。讲师鼓励用户运行这个庞大的代码并修复出现的任何错误。

  • 10:45:00 这部分讲师讨论了上一节模型训练的结果,在准确率上并没有明显的提升。讲师建议模型的理想精度应为 100,损失值应为零。但是,目前模型的准确率低于50%,相当于胡乱猜测。为了确定表现不佳的原因,教师建议可视化模型所做的预测。教师从辅助函数文件中导入一个名为“绘制决策边界”的函数,以用于此可视化过程。讲师还为那些有兴趣了解更多有关机器学习基础和 ML 操作的人推荐资源 madewithml.com。

  • 10:50:00 在本节中,讲师解释了如何使用 Python 的“pathlib”和“request”模块以编程方式从 PyTorch 学习存储库下载辅助函数。讲师展示了检查辅助函数路径是否已经存在的过程,如果不存在,则请求将辅助函数下载为名为“helper_functions.py”的文件。讲师演示了从下载的辅助函数中成功导入方法“plot_predictions”和“plot_decision_boundary”,这将在课程后面使用。最后,讲师使用“plot_decision_boundary”函数执行测试以可视化辅助函数,该函数成功绘制了训练集的决策边界。

  • 10:55:00 在视频的这一部分,演示者讨论了线性模型在用直线分离圆形数据方面的局限性,如模型决策边界的可视化所示。提高模型准确性的解决方案是添加更多层,即增加神经网络的深度,从而有更多机会了解数据中的模式。其他提高模型性能的方法包括增加训练数据量和调整超参数,例如学习率和批量大小。从外部 Python 脚本导入和使用辅助函数也是一种常见的做法。

第 12 部分

  • 11:00:00 在本节中,讲师讨论改进模型的方法:添加更多隐藏单元、拟合更长时间、更改激活函数、调整学习率和更改损失函数。讲师指出,增加模型中的参数数量可能有助于更好地表示数据,但过多的参数可能会使模型对于简单数据集来说过于复杂。讲师还说明了实验如何通过改变模型的结构和超参数来帮助改进模型。最后,讲师展示了添加层、增加隐藏单元数量、添加激活函数和更改优化函数如何潜在地改进模型的图形示例。

  • 11:05:00 本节讲师从模型角度讨论如何改进模型。他解释了超参数的概念,这些值是机器学习工程师和数据科学家可以更改以改进模型结果的值。讲师演示了如何更改模型的超参数,例如隐藏单元的数量、层数和轮数。他还强调了一次测试这些变化的重要性,以确定哪一个提供了改进或退化。最后,他解释了参数和超参数之间的区别以及区分这种区别的重要性。

  • 11:10:00 在本节中,讲师创建了一个包含更多隐藏单元的三层模型,以查看长时间训练此模型是否会产生更好的结果。覆盖 forward 方法以通过每个层传递数据,具有一个额外的隐藏单元和一个额外的整体层。还演示了利用加速的方法一次执行所有操作。创建三层模型的实例并将其发送到目标设备,然后创建损失函数和优化器,以及模型一的训练和评估循环。

  • 11:15:00 在本节中,视频继续上一节,其中 nn.module 被子类化以创建一个新模型,Circle Model V1,具有更多的隐藏单元和一个额外的层。现在,工作流程的下一步是选择损失函数,视频像以前一样使用 nn.BCEWithLogitsLoss(),使用相同的优化器 torch.optin.SGD()。视频将学习率设置为0.1,epochs数设置为1000,并将数据放在目标设备(CPU或GPU)上。该视频还演示了一个遍历 epoch 的循环,并通过具有新架构的模型传递训练数据,计算损失,并使用 torch 的 autograd 更新参数。

  • 11:20:00 在视频的这一部分中,讲师回顾了评估模型准确性和损失的步骤。损失函数接受预测标签值并将它们与实际标签值进行比较。准确性函数用于确定模型预测的准确性。优化器用于调整模型的参数以创建更好的数据表示。测试是通过调用模型的 eval() 方法并打开推理模式来完成的。 Logits 通过将输入数据传递给模型来创建,然后使用 torch.round() 和 torch.sigmoid() 函数将它们转换为预测。计算测试数据的损失和准确性,并在模型训练期间每 100 个 epoch 打印一次。

  • 11:25:00 在 PyTorch for Deep Learning & Machine Learning 课程的这一部分,讲师讨论了模型不工作时的故障排除技术,例如测试一个较小的问题以查看模型是否可以学习任何东西。他建议复制上一节中线性模型能够拟合直线的数据集,并使用它来查看当前模型是否可以学到任何东西,因为它目前只是猜测,无法绘制直线来分隔循环数据。讲师还提到一些改进模型的方法包括更改超参数,例如层数和隐藏单元数,以及更改激活函数和损失函数。

  • 11:30:00 在本节中,讲师使用线性回归公式创建一个数据集,以查看该模型是否适用于任何类型的问题。该数据集称为 x 回归,每个 y 值包含一个 x 值的 100 个样本。然后,教师为数据创建训练和测试拆分并检查它们的长度。最后,辅助函数文件中的绘图预测函数用于直观地检查数据。

  • 11:35:00 在本节中,演示者讨论了一个辅助项目,以查看他们的模型是否可以在尝试拟合非直线数据集之前拟合直线数据集。他们调整模型 1 以适应新数据集,方法是将输入特征的数量从两个更改为一个以匹配数据,同时将输出特征保持在 10 个,以便为模型提供尽可能多的参数。他们还使用 NN 点顺序创建模型 2,它通过层传递数据,并设置损失和优化器函数。

  • 11:40:00 在本节中,讲师介绍了L1 损失函数来优化回归问题,并使用学习率为0.1 的SGD 优化器来优化模型的参数。加载数据集并将其放在目标设备上后,模型将通过循环训练一千个 epoch。在每个 epoch 中,执行前向传递,计算损失,并使用后向和步进函数更新参数。训练进度每 100 个 epoch 打印出 epoch、loss 和 test loss。随着模型的优化,损失会下降。

  • 11:45:00 在视频的这一部分中,讲师回顾了上一节,他们创建了一个直线数据集并训练了一个模型来拟合它。他们确认该模型正在学习一些东西,并建议学习者尝试使用不同的学习率值来试验机器学习模型。然后讲师继续解释如何打开评估模式并进行预测,这也称为推理。他们还教授如何使用绘图预测功能并遇到由于数据与模型不在同一设备上而导致的错误,他们通过在张量输入上调用 dot CPU 来解决这个问题。

  • 11:50:00 本节讲师介绍非线性在机器学习和深度学习模型中的重要性。单靠线性函数无法捕获数据中的复杂模式,需要像曲线这样的非线性函数才能准确地表示它们。神经网络是通过将线性函数与非线性函数或激活相结合来构建的,以对复杂的数据模式进行建模。讲师暗示即将推出的视频将涵盖非线性激活及其在深度学习模型中的作用。

  • 11:55:00 在本节中,讲师讨论非线性在机器学习和神经网络中的作用。非线性在机器学习中是必不可少的,因为数据并不总是由直线组成。然后,讲师演示如何使用 make circles 函数创建和绘制非线性数据,以及如何使用 PyTorch 和 sklearn 中的训练测试拆分函数将数据转换为时态以及训练和测试拆分。

第 13 部分

  • 12:00:00 在本节中,PyTorch for Deep Learning & Machine Learning 课程的讲师介绍了非线性,这是构建模型的重要组成部分。讲师要求观众在 TorchNN 模块中找到一个特定的非线性函数,其中可以包括池化层、填充层和激活函数,以对输入执行一些数学运算。提供了非线性激活的示例,例如 n 点 sigmoid 和 n 点 relu。然后,讲师演示了如何使用 PyTorch 使用非线性构建分类模型。非线性意味着图形不是直线,而线性则相反。

  • 12:05:00 在 PyTorch for Deep Learning & Machine Learning 课程的这一部分,讲师介绍了非线性数据的概念以及神经网络和机器学习模型如何处理数百个维度的数字,使它们更容易处理非线性数据。一个新的神经网络,圆形模型 V2,是使用带有构造函数的类和多个执行线性操作的层创建的,并添加了称为“relu”的非线性激活函数。此函数将模型的负输入变为零,同时将正输入保持原样。然后将新模型传递给 sigmoid 函数以确定输出。

  • 12:10:00 在本节中,讲师要求观众在 TensorFlow Playground 中重新创建一个具有两个隐藏层和五个神经元的神经网络模型,使用修正线性单元 (ReLU) 激活函数而不是线性激活函数,他们一直在用讲师解释说,ReLU 激活函数是一种流行且有效的非线性激活函数,它是神经网络设计用于建模非线性数据所必需的。讲师演示了改变学习率对训练损失的影响,并鼓励观众尝试不同的学习率以观察对损失曲线的影响。

  • 12:15:00 在本节中,讲师讨论使用 PyTorch 为二元分类问题构建优化器和损失函数。他们将模型的非线性激活函数设置为 ReLU,并为 CUDA 创建随机种子。然后他们循环通过 1000 个 epoch 来训练模型,并分别使用具有 logits 损失函数和精度函数的 BCE 计算损失和精度。讲师鼓励思考如何使培训代码功能化,并建议本节旨在为从事实际 PyTorch 项目积累经验和动力。

  • 12:20:00 本节讲师讲解PyTorch中反向传播方法优化模型的过程。在执行反向传播之前,优化器的梯度被置零,以便它可以从零开始。执行loss.backward()后,调用优化器的step方法对模型参数进行梯度下降。讲师还演示了如何调试模型的参数,并解释了ReLU激活函数没有任何参数,使其有效。最后,instructor 打印出训练和测试损失、准确率和 epoch,以跟踪模型的学习进度。

  • 12:25:00 在本节中,讲师解决了 PyTorch 代码中的形状问题,并通过使用 squeeze 函数删除测试 logits 点形状中的额外维度来修复该问题。然后,他们讨论了非线性的威力,以及添加 relu 层如何提高模型的性能,使其有可能绘制一条线来分隔数据集中的圆圈。讲师还强调了可视化在评估模型和做出预测方面的重要性,并挑战观众绘制决策边界。

  • 12:30:00 在本节中,讲师演示了使用 plot 决策边界函数来可视化非线性模型与线性模型相比的性能。非线性模型被证明比线性模型具有更好的准确性,但讲师要求观众进一步提高准确性。然后,讲师继续讨论神经网络如何使用线性和非线性函数作为发现数据模式的工具,并演示了如何在 PyTorch 中创建张量和使用非线性激活函数。

  • 12:35:00 在本节中,讲师解释了如何通过复制流行的 ReLU 和 Sigmoid 函数在 PyTorch 中创建自定义激活函数。讲师首先设置 torch float 32 的数据类型,并可视化在 x 轴上使用负 10 到 10 值绘制的直线。然后使用 torch.relu 和 nn.relu 函数创建 ReLU 函数,方法是获取输入张量并返回零和 x 的最大值。类似地,Sigmoid 函数是通过获取输入张量并返回 1 除以 1 加上负 x 的指数来创建的。讲师通过绘制自定义 ReLU 和 Sigmoid 函数并将它们与 PyTorch 内置函数进行比较来演示自定义 ReLU 和 Sigmoid 函数的有效性。

  • 12:40:00 在 PyTorch 课程的这一部分,讲师解释了结合线性和非线性函数来查找数据模式以拟合数据集的重要性。神经网络背后的想法是堆叠这些功能的层以创建模型。虽然可以从头开始构建这些层,但 Pytorch 提供了经过错误测试的预构建层,并在幕后尽可能快地进行计算,同时还允许使用 GPU。讲师还讨论了涉及两种可能结果的二元分类与涉及两种以上可能结果的多类分类之间的区别。最后,本节最后重申了非线性在神经网络中的重要性,并且讲师提出了改进他们之前的二元分类模型的挑战。

  • 12:45:00 本节课讲师介绍多类分类及其与二分类的区别。使用 softmax 激活函数代替 sigmoid,使用交叉熵代替二元交叉熵。然后,讲师继续使用 scikit-learn.datasets 中的 make blobs 函数创建一个包含 20 个多类的数据集,以生成四个类,每个类具有两个特征。中心标准偏差被调整为给集群一些随机性并稍微摇动它们,从而使模型更难一些。

  • 12:50:00 在本节中,文字记录摘录讨论了如何使用 PyTorch 为多类分类模型准备数据。他们将数据转换为张量,并使用 scikit-learn 中的训练测试拆分功能将数据拆分为训练集和测试集。他们还使用 plot.figure 可视化数据并设置随机种子以确保可重复性。创建多类分类数据集后,他们考虑是否需要非线性来分离数据,然后继续为数据建立模型。

  • 12:55:00 在本节中,讲师讨论如何使用 PyTorch 建立多类分类模型。他逐步解释了该过程,从定义输入层形状和确定每个隐藏层的神经元数量开始。然后讲师解释如何设置输出层形状,这需要每个类一个输出特征。为了创建模型,讲师创建了一个名为“blob 模型”的类,它继承自 nn.module 并为模型设置了一些参数。最后,讲师演示了如何使用输入特征和输出特征来初始化多类分类模型。

第 14 部分

  • 13:00:00 在本节中,讲师讨论使用 PyTorch 的 nn.Sequential 方法创建线性层堆栈模型。为了实例化模型,访问输入特征的数量和输出类的数量以确定隐藏层的配置。讲师设置一个连续的层堆栈,以逐层传递数据。他们还提供了有关向数据集添加非线性的说明,然后创建前向方法以允许输入按顺序通过指定层。最后,使用适当数量的输入和输出特征创建 blob 模型的实例。

  • 13:05:00 在视频的这一部分中,讲师通过对 nn.Module 进行子类化来创建多类分类模型,并为类构造函数设置参数以自定义输入和输出特征。他们还解释说,输出特征参数与数据中的类数一致。为了创建多类分类模型的损失函数,讲师在 torch.nn 模块中搜索并找到交叉熵损失,它计算输入和目标之间的损失,在训练 C 类分类问题时很有用。讲师还解释说,权重参数在处理不平衡的训练集时很有用。

  • 13:10:00 在本节中,讲师讨论了为多类分类创建损失函数和优化器。他推荐了两个常见的优化器,SGD 和 Adam,但在这个例子中选择使用 SGD。然后,他要求观众对上一个视频中创建的模型进行前向传播,并考虑模型的原始输出是什么。讲师还提醒观众注意设备参数,因为如果张量不在同一设备上,可能会出现运行时错误。最后,他将模型转为评估模式并做出一些预测。

  • 13:15:00 在本节中,讲师将解释如何将模型的输出logits 转换为多类别分类问题的预测概率和预测标签。为此,使用 softmax 函数将 logits 转换为预测概率,然后将概率最高的预测视为预测标签。讲师使用 PyTorch 代码演示了此过程,并指出由于 softmax 函数的性质,每个样本的概率之和始终为 1。

  • 13:20:00 在本节中,讲师解释了如何从多类别分类问题的 PyTorch 模型的原始输出到使用 softmax 激活函数的预测概率,然后通过采用预测概率。此过程涉及将模型的原始输出转换为 logits,使用 softmax 函数获取预测概率,并使用这些概率的 argmax 来获取预测标签。讲师指出,虽然当前的预测是随机的,因为模型尚未经过训练,但这些步骤将用于训练循环中以训练和评估模型。

  • 13:25:00 在本节中,讲师开始为多类模型构建训练和测试循环。首先,他们设置手动种子以尝试每次都获得相同的输出,但请注意,这并不能保证。然后他们将 epoch 数设置为 100,并将数据放到目标设备上。数据循环开始,对于每个时期,模型都使用前向传递和从 x blob train 创建的 logits 进行训练。 Torch softmax 函数的输出用于计算具有交叉熵损失和精度的损失。然后将优化器归零,并在优化器步进之前执行反向传播。还提供了用于测试或推理的代码,其中涉及将模型设置为评估模式。

  • 13:30:00 在本节中,讲师讨论了 dropout 层、关闭 match norm 和 torch 推理模式以更快地进行预测。他们解释说,在训练过程中,dropout 层会随机丢弃一些神经元以避免过度拟合。讲师还演示了如何通过在幕后传入测试损失和测试标签来计算测试 logits 和测试准确性。然后他们讨论导致运行时错误的讨厌的数据类型问题以及他们如何解决它。讲师强调,排查代码是机器学习的重要组成部分,识别和解决错误需要时间。

  • 13:35:00 在本节中,讲述者在创建多类分类模型时遇到了各种故障排除挑战。首先,他发现他的代码中的错误是由于其中一个张量的数据类型错误造成的。通过一些研究和实验,他将张量更改为“torch.long 张量”,以优化交叉熵损失的计算。后来,由于训练和测试数据的大小不同,他遇到了另一个错误。通过实时调试代码,他确定了问题并重新分配了数据。尽管存在这些挑战,该模型的准确性和损失仍按预期执行,表明该模型适用于多类分类数据集。

  • 13:40:00 在本节中,讲师讨论如何通过预测和评估来评估训练好的多类分类模型。讲师解释说,预测是在将模型设置为评估模式、通过测试数据并获得原始 logits 作为结果后进行的。下一步是通过对 logits 调用 torch.softmax 将 logits 转换为预测概率。然后,通过对预测概率调用 torch.argmax 来获得预测标签。讲师通过绘制预测并将它们与实际数据进行比较来强调可视化预测的重要性。

  • 13:45:00 在本节中,讲师直观地评估多类分类模型并探索用于分离数据的线性和非线性函数。讲师还提到,大多数数据都需要线性和非线性函数进行分类,而 PyTorch 可以轻松地将这些函数添加到模型中。此外,本节还介绍了评估模型的重要性,并介绍了在处理具有不同数量值的类时作为重要指标的精度和召回率。

  • 13:50:00 在这一节中,讲师讨论了各种分类评估方法,包括准确率、精确率、召回率、F1 分数、混淆矩阵和分类报告。讲师解释说,虽然准确性是分类问题的默认指标,但它可能不是不平衡数据集的最佳指标。对于不平衡的数据集,应该使用精确率和召回率。精度由真阳性与真阳性加假阳性决定,而召回率由真阳性与真阳性加假阴性决定。讲师还注意到精确率和召回率之间的权衡,其中增加一个指标会降低另一个指标。还讨论了使用 torchmetrics 和 scikit-learn 库进行分类度量。

  • 13:55:00 在本节中,讲师展示了如何使用 torchmetrics 包在 PyTorch 中导入和使用预构建的指标函数。他们演示了如何安装 torchmetrics、导入精度指标,并使用它来计算多类模型的精度。但是,他们还警告说,在使用 torchmetrics 时,指标必须与数据位于同一设备上,使用与设备无关的代码。讲师提供了指向 torchmetrics 模块和课外文章的链接,以供进一步探索。他们还介绍了用于练习前面部分中涵盖的代码的练习和解决方案。

第 15 部分

  • 14:00:00 在本节中,讲师建议观众从何处获得 PyTorch 计算机视觉代码的帮助,包括跟随代码、使用 Google Colab 的文档字符串功能、在 Stack Overflow 或 PyTorch 文档中搜索代码,以及在 PyTorch 深度学习存储库的讨论选项卡上提问。本节还介绍了计算机视觉问题的示例,例如二元或多类分类问题,其中机器学习模型从不同的图像示例中学习模式以确定图像是牛排还是比萨饼,或者将图像分类为多个类别.

  • 14:05:00 在本节中,演讲者讨论了使用机器学习的计算机视觉的不同应用,例如图像问题的多类分类、对象检测和图像分割。演讲者提供了一个 Nutrify 示例,它使用机器学习从上传的图像中对多达 100 种不同的食物进行分类。演讲者还讨论了特斯拉如何使用计算机视觉通过 3 维向量空间和机器学习来规划其自动驾驶汽车的运动。演讲者指出,特斯拉使用 PyTorch,这与课程中教授的代码相同。

  • 14:10:00 在这部分视频中,讲师讨论了使用 PyTorch 创建用于多类图像分类的计算机视觉模型。讲师以食品照片识别技术 Nutrify 为例,解释了计算机视觉问题的典型输入和输出。输入包括表示图像的高度、宽度和颜色通道的张量。讲师还提到,对于流行的计算机视觉问题,现有算法可能已经存在,但如果需要,可以构建一个。 Nutrify 示例的期望输出是三个输出,每个食物类别一个。

  • 14:15:00 在本节中,视频解释了如何将机器学习模型用于图像分类,利用 PyTorch 和卷积神经网络 (CNN) 以数字方式表示信息并训练模型以识别数据中的模式。给出的示例是预测图像中的食物类型,例如寿司、牛排和比萨饼,使用 PyTorch 对信息进行编码,并使用 CNN 识别图像中的模式。该视频强调输入和输出形状将根据要解决的问题而变化,并且 CNN 通常是图像数据的最佳选择,尽管也可以使用其他模型。最后,该视频介绍了一个涉及时尚商品灰度图像的问题,该问题将用于进一步演示在本节中学到的相同原理。

  • 14:20:00 在本节中,讲师讨论了图像数据在 PyTorch 和其他深度学习库中的表示。这些库通常期望最后使用颜色通道,但 PyTorch 默认首先使用颜色通道表示图像数据。该视频解释了针对给定问题对齐模型的输入和输出形状的重要性。讲师概述了用于构建模型的 PyTorch 工作流程,包括使用转换和数据加载器准备数据、构建或选择预训练模型、选择优化器和损失函数、使用指标评估模型以及试验改进该模型。下一节将讨论卷积神经网络 (CNN) 的架构。

  • 14:25:00 在本节中,讲师讨论了典型的卷积神经网络 (CNN) 的架构。输入数据经过各种层,包括卷积层、激活层和池化层,直到它被转换为可以转换为类名的输出形状。讲师强调,堆叠 CNN 的方法几乎是无限的,并通过幻灯片演示了一种方法。然而,最好的学习方法是将其编写出来,并且讲师会指导用户使用 Google Colab 笔记本,他们可以在其中练习使用 PyTorch 和 TorchVision 库构建 CNN。讲师还提供其他资源,包括参考笔记本和 LearnPyTorch.io 中的 PyTorch 计算机视觉部分。

  • 14:30:00 在视频的这一部分,讲师介绍了不同领域的不同PyTorch库,突出了PyTorch在计算机视觉方面的实力。计算机视觉的主要库是 torch vision,它包含数据集、计算机视觉的预训练模型,以及将视觉数据处理为机器学习模型可用的数字的转换。讲师演示了导入 PyTorch、NN 和 torch vision,并介绍了转换模块,其中包含常见的图像转换,可以使用 compose 一起训练。 to_tensor 函数被引入作为将图像数据转换为张量格式的主要转换。

  • 14:35:00 在用于深度学习和机器学习的 PyTorch 课程的这一部分,讲师介绍了 PyTorch 中的基本计算机视觉库,包括 TorchVision、源自 TorchVision 的模块和 TorchUtils.data.dataset,这是基础数据集PyTorch 类。讲师还讨论了使用 Matplotlib 进行可视化的重要性,以及将图像转换为张量以用于模型的必要性。然后,讲师介绍了 FashionMNIST 数据集,它是对原始 MNIST 数据库的改进,以衣服的灰度图像为特色。该数据集将用于演示计算机视觉技术。讲师解释说,虽然认真的机器学习研究人员认为 MNIST 被过度使用并且不能代表现代计算机视觉任务,但 FashionMNIST 是一个有用的入门数据集。

  • 14:40:00 在本节中,讲师讨论如何从 TorchVision 库下载和使用数据集。他们提到了各种图像分类数据集,例如 Caltech101、CIFAR-100 和 CIFAR-10,以及如何使用 torchvision.datasets 模块下载它们。然后,讲师继续演示如何下载和使用 Fashion-MNIST 数据集,解释可应用于数据集的各种参数和转换。他们还提供示例代码来下载训练和测试数据集。

  • 14:45:00 在本节中,讲师解释了如何使用 PyTorch 的 torchvision.datasets 下载示例计算机视觉数据集,特别是 FashionMNIST 数据集。我们可以将数据存储在一个名为“data”的变量中,并使用 torchvision.transforms 将图像数据转换为张量。讲师还演示了如何检查训练和测试数据集的长度,查看训练示例的图像和标签,以及通过使用“.classes”和“.class_to_idx”等属性获取有关类名称的更多信息。最后,他们解释说标签没有形状,因为它只是一个整数。

  • 14:50:00 在本节中,讲师讨论了 Fashion MNIST 数据集的输入和输出形状,该数据集由不同类型服装的灰度图像组成。图像的输入形状为 NCHW 格式,其中批量大小设置为“无”,输出形状为 10。为了更好地理解数据,讲师使用 Matplotlib 可视化图像及其形状,但遇到了错误,因为数据格式与预期格式不匹配。本节强调了在使用机器学习模型时理解输入和输出形状和格式的重要性。

  • 14:55:00 在本节中,视频探讨了如何使用 PyTorch 和 Matplotlib 绘制和可视化图像数据。讲师演示了如何绘制单个图像并使用 image.squeeze() 删除额外的维度。接下来,他们使用固定的随机种子和 Matplotlib 的子图函数从数据集中绘制一组 16 张随机图像。讲师还展示了如何使用 cmap 属性或参数将绘图的颜色图更改为灰度图。然后,他们讨论了直观探索数据集的重要性,以便更好地理解数据并识别潜在问题,例如数据集中套头衫和衬衫之间的相似性。

第 16 部分

  • 15:00:00 在本节中,讲师解释了为计算机视觉模型准备数据的重要性以及如何使用 PyTorch 数据集和数据加载器进行准备。他还讨论了在对要分类为 10 个不同类别的 60,000 幅服装图像进行建模时对非线性的潜在需求,以及如何将数据集分成更小的批次可以提高计算效率。此准备工作的目标是创建一个 Python 可迭代对象,模型可以使用它来识别数据中的模式。

  • 15:05:00 在本节中,讲师从将 60,000 张图像的数据集分解为每批 32 张图像开始,解释了小批量的概念及其在深度学习中的普遍使用。使用小批量的两个主要原因是通过避免 GPU 内存限制使神经网络的计算效率更高,并为网络提供更多机会更新每个时期的梯度。使用 torch.utils.data 中的数据加载器对数据进行批处理,方法是向其传递一个数据集,定义批处理大小,并将 shuffle 设置为 true 以避免网络记住数据的顺序。讲师提供代码来创建训练和测试数据加载器,这些数据加载器将在训练循环中使用。

  • 15:10:00 在本节中,强调了小批量在深度学习问题中的重要性,并使用 PyTorch 解释了创建训练和测试数据加载器的过程。批量大小超参数设置为 32,数据集变成可迭代对象。使用DataLoader加载训练和测试数据集,训练数据和测试数据的batch size设置为32,训练数据的shuffle设置为True,测试数据的shuffle设置为False。探索了训练数据加载器的属性,例如批量大小和数据集。打印训练和测试数据加载器的长度以确定每个批次的数量。

  • 15:15:00 在本节中,讲师讨论如何使用 PyTorch 可视化批量图像。成绩单摘录显示了如何根据批量大小和训练样本数确定训练数据加载器的长度。然后,讲师展示如何使用随机性可视化一批中的单个图像,并检查与该样本关联的图像大小和标签。讲师强调,这些输入和输出形状会根据具体问题而有所不同,但基本前提保持不变——数据被分批传递给模型。

  • 15:20:00 本节视频讲师讲解如何批量可视化图像,并将数据转为数据加载器。他们还引入了基线模型的概念,该模型用作起点并且是一个简单的模型,以后可以通过实验对其进行改进。然后,讲师介绍了一个新层“展平”,它将连续范围的暗淡展平为张量以供顺序使用,并展示了如何将其用作独立模型。

  • 15:25:00 在本节中,我们将了解展平以及如何使用展平将多维数据转换为单个向量。打印展平前后的形状后,我们看到输出现在是一个长度为 1784 的一维向量。我们还看到这个过程类似于用于深度学习模型的特斯拉相机中的信息编码。然后,我们将看到如何在 PyTorch 模型的线性层中使用扁平化数据。该模型使用 nn.Sequential 定义,包括一个展平层和两个线性层。输入和输出形状已定义,我们看到第一个线性层的输出特征与第二个线性层的输入特征相匹配。

  • 15:30:00 在本节中,讲师解释了如何使用 PyTorch 创建一个简单的神经网络模型。该模型由一个平坦层和两个线性层组成,没有非线性。定义了模型的 forward 方法,它接受一个输入,将其传递通过扁平化层,然后通过两个线性层,并返回输出。然后,讲师设置模型的实例并执行虚拟前向传递以确保模型按预期工作。此外,他们还解释了每一层的输入和输出形状,以及如何安排它们以获得所需的输出形状。最后,他们展示了使用展平层的重要性,以及为什么需要将前一层的输出组合成一个向量。

  • 15:35:00 在本节中,讲师回顾了之前的视频,其中他们为计算机视觉问题创建了零模型,并重申了确保输入和输出形状与所需位置对齐的重要性。他们还解释说,权重和偏置矩阵代表图像中的不同特征,模型将通过深度学习和机器学习来学习这些特征。接下来,他们讨论了模型的损失函数、优化器和评估指标的选择,分别选择交叉熵损失、随机梯度下降优化器和精度评估指标。它们还提供了对用于分类评估指标的在线 PyTorch 资源的参考。

  • 15:40:00 在本节中,视频讲师讨论了在 Python 机器学习项目中使用辅助函数的概念。他提供了一个示例代码,用于导入包含常用函数的 Python 脚本,其中包括一个名为 accuracy 的辅助函数。 accuracy 函数计算准确度指标,讲师通过检查文档字符串演示可以成功导入。他还解释说,在 Python 项目中使用辅助函数可以节省大量时间和精力,尤其是在处理不需要每次都重写的通用功能时。最后,他设置了一个损失函数等于 nn 点交叉熵损失,以及优化器来训练模型。

  • 15:45:00 在本节中,讲师设置了随机梯度下降的优化器,并为 28x28 图像的简单数据集设置了相对较高的学习率 0.1。然后他们讨论了跟踪模型性能及其运行时间的重要性,因为两者之间通常需要权衡。他们继续演示如何使用 Python 中的时间模块创建一个函数来为模型的训练计时,并传入 torch.device 以比较模型在不同设备上的运行速度。

  • 15:50:00 在本节中,讲师讨论了计时功能对于衡量模型训练所需时间的重要性。他演示了如何使用 Python“计时器”模块创建计时器,并展示了如何将其整合到训练过程中。讲师还解释了如何使用 Google Colab 的重新连接功能,并提供了有关使用数据加载器将数据分成批次进行训练的提醒。然后,他概述了创建训练循环和在批量数据上训练模型所涉及的步骤,强调需要遍历时期和批次、执行训练步骤并计算每批次的训练损失。最后,他提到模型将在与训练相同的步骤中进行评估。

  • 15:55:00 在本节中,讲师通过导入 TQDM 的进度条开始测试阶段,该进度条将指示训练循环已经经历了多少个时期。 TQDM是一个开销小的Python进度条,是开源软件。由于 TQDM 如此流行,它被内置到 Google CoLab 中。讲师设置种子并启动计时器,然后将 epoch 数设置为 3,以加快训练时间以运行更多实验。他们创建一个训练和测试循环,实例化训练损失,并计算每个时期的训练损失。对数据进行批处理,增加一个循环,循环遍历训练批处理数据。

 

用于深度学习和机器学习的 PyTorch – 完整课程(第 17-22 部分的描述)


用于深度学习和机器学习的 PyTorch – 完整课程


第 17 部分

  • 16:00:00 在本节中,讲师为神经网络设置训练循环。将模型置于训练模式并执行前向传递以计算损失。训练损失值每批累积一次,优化器每批更新一次,而不是每个时期更新一次。讲师还打印出查看的样本和每个时期每个批次的平均训练损失以用于监控目的。此循环将继续,直到所有批次都已在训练数据加载器中处理。

  • 16:05:00 在本节中,讲师将介绍 PyTorch 中测试循环的代码,其中涉及设置测试损失变量并使用前向传播来评估在训练数据上学习到的模式。测试的准确度也使用下载的准确度函数计算,测试损失和测试准确度值按批次累加,然后除以批次数以求出每个时期的平均值。然后打印出这些值以跟踪模型的进度。

  • 16:10:00 在本节中,讲师讨论了设置训练循环的最后步骤,包括打印训练损失、测试损失和测试准确度,以及计算训练时间。他们还针对在 PyTorch 中编码时可能出现的潜在错误提供故障排除提示。最后,他们演示了如何运行代码并显示训练循环的进度条。

  • 16:15:00 在本节中,讲师讨论了训练循环的结果,并介绍了基线精度和训练时间的概念。他强调,由于机器学习和所用硬件的固有随机性,数字可能会略有不同。然后,讲师通过创建一个函数来构建多个模型并稍后比较结果,从而继续评估模型。该函数接受一个模型、一个数据加载器、一个损失函数和一个精度函数,并返回一个字典,其中包含模型在数据加载器上的预测结果。他解释说,该功能类似于测试循环,但功能化后可与多个模型和数据加载器一起使用。讲师还提到以下部分将涵盖在 GPU 和卷积神经网络上进行预测和评估模型。

  • 16:20:00 在本节中,视频创作者展示了如何使损失函数和准确性函数具有通用性,以便它可以与任何模型和数据加载器一起使用。他们演示了如何累积每批次的损失和准确度值,缩放它们以找到每批次的平均损失/准确度,并以字典格式返回结果。他们还展示了如何使用之前定义的函数创建一个新函数来计算模型在测试数据集上的结果。最后,他们使用进度条来跟踪模型在测试数据集上的性能。

  • 16:25:00 在用于深度学习和机器学习的 PyTorch 课程的这一部分,讲师讨论了如何设置与设备无关的代码以在 CPU 和 GPU 上训练模型。他们演示了检查 CUDA 的可用性并切换到 GPU 以利用其处理能力。讲师还建议先从较小的数据集和模型开始,然后再增加复杂性和规模。最后,他们建议为数据集构建一个新模型,并在 GPU 上运行时测试其在有无非线性条件下的性能。
     
  • 16:30:00 在本节中,讲师介绍了神经网络中非线性的概念,并鼓励观众尝试创建具有非线性函数的模型。讨论了非线性对非线性数据建模的好处,讲师解释了如何使用 PyTorch 实现具有线性和非线性层的神经网络。他们逐步浏览代码,并强调实验对于为给定数据集找到最佳模型的重要性。

  • 16:35:00 在本节中,讲师讨论了使用线性和非线性函数自定义神经网络,并演示了将两个 ReLU 激活函数添加到先前定义的网络中。然后重写 forward 方法以允许输入通过层堆栈,并在设备上实例化模型。然后视频继续为新模型创建损失函数、优化器和评估指标,该模型添加了非线性层,强调了运行实验以了解不同函数如何影响神经网络的重要性。

  • 16:40:00 在本节中,演讲者讨论了在 PyTorch 中创建辅助函数以及函数化训练和评估循环。他们提到导入精度函数并设置损失函数以及优化器。下一步是将训练和评估循环构建为函数,以便可以重复调用它们而不会出错。演讲者介绍了创建训练步函数的过程,该过程需要模型、数据加载器、损失函数、优化器以及可选的精度函数和目标设备作为输入。 train step 函数循环通过数据加载器,执行前向传递,计算损失,反向传播,并使用优化器更新模型参数。

  • 16:45:00 在本节中,演示者解释了如何在 PyTorch 中执行训练步骤。他们首先定义函数的输入,包括模型、数据加载器、损失函数、优化器和设备。然后,他们遍历函数的每一行,从数据加载器的循环开始,并将数据放在目标设备上。他们还添加了一个准确度函数来累积每批次的准确度分数。最后,在训练步骤结束时,他们计算每批次的平均损失和准确度,并打印出结果。总体而言,本节对如何使用 PyTorch 进行深度学习和机器学习提供了清晰简洁的说明。

  • 16:50:00 在本节中,培训师通过创建一个将模型、数据加载器、损失函数、精度函数和设备作为输入的测试步骤函数来实现测试循环的功能化。培训师演示了如何设置测试损失和准确性,并在循环数据加载器和执行前向传递之前将模型置于评估模式。培训师还解释了使用推理模式上下文管理器和创建与设备无关的代码的重要性。通过传入 X 来计算测试 pred,测试损失和准确度是使用各自的函数按批次累积的。最后,训练器通过取 argmax 将输出的 logits 转换为预测标签。
     
  • 16:55:00 在 PyTorch 完整课程的这一部分中,讲师演示了如何使用训练步骤和测试步骤函数创建测试步骤函数以及优化和评估循环。新函数用于训练模型并评估其三个时期的准确性。讲师还展示了如何测量模型在 GPU 和 CPU 上运行所花费的时间。

第 18 部分

  • 17:00:00 在本节中,讲师将带领我们为深度学习模型设置测试步骤,并创建一个计时器来测量训练时间。该代码简单高效,因为它被设计为可在未来的项目中重复使用。此外,我们运行了第二个建模实验,并将结果与使用非线性层的第一个模型进行了比较。虽然第二个模型在训练时间上稍微快一些,但它并没有产生比前一个更好的结果,这意味着你的数字可能与教练的数字不一样,但方向应该非常相似。最后,讲师解释说我们的模型并不太复杂,我们的数据集也不是很大,所以这可以解释为什么 CPU 和 GPU 训练时间没有显着差异。

  • 17:05:00 在本节中,讲师解释了有时模型在 CPU 上的训练速度比在 GPU 上的训练速度更快。造成这种情况的两个主要原因是,将数据/模型复制到 GPU 或从 GPU 复制数据/模型的开销超过了 GPU 提供的计算优势,并且所使用的硬件在计算能力方面具有比 GPU 更好的 CPU。但是,讲师指出,这种情况不太常见,而且一般来说,现代 GPU 在计算深度学习算法方面比通用 CPU 更快。接下来,讲师分享了一个资源,其中讨论了如何通过优化带宽和开销成本等来加快深度学习。最后,讲师为模型一创建结果字典,以便稍后比较建模结果。

  • 17:10:00 在本节中,讲师讨论了深度学习模型中可能发生的关于数据和模型之间的设备不匹配的常见错误。他解释说,错误的发生是因为数据和模型位于不同的设备上,并建议通过使代码与设备无关来进行修复。他还警告说,创建与设备无关的代码总是更好。最后,讲师介绍了下一个建模实验,其中涉及构建卷积神经网络 (CNN) 并解释了典型 CNN 的架构。

  • 17:15:00 在本节中,讲师解释了简单卷积神经网络 (CNN) 中不同类型的层。 CNN 从输入开始,预处理为图像的红色、绿色和蓝色张量。然后输入通过卷积层、relu 层和池化层的组合。深度学习模型可以添加更多层以在数据中发现更多模式,每一层对数据执行不同的数学运算组合。讲师使用 CNN 解释器网站演示 CNN,其中不同图像的输入通过不同的层,最终输出为具有最高值的类。

  • 17:20:00 在本节中,讲师解释了卷积神经网络的工作原理以及深度学习的美妙之处。网络的每一层都旨在学习数据的不同特征,网络本身会找出学习这些特征的最佳方式。讲师随后介绍了 CNN 解释器网站作为学习更多关于卷积神经网络的资源,同时也鼓励
    学习者加入以 PyTorch 代码复制神经网络。然后,讲师继续在 PyTorch 中构建一个微型 VGG 卷积神经网络,并解释说研究论文的作者可以命名新的模型架构,以便于将来参考。代码使用输入形状、隐藏单元和输出形状进行初始化,这些是构建 PyTorch 模型的典型参数。

  • 17:25:00 在本节中,讲师解释了如何使用 PyTorch 中的块(通常称为卷积块)创建神经网络。这些块由多个层组成,整体架构由多个块组成。讲师展示了如何通过编写两个带有超参数(例如输入和输出通道、内核大小、步幅和填充)的层示例来创建卷积块。讲师还为学习者提供交互式资源以了解超参数的基础知识,并鼓励他们学习它。

  • 17:30:00 在本节中,讲师将介绍使用 PyTorch 构建深度学习模型的代码,特别关注卷积块层。该模型接收 2D 图像数据,层用于学习输入数据的压缩表示,最大池化用于获取输入数据的最大值。代码被分解成两个块,然后添加一个输出层。最后一层的输入在通过最后一个线性层创建最终输出之前被展平。

  • 17:35:00 在本节中,讲师为名为 tiny VGG 的卷积神经网络 (CNN) 构建分类器层,该网络有两层充当特征提取器,最后一层将这些特征分类为目标类别。讲师使用顺序对分类器层进行编码,并传入展平层以将前两个层的输出展平为单个特征向量。然后将特征向量传递给 nn.linear 层,该层根据隐藏单元的数量计算输入特征,并根据类的长度计算输出特征。最后,导师设置forward方法,打印出X点形状来跟踪每一层的形状变化。教师为 CNN 模型建立输入形状,该模型只有一个用于黑白图像的颜色通道,为每一层设置隐藏单元值,并通过实例化模型完成。

  • 17:40:00 在视频的这一部分中,讲师通过他们在上一节中编写的代码来使用 PyTorch 创建卷积神经网络。他们识别并纠正了代码中的一些拼写错误,并解释说 maxpool2d 层没有任何可学习的参数。然后他们介绍了 conv2d 层,并解释说它的权重张量和偏置值会操纵输入以产生输出。他们展示了如何使用 PyTorch 中的虚拟输入重现 CNN 解释器网站的第一层,并提供了指向 PyTorch 文档的链接以供进一步阅读。他们还演示了如何首先使用带有颜色通道的 PyTorch 样式创建批量图像。

  • 17:45:00 在本节中,视频教程探讨了 PyTorch 模型的组成以及卷积在实践中的工作原理。讲师解释了由随机数组成的模型如何使用 comp2d 层调整这些层以最好地表示数据。在通过这些层之一传递一些随机数据后,本教程深入探讨内核大小以及它如何确定卷积执行的操作。讲师详细阐述了卷积层的目的,即确保该内核能够正确执行操作以提供正确的输出。

  • 17:50:00 在本节中,讲师解释了在 PyTorch 的卷积层中更改步幅和填充值的效果。步幅值为 1 意味着卷积一次跳跃一个像素,而步幅值为 2 一次跳跃两个像素,导致输出大小减小。同时,在图像的边缘添加填充允许内核对边缘处的图像信息进行操作。讲师还指出,当不确定为不同参数设置什么值时,通常会复制现有值并根据需要进行调整。本节最后演示了如何向测试图像添加批量维度并将其传递给 PyTorch 中的卷积层。

  • 17:55:00 在本节中,视频介绍了 PyTorch 中用于深度学习和机器学习的卷积层和最大池化层。该视频演示了如何使用 PyTorch 通过将测试图像传递到卷积层以生成输出来创建卷积层。通过使用内核大小、步幅和填充的值,用户可以观察输出大小如何变化。该视频还介绍了最大池化层,并展示了如何创建内核大小为 2 的样本最大池化层。

第 19 部分

  • 18:00:00 在本节中,讲师演示了如何在 PyTorch 中通过卷积层和最大池化层传递数据。他们首先将测试图像先通过转换层,然后打印出形状。然后他们将 conv 层的输出传递给最大池化层,并再次打印出结果形状。导师解释说max pool层取一定范围内张量的最大值,减少卷积层的输出尺寸。他们还演示了如果图层和参数的值发生变化,形状将如何变化。

  • 18:05:00 在本节中,讲师解释了卷积神经网络 (CNN) 中最大池化的概念。目标是将输入数据压缩成可用于未来预测的较小特征向量。最大池化涉及取输入数据特定部分的最大值以确定该区域中最重要的特征。讲师演示了改变内核大小对最大池的影响以及它如何影响特征空间。他们还提供了一个使用较小随机张量的可视化示例来展示最大池化的过程。总的来说,最大池化是一种有用的技术,可以降低数据维度,同时保持重要的预测特征。

  • 18:10:00 在课程的这一部分,讲师讨论了卷积神经网络中最大池化层的目的,即将从卷积层学习到的特征压缩到更小的空间中,最终导致压缩表示可用于进行预测的输入数据。讲师还要求观众创建一个虚拟张量并将其传递给他们在之前的视频中构建的微型 VGG 网络,以查看虚拟张量在穿过卷积块时的形状会发生什么变化。最后,讲师解释说,从其他地方复制模型并通过它传递数据的目的是深度学习中的常见做法。

  • 18:15:00 在本节中,讲师提供了 PyTorch 中前向传递的示例,并演示了如何处理形状不匹配错误。他们使用 Fashion MNIST 数据集中先前创建的图像,并创建与图像形状相同的张量。但是,由于张量具有批量大小的额外维度,它们会出错。为了解决这个问题,他们在零维处取消压缩张量以添加批量维。他们还确保张量与模型位于同一台设备上,并演示如何排除故障并找到模型不同层所需的形状。本节最后讲师使用收集到的有关形状的信息重新创建模型。

  • 18:20:00 在视频的这一部分,讲师演示了调试神经网络模型中层形状的技巧。通过将虚拟数据传递给模型并在每一层打印输出的形状,教师能够确定形状不匹配发生的位置并识别分类器层的问题。然后,讲师展示了如何手动计算卷积层的输入和输出形状,同时还断言了使用代码执行这些计算的好处。最后,讲师使用技巧确保模型与矩阵乘法规则兼容,并确认模型可以处理具有所需形状的数据。

  • 18:25:00 在本节中,讲师讨论了他们构建的模型中每一层的输入和输出形状。他们通过模型传递一个随机张量并获得 1 和 10 的输出形状,因为他们的数据集中有 10 个类。然后,他们继续为他们的第二个模型设置损失函数和优化器,并解释他们将如何训练他们的第一个卷积神经网络 (CNN)。他们导入一个精度函数,设置一个交叉熵损失函数,并保持优化器与之前相同,即 SGD 中的 torch.opt。然后,他们演示了如何使用训练步骤和测试步骤函数来训练模型二,他们将在下一个视频中详细介绍。最后,他们通过使用模型执行训练步骤并尝试在数据加载器上学习来设置训练和测试功能。

  • 18:30:00 在本节中,视频着重于训练卷积神经网络并使用 TQDM 测量训练它所花费的时间来衡量进度。他们设置了精度函数、损失函数、优化器、训练数据加载器和测试数据加载器。他们还测量结束时间以了解代码运行了多长时间。他们在打印输出时遇到了代码问题,但修复了它并成功训练了他们的第一个 CNN,在大约 42 秒内达到了 88.5% 的测试准确率。该视频建议注意,性能更好的模型通常需要更长的训练时间。

  • 18:35:00 在本节中,讲师讨论了在机器学习实验中比较不同模型的结果和训练时间的重要性。他们引入了三个模型结果字典,并使用 pandas 创建了一个数据框来比较每个模型的准确性、损失和训练时间。他们发现卷积神经网络(模型 2)以 88% 的准确率优于其他模型,并鼓励观众尝试不同的模型架构、超参数和训练时间以获得更好的结果。讲师强调了在实际应用中考虑模型性能和速度之间权衡的重要性。

  • 18:40:00 在本节中,讲师讨论使用数据框和图表比较上一节中进行的三个实验的结果。比较了每个模型的训练时间和准确度,讲师指出训练时间会因所使用的硬件而异。表现最好的模型是卷积神经网络,但它的训练时间最长。讲师建议尝试使用性能最佳的模型对测试数据集中的随机样本进行预测。

  • 18:45:00 在本节中,讲师讨论如何创建一个名为“做出预测”的函数来评估经过训练的机器学习模型。该函数接受手电筒和终端模块类型模型、一些数据和设备类型。目标是从测试数据集中随机抽取样本,使用模型对其进行预测,并将预测可视化。该函数通过解压缩样本并将其传递给目标设备来准备样本。然后它对模型进行前向传递以获得原始 logits 并应用 softmax 激活函数来获得预测概率。最后,将预测概率转化为预测标签,并将与特定样本相关的预测概率列表堆叠起来,将列表转化为张量。本节以使用测试示例演示功能的实际操作作为结尾。

  • 18:50:00 在本节中,讲师解释了如何随机抽取测试数据并创建测试标签来评估模型的预测。测试数据尚未转换为数据加载器,代码会随机抽取 9 个测试数据样本。讲师强调了对随机测试数据样本进行预测的重要性,即使在训练模型以了解模型的性能之后也是如此。讲师还讨论了如何使用 argmax 将预测概率转换为预测标签,以获取概率中最高值的索引。

  • 18:55:00 在本节中,讲师编写代码来绘制随机样本的预测和图像。该代码创建了一个三行三列的 Matplotlib 图,并枚举了测试样本中的每个样本。对于每个样本,都会创建一个子图并绘制目标图像。预测标签和真值标签也被找到并使用类名和预测类和测试标签索引转换为文本形式。最后,为绘图创建一个标题,如果预测标签等于真值标签,标题文本的颜色变为绿色,如果不相等,则变为红色。

第 20 部分

  • 19:00:00 在本节中,演示者讨论了可视化机器学习模型预测的重要性,并展示了如何绘制经过训练的卷积神经网络 (CNN) 对从测试数据集中随机选择的样本的预测。演示者演示了如何使用预测标签和真实标签绘制图像,并根据预测是否正确更改标题文本的颜色。通过分析预测,演示者展示了标签类别之间的潜在混淆,并建议可视化预测可以提供改进标签或模型本身的见解。然后,演示者介绍了混淆矩阵的概念,作为通过比较大量测试样本的预测标签和真实标签来评估模型性能的另一种方法。

  • 19:05:00 在本节中,讲师讨论如何在 PyTorch 中使用混淆矩阵评估多类分类模型。混淆矩阵是一种可视化表示,显示模型在不同类别上的性能。讲师解释了如何将火炬指标用于评估指标,并展示了如何访问混淆矩阵评估指标。此外,ML 扩展用于绘制混淆矩阵。重要的是,讲师解释说 Google Colab 没有所需的 ML extend 版本,需要 0.19.0 版本以确保正确安装软件包。最后,该视频展示了如何跨测试数据集进行预测,以及如何将模型设置为使用 torch 推理模式作为上下文管理器的评估模式。

  • 19:10:00 在本节中,讲师演示了如何使用 PyTorch 迭代测试数据加载器以进行预测。预测被附加到一个列表中,然后使用 torch.cat 连接成一个张量。生成的张量对每个测试样本有一个预测。讲师还安装了 torch 指标并展示了如何使用尝试和接受循环来导入它。最后,使用 assert 语句检查所需的 ML extend 版本以用于绘图混淆矩阵函数。

  • 19:15:00 本节讲师以安装torch metrics和升级ML extend到0.19.0或以上版本为例,讲解如何在Google Colab中安装和升级包。讲师将逐步介绍代码并解释如何检查安装是否顺利,以及如果在此过程中出现任何错误该怎么办,包括如何在必要时重新启动运行时。安装完成后,讲师将继续解释如何使用在上一个视频中对整个测试数据集所做的预测来创建混淆矩阵。

  • 19:20:00 在本节中,讲师解释了如何创建和绘制混淆矩阵来评估深度学习模型的性能。首先,导入来自 torch metrics 的混淆矩阵类和来自 ML extend 的 plot 混淆矩阵函数。然后,通过将类的数量作为类名称列表的长度来设置混淆矩阵实例。混淆矩阵张量是通过传递测试数据集上的预测和目标来创建的。最后,通过传入混淆矩阵张量和类名称列表,使用 plot 混淆矩阵函数绘制混淆矩阵,创建一个视觉上令人愉悦的对角线,显示正确的预测以及模型出错的潜在区域。

  • 19:25:00 在本节中,讲师解释了使用混淆矩阵直观地评估分类模型预测的重要性,尤其是当模型所犯的错误很大时,例如混淆两个看起来相似的数据类,如衬衫和大衣。使用混淆矩阵是评估模型性能的有效方法,可以帮助识别现有标签的任何问题。他还谈到了保存和加载经过训练的模型的重要性,尤其是当模型的性能令人满意时。通过将模型保存到文件,它可以在别处使用或重新加载以确保它已正确保存。讲师将介绍如何创建模型目录路径和模型保存路径,然后展示如何使用 torch.save 方法保存模型状态字典。

  • 19:30:00 在本节中,讲师演示了如何保存和加载 PyTorch 模型。保存状态字典,表示模型训练后所有学习到的参数。要加载保存的模型,将创建一个新实例,其参数与原始实例相同。使用与原始模型相同的参数设置加载模型非常重要,以避免形状不匹配错误。然后评估加载的模型以确保它产生与原始模型相似的结果。讲师强调了在保存和加载模型后对其进行评估以确保模型已正确保存的重要性。

  • 19:35:00 在本节中,我们看到加载的模型在保存之前产生与先前训练的模型相同的结果,我们可以使用 torch.is_close 以编程方式检查模型结果是否彼此接近。可以调整绝对公差级别以确保结果足够相似,如果存在差异,建议检查模型是否正确保存并设置了随机种子。还讨论了计算机视觉问题的工作流程,从使用参考资料和库(如 torchvision)到评估模型以及试验非线性和卷积神经网络模型以找到最佳模型。

  • 19:40:00 在“PyTorch for Deep Learning & Machine Learning”这一部分中,讲师鼓励观众通过访问 learn pytorch.io 网站并完成提供的练习来练习到目前为止所学的知识。这些练习侧重于练习前面部分中涵盖的代码和概念,并且还为那些想要更深入地研究计算机视觉的人提供了额外的课程。此外,该部分还涵盖了 pytorch 自定义数据集的主题,并提供了在需要时获取帮助的资源,例如 pytorch 文档和堆栈溢出。

  • 19:45:00 在 PyTorch 课程的这一部分,讨论了如何使用自定义数据集,以及不同的领域库,例如 torch vision、torch text、torch audio 和 torch rec。域库包含针对不同数据源的数据加载功能,并带有内置数据集,例如用于预构建视觉数据集(如 Fashion MNIST)的火炬视觉数据集和自定义数据集。每个领域库还有一个“数据集”模块,可以帮助用户处理不同领域的不同数据集,并且根据您所从事的领域,例如视觉、文本、音频、推荐,建议查看其自定义库在 PyTorch 中。

  • 19:50:00 在本节中,讲师讨论如何将自定义数据集加载到 PyTorch 中以用于构建计算机视觉模型。他们将构建的模型称为食物视觉迷你,它将对比萨饼、寿司和牛排的图像进行分类。讲师介绍了训练模型所涉及的各个步骤,例如选择损失函数和优化器、构建训练循环以及评估模型。他们还解释了如何转换数据以与模型一起使用,并比较使用和不使用数据增强的模型。最后,他们展示了如何对自定义数据进行预测,并提供了用于访问 PyTorch 深度学习存储库中的视频笔记本的资源。

  • 19:55:00 在本节中,讲师将讨论通过自定义数据集将您自己的数据放入 PyTorch 的过程。他们强调了使用域库实现数据加载功能和可自定义数据加载功能的重要性,并针对视觉、文本、音频和推荐等各种类别给出了这些库的示例。讲师还演示了如何导入必要的库并设置与设备无关的代码以实现 PyTorch 的最佳实践。它们展示了如何检查可用的 CUDA 设备以及如何更改运行时类型以使用 GPU 进行更快的处理。最后,讲师提示获取数据以在下一个视频中使用。

第 21 部分

  • 20:00:00 在课程的这一部分,讲师介绍了 Food 101 数据集,该数据集包括 101 种不同的食物类别和 101,000 张图像。但是,为了练习使用 PyTorch,讲师创建了该数据集的一个较小子集,其中包括三个食物类别和仅 10% 的图像。这个较小的数据集有 750 个训练图像、250 个测试图像,以及每个类大约 75 个训练图像和 25 个测试图像。从这个较小的数据集开始,目标是加快实验速度并减少训练模型所需的时间。讲师提供有关如何创建此自定义数据集的笔记本,并鼓励学生从小处着手并根据需要进行升级。

  • 20:05:00 在本节中,讲师解释了为 PyTorch 下载和准备图像数据集的过程。数据集包括披萨、牛排和寿司的图像,这些图像存储在名为 data 的文件夹中。讲师使用Python requests库下载数据,然后解压到data文件夹中。本节的目的是演示如何将图像数据加载到 PyTorch 中,可以应用于任何类似的项目。讲师强调了拥有单独的数据目录的重要性,该目录可以位于本地计算机或云中。

  • 20:10:00 在本节中,讲师将介绍如何使用 Python 库 zipfile 从 zip 文件中提取数据。他们使用提取包含比萨饼、牛排和寿司图像的 zip 文件的示例来解决机器学习计算机视觉问题。讲师演示了如何使用 zipfile.extractall() 方法将 zip 文件的内容提取到特定文件路径。他们还解决了因从 GitHub 复制错误链接地址而导致的代码错误,强调了确保使用正确链接下载数据集的重要性。总的来说,显示的过程可用于下载和提取任何自定义数据集以在 PyTorch 中使用。下一个视频将进一步探索数据。

  • 20:15:00 在本节中,讲师讨论了通过数据准备和探索与数据融为一体的重要性。他分享了 Abraham 损失函数的虚构引用,强调需要花费大量时间准备数据集。然后,讲师遍历下载的样本数据的每个目录,这些数据采用标准图像分类格式。他使用操作系统的 dot walk 功能为每个目录生成一个目录树,显示每个目录中存在的目录和图像的信息。最后,讲师设置训练和测试部分,并为它们演示标准图像分类设置。

  • 20:20:00 在本节中,讲师解释了标准图像分类数据结构,其中整个数据集文件夹包含训练和测试文件夹,以及包含相应图像的类名子目录。讲师指出,存储特定类型数据的标准化方法可作为数据格式的参考。为了准备用于 PyTorch 的图像数据,需要编写代码将数据转换为张量。讲师强调了对狗和猫图像进行分类所需的数据格式,其中训练和测试图像目录包含各自的类文件夹。讲师还提到了对图像进行可视化的计划和实现此目的的代码,包括获取所有图像路径、选择随机图像路径、使用 Pathlib 模块获取图像类名称。

  • 20:25:00 在本节中,讲师解释了如何使用名为 Pillow 的 Python 图像库打开和操作图像。首先,他们生成特定文件夹内所有图像路径的列表,并使用 Python 的随机库从该列表中随机选择图像。然后他们打开并显示图像,同时还提取有关它的元数据。此外,讲师还概述了 Torch Vision 库的功能,包括加载和处理图像的方法。

  • 20:30:00 在本节中,讲师演示了如何使用 PIL 库处理图像以及如何打开和分析图像元数据。图像类是存储图像数据的目录名称,使用打印函数获取元数据。然后,讲师展示了数据集中的一些随机食物图像,包括比萨饼、寿司和牛排,并解释了随机可视化图像以熟悉数据集的重要性。讲师为观众提供了一个小挑战,即下一节使用 Matplotlib 可视化图像。

  • 20:35:00 在本节中,讲师展示了如何使用 matplotlib 绘制图像和数据,以及如何使用 NumPy 方法 NP 将图像转换为数组。强调理解数据形状的重要性,以防止形状不匹配问题。 pill 库和 matplotlib 的默认格式是颜色通道最后格式,但 PyTorch 默认为颜色通道优先格式。讲师还展示了如何可视化不同的图像并熟悉数据,以及如何通过将数据转换为 PyTorch 张量以与 PyTorch 一起使用来转换数据。

  • 20:40:00 在本节中,讲师讨论将目标数据转换为 PyTorch 张量以及创建 PyTorch 数据集和数据加载器的过程。使用 PyTorch 文档,讲师展示了如何使用图像文件夹模块创建数据集,并介绍了允许对数据应用特定转换的转换参数。然后,讲师演示如何为图像数据创建转换,将图像大小调整为 64x64 并在水平面上随机翻转它们,以人为地增加数据集的多样性。这是使用 transforms.compose 方法完成的,该方法将转换列表作为其参数。

  • 20:45:00 在本节中,讲师解释了如何使用 PyTorch 中的转换模块将图像转换为火炬张量。这是通过“transforms.ToTensor()”函数完成的,该函数将 PIL 图像或 NumPy 数组从颜色通道在 0 到 255 范围内的高度转换为形状颜色通道高度宽度在 0 到 255 范围内的火炬浮点张量1. 讲师建议尝试通过此转换传递数据,并展示如何使用“transforms.Resize()”函数更改图像形状。本节最后讨论了 torchvision 库中可用的各种转换,包括数据增强转换,以及即将推出的用于探索转换图像的可视化代码的预览。

  • 20:50:00 在本节中,讲师演示如何从路径中随机采样图像、加载和转换它们,然后使用 PyTorch 比较原始版本和转换后的版本。该代码使用随机种子函数为随机函数设置种子,并从图像路径列表中随机采样 k 个图像。然后,讲师使用 matplotlib 库创建一个单行 n 列的子图,以并排绘制原始图像和转换后的图像。转换后的图像需要更改其形状以适应 matplotlib 库的首选颜色通道格式。最后,代码设置原始图像和转换图像的标题,并将超级标题设置为图像的类名。

  • 20:55:00 在视频的这一部分中,讲师演示了如何使用转换来使用 PyTorch 为深度学习模型操作图像数据。教师将变换设置为等于数据变换,这意味着图像将被调整大小、随机水平翻转并转换为张量。他们还展示了如何使用置换函数通过交换轴的顺序来重新排列数据的形状。然后绘制图像以并排显示原始版本和转换后的版本,转换后的图像采用张量格式,非常适合与深度学习模型一起使用。讲师建议图像的大小是一个可以调整的超参数,并鼓励观众探索 PyTorch 中可用的各种变换。

第 22 部分

  • 21:00:00 在本节中,讲师解释了如何使用图像文件夹选项加载图像数据。他们使用 torch 视觉数据集模块来展示如何以通用图像分类格式加载数据。演示了预建数据集功能图像文件夹,然后可以使用它在转换的帮助下将所有自定义图像加载到张量中。然后讲师展示如何转换训练数据集并创建测试数据集,该数据集也将以与训练数据集相同的方式进行转换。最后,他们打印出创建的数据集。

  • 21:05:00 在本节中,讲师解释了如何使用 PyTorch 中的图像文件夹功能将图像加载到张量中并使用管道对其进行转换,然后可以将其与 PyTorch 模型一起使用。他们演示了如何访问和利用预建数据加载器附带的各种属性,例如获取类名作为列表或字典以及检查数据集的长度。此外,他们还展示了如何使用索引从训练数据集中可视化样本和标签。

  • 21:10:00 在课程的这一部分中,讲师演示了如何将图像数据集转换为张量格式,这是 PyTorch 的默认数据格式。他们使用比萨饼图像的示例,并展示如何获取其关联标签并将其转换为数字格式。然后他们打印出一些关于张量数据的重要信息,比如它的数据类型和形状,这对以后的故障排除很有用。最后,他们使用 matplotlib 绘制图像并将标题设置为类名,在本例中为比萨饼。他们鼓励学生尝试使用不同的图像并探索不同的变换。

  • 21:15:00 在视频的这一部分中,讲师讨论了在 PyTorch 中将加载的图像转换为数据加载器的过程。数据加载器可以帮助将数据集转换为可迭代对象,允许用户自定义批量大小并一次查看特定数量的图像。这很重要,因为如果一次加载所有图像,则存在内存不足的风险。因此,批处理图像有助于利用所有可用内存。讲师继续提供创建训练数据加载器的分步指南,还介绍了工作参数数量的概念,它决定了使用多少 CPU 内核来加载数据。

  • 21:20:00 在本节中,讲师讨论如何创建和自定义数据加载器以在 PyTorch 中训练和测试数据。他展示了如何初始化数据集并为数据加载器自定义超参数,例如批量大小和工作人员数量。讲师还演示了如何遍历加载程序并获取有关图像和标签形状的信息。本节最后总结了加载过程,并建议构建一个卷积神经网络来识别图像张量中的模式。

  • 21:25:00 在本节中,讲师讨论了创建自定义数据加载类以将图像数据加载为 Tensor 格式的过程。目标是通过此自定义类复制图像文件夹的功能,因为这是一种很好的做法,并且在不存在预建功能的情况下可能是必要的。讲师列出了自定义类加载图像、获取类名作为列表以及从数据集中获取类作为字典所需的步骤。还讨论了创建自定义数据集的优缺点,包括使用几乎任何东西创建数据集的灵活性,以及潜在的错误和性能问题。然后,教师导入必要的模块来创建自定义类,包括操作系统和路径库以使用文件系统。

  • 21:30:00 在本节中,我们将学习如何在 PyTorch 中创建自定义数据集,并专注于编写一个函数以从目标目录中获取类名。自定义数据集将用于从文件加载图像,从数据集中获取类名,以及从数据集中获取作为字典的类。该函数将使用操作系统扫描器遍历目标目录并获取类名,如果未找到类名,则会引发错误,表明目录结构存在问题。稍后我们将对 torch.utils.data.Dataset 进行子类化以创建自定义数据集。

  • 21:35:00 在视频的这一部分,讲师演示了如何创建一个名为“find_classes”的函数,该函数将目录作为字符串接收并返回类名列表和将类名映射为整数的字典。该函数利用操作系统扫描器扫描目标目录并获取类名。讲师还演示了在找不到类名时如何引发错误。该函数可用于任何给定目录,它复制了之前为训练目录完成的功能。

  • 21:40:00 在视频的这一部分,讲师解释了如何通过对 torch.utils.data.dataset 进行子类化来创建自定义数据集。数据集应该表示从键到数据样本的映射,其中键指的是目标或标签,在这种情况下数据样本是食物图像。子类应该覆盖 get item 方法,该方法为给定键获取数据样本,并可选择覆盖 len 方法以返回数据集的大小。讲师将逐步介绍构建自定义数据集的步骤,并解释如何使用我们在上一节中创建的辅助函数将类名映射到整数。

  • 21:45:00 在本节中,讲师解释了如何在 PyTorch 中创建自定义数据集。为此,我们需要子类化 torch.utils.data.Dataset 类并通过传递目标目录(数据所在的位置)和转换(以执行任何数据转换)来初始化我们的自定义数据集。此外,我们需要为 ID X 创建几个属性,例如路径、转换、类和类。此外,我们需要创建一个函数来加载图像,重写 LAN 方法以返回数据集的长度,以及获取item 方法在传递索引时返回给定的样本。最后,我们通过实现 pathlib 并传递目标目录(如测试或训练目录)来编写自定义数据集。

  • 21:50:00 在本节中,讲师解释了创建自定义 PyTorch 数据集类所涉及的不同步骤。第一步涉及获取所有遵循正确文件名约定的图像路径。下一步是创建一组可选的图像变换。还创建了一个加载图像的函数,它接受一个索引并返回一个图像。然后讲师演示如何覆盖“len”方法以返回数据集中的样本总数,这是可选的。最后,“get item”方法被覆盖,以便在传递索引时返回特定样本。

  • 21:55:00 在本节中,我们将了解子类化 torch.utils.data.Dataset 以自定义在 PyTorch 中加载数据的方式。该类使用根目录和将类名映射到索引的字典进行初始化。 __len__ 方法返回数据集的长度,而 __getitem__ 允许对数据集进行索引以返回火炬张量图像的元组和相应的整数标签。该类还有一个可选的转换参数,用于在返回元组之前对图像应用转换。子类化 torch.utils.data.Dataset 的优点是它提供的自定义功能,但它需要编写大量可能容易出错的代码。
 

用于深度学习和机器学习的 PyTorch – 完整课程(第 23-26 部分的描述)


用于深度学习和机器学习的 PyTorch – 完整课程

第 23 部分

  • 22:00:00 在本节中,讲师展示了如何使用 Torchvision 模块在 PyTorch 中创建自定义数据集。他们创建了一个将原始 JPEG 图像转换为张量的转换,并设置了训练和测试转换组合。然后他们测试自定义图像文件夹类,看看它是否适用于他们自己的自定义数据集。他们检查长度和类属性以确保其正常工作。最后,他们检查训练数据定制和测试数据定制,以验证一切是否按预期工作。

  • 22:05:00 在 PyTorch for Deep Learning and Machine Learning 完整课程的这一部分中,讲师演示了如何通过将类与 ID 进行比较来检查原始图像文件夹数据集和他在上一节中创建的自定义数据集之间的相等性两个数据集的 X。他确认我们可以通过创建我们自己的自定义数据集加载函数来复制图像文件夹数据集类的主要功能,从中得出的结论是 PyTorch 提供了一个可继承的基数据集类,只要我们覆盖土地和获取项目方法并返回某种值,我们可以创建自己的数据集加载函数。讲师继续解释如何创建一个函数来显示来自训练数据自定义类的随机图像,以可视化我们的数据。

  • 22:10:00 在本节中,讲师将逐步介绍创建名为“显示随机图像”的函数的步骤,该函数将“数据集”、“类”和“n”作为参数。该函数显示从数据集中随机选择的 n 个图像,如果“显示形状”设置为真,则打印出其形状。讲师还介绍了实施细节,例如在 n 大于 10 时调整显示以及设置随机种子以实现再现性。此外,该函数循环遍历随机样本图像或索引,并使用 Matplotlib 绘制它们。

  • 22:15:00 在本节中,讲师继续在 PyTorch 中构建深度学习模型,方法是设置绘图并确保图像的尺寸与 matplotlib 一致。他们调整了用于绘图的张量维度,将子图添加到他们的 matplotlib 图中,并根据类变量(类列表)调整图的标题。然后他们创建一个函数来显示图像文件夹中的随机图像,包括内置的 pytorch 图像文件夹和教师创建的自定义数据集。最后,他们调整种子并绘制图像,看看他们调整绘图的代码是否有意义。

  • 22:20:00 在成绩单的这一部分,讲师演示了如何将自定义加载的图像数据集转换为数据加载器,这是对图像进行批处理并将其与模型一起使用的必要步骤。使用 torchvision.datasets.ImageFolder 和 torchvision.transforms,将自定义数据集转换为张量格式。下一步是使用 torch.utils.data.DataLoader 将数据集转换为数据加载器。对于训练数据加载程序自定义和测试数据加载程序自定义,讲师将批量大小设置为 32,将工作人员数设置为 0。它们之间的区别在于训练数据会被打乱,而测试数据不会被打乱。

  • 22:25:00 在本节中,视频介绍了自定义数据加载器和 PyTorch 中的数据转换。讲师首先重置 OOS CPU 计数并将麻木的工作人员设置为零,以确保培训顺利进行。设置自定义数据加载器后,他使用打印功能检查图像形状和批处理大小,这些数据由先前设置的转换设置为 32。讲师还解释了数据增强如何人为地增加训练数据集的多样性,并演示了使用 torch 视觉转换模块转换数据的各种方式,包括调整大小、中心裁剪、灰度、随机转换和随机增强.

  • 22:30:00 了解了数据增强,这是通过应用各种图像变换人为地为训练数据添加多样性的过程。这有助于使模型更适用于未见过的数据。有许多不同类型的数据增强,例如裁剪、替换、剪切等。 PyTorch 有一个 torch 视觉包,其中包含可以帮助训练模型以使其表现良好的原语或函数。通过使用数据增强和其他改进,PyTorch 已经能够以高精度训练最先进的模型,例如 ResNet 50 模型。

  • 22:35:00 在本节中,讲师讨论了提高模型准确性的方法,例如学习率优化、更长时间的训练以及使用不同的增强技术。讲师侧重于简单的增强技术,该技术利用随机性的力量使用多个幅度箱以各种方式更改图像。讲师演示了如何使用 PyTorch 火炬视觉转换库实现简单的增强,并为有兴趣阅读更多相关信息的人提供了指向该论文的链接。此外,讲师建议尝试不同的增强技术和实验,看看哪种方法最适合个别问题。最后,讲师展示了如何通过获取所有图像路径并对匹配特定模式的所有文件和文件夹进行通配来测试增强管道。

  • 22:40:00 在本节中,视频演示了使用 trivial augment(一种数据增强技术)来转换图像以人为地向训练数据集添加多样性。通过从不同的增强类型中进行选择并以不同的强度级别应用它们,可以利用随机性的力量。本节展示如何将普通增强应用到随机变换的图像,并显示结果。目的是使机器学习模型能够学习操纵图像的模式,并能够相应地识别它们。下一节重点介绍使用微型 VGG 架构构建第一个没有数据增强的计算机视觉模型。

  • 22:45:00 在本节中,演示者将完成为 PyTorch 模型创建转换和加载数据的过程。目标是从数据文件夹加载图像,在本例中为比萨饼、牛排和寿司,并将它们转换为张量。转换包括将图像大小调整为 64x64 并将它们转换为张量,使值介于 0 和 1 之间。演示者还解释了如何创建数据加载器以及调整批处理大小和专用于加载数据的 CPU 内核数量。本例中使用的批量大小为 32。

  • 22:50:00 在本节中,讲师解释了如何使用 PyTorch 的 DataLoader 加载和转换数据。该过程涉及创建转换,然后使用 DataLoader 函数同时加载和转换数据。讲师还提供了用于从头构建 Tiny VGG 架构的简单代码,其中包括创建第一个由 COM、ReLU、MaxPool 和 ComToD 等层组成的 COM 块。该模型使用输入形状、隐藏单元和输出形状参数进行初始化。讲师鼓励学习者尝试使用不同的超参数值(例如内核大小和步幅)。

  • 22:55:00 在本节中,我们将看到使用 PyTorch 创建卷积神经网络。我们首先为网络定义卷积块和最大池化层。然后,我们复制相同的块以创建另一个块并更改输入形状以匹配输出形状。之后,我们创建一个分类器层,将卷积块的输出转换为特征向量,并将其传递给线性层以输出十个类别。最后,我们覆盖 forward 方法以通过卷积块传递数据并在每一步打印出它的形状。还可以重写前向方法以包括运算符融合,从而加速 GPU 计算。

第 24 部分

  • 23:00:00 在本节中,讲师讨论运算符融合的概念,这是深度学习编译器中最重要的优化。他们还使用微型 VGG 架构为 RGB 彩色图像创建了一个模型,并检查其输入和输出形状。讲师强调了使用运算符融合通过避免内存和计算之间的传输来加速大型神经网络计算的重要性。他们还建议通过模型传递虚拟数据以对其进行故障排除并确保前向方法正常工作。最后,由于输入类型不匹配,尝试将图像批次传递给模型时会显示一条错误消息。

  • 23:05:00 在本节中,讲师正在解决模型的形状错误。他们解释说,当张量通过线性层时,需要满足矩阵乘法规则。教师调查矩阵形状并确定代表隐藏单元数量的 10 在乘以 2560 时会导致问题。他们使用前一层的输出形状来确定 10 应该乘以 16x16 得到 2560。更正后并验证模型的形状与 CNN 解释器的输出对齐后,他们继续进行进一步的故障排除,并最终发现从卷积层中移除填充将使形状与 CNN 解释器的输出对齐。

  • 23:10:00 在本节中,讲师介绍了 Torch Info,这是一个允许用户打印其 PyTorch 模型摘要的包。首先,讲师注释掉 forward 方法中的打印语句,并使用 pip install 命令在 Google CoLab 中安装 Torch Info。然后,讲师从 Torch Info 导入摘要,并使用它传入模型和输入大小,以获取流经模型的数据的形状。讲师展示了 Torch Info 如何打印出模型的摘要,包括层及其相应的形状。

  • 23:15:00 在本节中,演讲者讨论了 torch 信息包,它用于提供 PyTorch 模型中每一层的输入和输出形状的概念。他们解释说,该软件包还提供了有关每一层中参数数量的信息,这有助于确定未来应用程序的模型大小和存储限制。演讲者指出,随着模型变得更大并具有更多层,它将具有更多参数,从而导致更大的输入大小和估计的总大小。在下一节中,演讲者转向训练自定义数据集,并创建两个函数——训练步骤和测试步骤——它们是通用的,几乎可以与任何模型和数据加载器一起使用。 train step 函数接受模型、数据加载器、损失函数和优化器,并在设置评估指标时将模型置于训练模式。

  • 23:20:00 在本节中,演讲者讨论了在 PyTorch 中为训练循环函数设置训练损失和训练精度值。使用数据加载器循环数据,并且对于每个批次,进行前向传递以进行预测并计算损失。然后使用优化器执行反向传播并采取步骤。训练循环完成后,通过获取预测类别并将其与正确标签进行比较来计算准确性。这是在批处理循环之外完成的,其中调整训练损失和训练精度以获得所有批次的每个时期的平均值。然后演讲者要求观众编写一个测试循环函数。

  • 23:25:00 在本节中,讲师将完成创建测试步骤的过程,以评估 PyTorch 深度学习模型在数据集上的性能。该步骤涉及在评估模式下设置模型、遍历数据集的批次、将数据发送到目标设备、进行前向传递、计算每批次的损失和准确度、累积损失和准确度以及调整指标得到平均值。然后,讲师建议创建一个训练函数来函数化训练模型的过程,这将在下一节中介绍。

  • 23:30:00 在本节中,讲师将逐步介绍创建结合训练步骤和测试步骤功能的训练功能的过程。这个想法是创建一个函数来调用这两个函数,以仅通过一个函数调用来训练和评估模型。训练函数接受一系列模型参数,包括优化器、数据加载器、损失函数等。然后,讲师创建一个空字典来帮助跟踪模型在训练时的性能,包括训练和测试损失和准确性。然后他们循环遍历 epoch,在模型训练时调用 TQDM 获取进度条。 train 函数是一个有用的工具,在训练更多模型和利用现有代码时不必重写代码。

  • 23:35:00 在本节中,讲师解释了分别使用训练和测试步骤功能跟踪训练和测试的训练功能。该函数将运行指定数量的 epoch,对于每个 epoch,它将使用花哨的打印语句打印出训练和测试损失和准确性。结果将存储在结果字典中,供以后分析使用。 train 函数将利用 train step 函数和 test step 函数分别更新模型和测试它。该函数将返回纪元的结果。

  • 23:40:00 在本节中,讲师回顾了 PyTorch 工作流程中取得的进展,包括数据准备、构建和选择模型、构建训练循环,以及现在创建损失函数和优化器的挑战。转到第 7.7 节,讲师将介绍如何在他们的自定义数据集上训练和评估模型零(基线模型)。他们为再现性设置随机种子,为彩色图像实例化具有三个输入形状的微型 VGG 模型,设置隐藏单元的数量和输出形状以匹配其训练数据集中的类别数量。他们还选择了多类分类的交叉熵损失函数,并尝试了学习率为 0.001 的 Adam 优化器。

  • 23:45:00 在本节中,讲师展示了如何对深度学习模型的训练过程进行计时。他们首先从 time 中导入默认定时器类,然后在使用之前视频中的 train 函数训练模型零之前启动定时器。然后他们将训练数据设置为简单训练数据加载器,将测试数据设置为简单测试数据加载器,并将优化器设置为 FriendlyAtomOptimizer,并将损失函数设置为 n 交叉熵损失。模型训练了五个 epoch,计时器结束以显示总训练时间。然后讲师展示模型在训练集和测试集上的准确率结果,分别在 40% 和 50% 左右。他们建议尝试不同的方法来改进模型,例如添加更多层或隐藏单元、拟合更长时间、改变激活函数以及调整学习率。

  • 23:50:00 在本节中,讲师解释了如何绘制损失曲线以跟踪模型随时间的进展。损失曲线是一种通过可视化左侧的损失值和底部轴上的步骤来跟踪模型随时间推移的进度的方法。通过使用 matplotlib 绘制我们结果字典的训练和测试损失和准确度值,我们可以看到我们的模型是如何执行和评估它的。讲师编写了一个名为“def plot loss curves”的函数,该函数接受一个结果字典,其中包含作为字符串和浮点数列表的损失和准确度值。

  • 23:55:00 在本节中,讲师展示了如何使用纪元作为时间度量来为训练和测试数据创建损失曲线。该图由两个子图组成,一个用于损失,另一个用于准确性,每个子图都有标签和标题。损失曲线的理想趋势是损失随时间减少,而准确性增加。讲师鼓励观众尝试额外的 epoch,看看损失是否达到最优值。下一个视频将介绍不同形式的损耗曲线,讲师推荐了一个解释损耗曲线的指南。

第 25 部分

  • 24:00:00 在 PyTorch for Deep Learning & Machine Learning 课程的这一部分,讲师讨论了损失曲线及其在评估模型随时间的性能方面的重要性。损失曲线应显示损失随时间减少和准确性增加的趋势。有不同形式的损失曲线,理想的损失曲线表明训练和测试损失以相似的速率减少。当模型的损失可能较低时会发生欠拟合,而当模型对训练数据的学习太好时会发生过度拟合,从而导致训练损失低于测试损失。讲师提供来自 Google 损失曲线指南的额外课程,并讨论解决过度拟合的方法,例如正则化技术和降低模型复杂性。

  • 24:05:00 本节讨论的几种减少深度学习模型过度拟合的方法。通过数据扩充或更好的数据质量获取更多数据可以帮助您的模型学习更通用的模式。通过采用从预训练模型中学习的模式并将其应用于您自己的数据集来使用迁移学习也很有效。通过减少层数或隐藏单元数来简化模型也有帮助。学习率衰减可以通过随时间降低学习率来提供帮助,提前停止可以在过度拟合发生之前停止训练过程。

  • 24:10:00 在本节中,将提前停止的概念作为一种处理机器学习中过度拟合的方法进行讨论。在测试误差开始增加之前,跟踪模型的测试误差,并停止模型训练或在模型损失最低的地方保存权重/模式。还探索了处理欠拟合的不同方法,例如向模型添加更多层/单元、调整学习率、更长时间的训练以及使用迁移学习。强调了过度拟合和欠拟合之间的平衡,并强调了使用损失曲线评估模型随时间变化的性能的重要性。最后,讨论了防止模型过度正则化和欠拟合的方法,并强调了在欠拟合和过拟合之间实现恰到好处的平衡的目标。

  • 24:15:00 在用于深度学习和机器学习的 PyTorch 视频的这一部分中,讲师讨论了模型中过度拟合和欠拟合的概念,以及处理它们的方法。数据增强是为处理过度拟合而引入的方法之一,其中对图像进行操作以增加训练数据集的多样性。然后,讲师继续演示如何使用数据增强创建转换并使用这些转换加载数据以创建训练和测试数据集以及数据加载器。该视频强调了通过各种调整和转换尝试不同模型以找到最适合特定问题的模型的重要性。

  • 24:20:00 在视频的这一部分中,讲师介绍了使用 PyTorch 转换和 ImageFolder 类创建数据集和数据加载器的过程。他们提供代码示例,并鼓励观众根据需要自行测试。数据集是根据训练文件夹和测试文件夹的比萨饼、牛排和寿司的图像创建的。讲师还讨论了在整个笔记本中使用相似名称时清楚变量名称的重要性。他们为训练和测试数据集设置了数据加载器,训练数据集通过简单的扩充宽函数进行了扩充。然后,讲师建议观众使用微型 VGG 类和训练函数构建和训练模型 1。

  • 24:25:00 在 PyTorch 完整课程的这一部分,讲师将指导观众使用与以前相同的架构创建和训练新模型,但使用增强的训练数据。目标是将该模型的性能与没有数据增强的基线模型进行比较。讲师使用之前为微型 VGG 模型创建的类,并设置手动种子以实现可重复性。然后他们定义损失函数和优化器,设置超参数,并启动计时器。最后,讲师通过调用先前创建的训练函数、传入模型和数据加载器并评估结果来训练模型。

  • 24:30:00 在本节中,讲师继续使用数据增强训练第二个模型,并表明它的性能不如没有数据增强的第一个模型,因为损失已经下降并且没有太多过度拟合。然后,讲师介绍一个函数来绘制损失曲线,并使用它来评估第二个模型的性能。损失曲线显示模型欠拟合,可能过拟合,测试损失高于训练损失。然后,讲师提出可以采取哪些措施来解决模型中的欠拟合和过拟合问题,并提出诸如获取更多数据、简化模型、使用迁移学习或添加更多层等选项。

  • 24:35:00 在本节中,讲师讨论了比较模型结果的重要性,并提供了一些工具,例如 PyTorch plus TensorBoard 以及权重和偏差,以跟踪不同的实验。不过,他强调说,本课程目前只关注纯 PyTorch。然后,讲师设置一个图来并排比较模型结果,使用每个模型结果的数据框。他还建议尝试进行一项实验,对零模型进行更长时间的训练,看看它是否有所改善。最终,在视觉上比较不同的实验及其指标对于改进模型至关重要。

  • 24:40:00 在本节中,讲师使用子图比较他们试验的两个模型的不同指标。他们首先为纪元数创建一个范围,然后使用 PLT.subplot() 和 PLT.plot() 创建火车损失图。他们对训练和测试数据的测试损失和准确性做同样的事情。导师指出,实施了数据增强的模型一在这个阶段似乎过拟合,而模型零在损失方面表现更好。讲师建议,如果他们有更多模型可供比较,他们可能会将其转化为一个函数,但也指出,在进行大量实验时,TensorBoard、权重和偏差以及 MLflow 等工具可以帮助理解这些图表。

  • 24:45:00 在本节中,演讲者讨论了根据模型在测试数据集上的表现而非仅在训练数据集上的表现来评估模型的重要性。他们建议虽然训练数据集的指标很好,但最终目标是让模型在看不见的数据上表现良好。演讲者建议对模型进行更长时间的训练,并可能向每一层添加更多的隐藏单元以获得更好的结果。然后,他们以食品识别应用程序为例,继续演示如何对不在训练或测试数据集中的自定义图像进行预测。他们解释了下载自定义图像和使用经过训练的 PyTorch 模型进行预测的工作流程,但警告说当前模型的性能可能不佳。

  • 24:50:00 在本节中,讲师展示了如何下载比萨饼的自定义图像并准备使用他们训练的模型进行预测。该图像使用原始 GitHub URL 下载并保存到数据文件夹。讲师指出,自定义图像的格式必须与用于训练模型的数据的格式相同,特别是数据类型为 torch float 32 且形状为 64 x 64 x 3 的张量形式。他们演示了如何使用 torch 视觉包和 read_image 函数将图像加载到 PyTorch 中,该函数将 JPEG 或 PNG 读入三维 RGB 或灰度张量。

  • 24:55:00 在本节中,讲师演示了如何使用 torch vision.io 将自定义图像读入 PyTorch 并将其转换为张量。他还展示了如何获取有关图像的元数据,例如图像的形状和数据类型。讲师指出,在将图像传递给模型之前,可能需要调整其大小、转换为 float32 并放入正确的设备中。在下一节中,他计划演示如何使用 PyTorch 模型对自定义图像进行预测。

第 26 部分

  • 25:00:00 在本节中,讲师讨论了数据类型和形状在深度学习中的重要性以及如何修复与它们相关的错误。讲师尝试对图像进行预测但遇到错误,因为自定义数据与模型最初训练所用的数据类型不同。他们展示了如何通过重新创建自定义图像张量并将其转换为 torch float 32 来修复错误。然后,讲师面临自定义图像形状的另一个问题,并展示了如何通过创建转换管道将图像大小调整为与训练模型的大小相同。

  • 25:05:00 在本节中,讲师展示了如何使用 PyTorch 的转换包来转换输入图像并准备供深度学习模型使用。他们演示了如何将转换管道应用于自定义图像,从而导致图像被压缩和像素化。讲师指出,这可能会影响模型的准确性,并建议尝试使用更大的图像尺寸来提高性能。他们还讨论了确保张量维度符合模型要求的重要性,包括在将自定义图像传递给模型进行推理之前向自定义图像添加批量维度。

  • 25:10:00 在这部分视频中,演示者演示了如何使用 PyTorch 模型对自定义图像数据进行预测。他们强调了正确格式化数据并确保其具有与训练模型相同的数据类型、形状和设备以避免错误的重要性。演示者还展示了如何使用 softmax 函数将模型的原始输出或 logits 转换为预测概率。尽管示例中使用的模型表现不佳,但还是说明了对自定义数据进行预测的过程。

  • 25:15:00 在这部分视频中,讲师展示了如何实现自定义图像预测过程。此函数将 PyTorch 模型、图像路径、类名列表、转换和设备作为输入。它使用 TorchVision 加载图像,对其进行格式化,获取预测标签,并以其预测作为标题绘制图像。讲师要求观众尝试自己构建此功能,然后在视频中介绍可能的实现方式。本节未完整实现功能,下个视频继续。
     
  • 25:20:00 在本节中,我们将了解如何使用 PyTorch 对自定义数据进行预测。首先,我们需要将图像数据缩放到 0 到 1 之间,以便我们的模型可以正确处理它。然后,我们检查是否需要任何变换,如果需要,则将图像传递给它们。接下来,我们确保模型在正确的设备上并将其置于推理模式。我们还为图像添加了一个额外的维度,以反映我们的模型将预测的批量大小 1。然后我们进行预测,使用 softmax 将原始 logits 转换为预测概率,然后使用 argmax 将其转换为预测标签。最后,我们创建图像图及其预测和预测概率。如果提供了类名列表,该函数将为图中的每个预测复制类名。

  • 25:25:00 在本节中,讲师解释了如何使用预训练的 PyTorch 模型创建一个可以接收图像并显示其预测类别的函数。该函数可以接收用于标记的类名称列表,还可以显示预测概率。然后,讲师演示在自定义图像和预训练模型上使用此函数,解释将结果放在 CPU 上以与 matplotlib 兼容的重要性。尽管模型性能不佳,但讲师强调了可视化结果的力量。

  • 25:30:00 在本节中,讲师总结了上一节的主要内容,其中介绍了如何使用 PyTorch 预测自定义数据。要记住的要点是必须对数据进行预处理以匹配模型的预期格式,包括正确的数据类型、正确的设备和正确的形状。 PyTorch 内置了许多处理不同数据类型的函数,用户可以根据需要编写自己的自定义数据集类。此外,讲师强调了在训练模型时平衡过度拟合和欠拟合的重要性,并提到了一些用于进一步学习和实践的资源,包括练习和课外材料。

  • 25:35:00 在本节中,导师鼓励学习者先浏览PyTorch自定义数据集练习模板,并尝试自己填写所有代码。万一遇到困难,他们可以参考讲师提供的示例解决方案。提供的解决方案只是一种做事方式,用户可以自由参考并与他们的实现进行比较。在此过程中遇到的解决方案和错误也可以在 YouTube 上提供的实时演练中看到。讲师提醒用户,他们已经涵盖了很多练习,可以在 PyTorch 深度学习库中查看额外的练习和解决方案。讲师最后提到,在 learnpytorch.io 上还有五个章节可供学习者探索,以了解有关迁移学习、pytorch 模型实验跟踪、pytorch 论文复制和 pytorch 模型部署的更多信息。
 

没有黑盒机器学习课程——没有图书馆也能学习



没有黑盒机器学习课程——没有图书馆也能学习

00:00:00 - 01:00:00 在此 YouTube 视频中,讲师介绍了无黑盒机器学习课程,教授如何在不依赖库的情况下在机器学习中编写代码。该课程涵盖与构建可识别绘图的 Web 应用程序相关的主题,包括数据收集、特征提取和可视化,以及实现分类器(例如最近邻和 K 最近邻)。讲师强调理解数据在机器学习中的重要性,并为那些需要复习高中数学和编程经验的人推荐资源。该视频演示了使用 JavaScript 创建一个充当数据创建者的网页的过程,无需任何外部库。演示者还包括有关如何创建撤消按钮和名称输入字段、将绘图存储在数据对象中以及将路径保存在用户计算机上的说明。最后,该视频展示了如何在 node.js 中创建数据集生成器并使用 JavaScript 生成与每个样本关联的数据。

01:00:00 - 02:00:00 在此 YouTube 视频中,讲师教观众如何在不使用库的情况下创建机器学习数据集和提取特征。他们演示了如何将数据集存储在一个文件夹中,该文件夹可以在节点脚本和 Web 应用程序之间进行通信,并创建一个数据查看器应用程序。讲师还展示了如何使用 Google 图表可视化收集的数据,以及如何识别和强调图表和列表中的选定项目。总体而言,该视频为学习者提供了仅使用 JavaScript 创建机器学习数据集和提取特征的综合指南。

02:00:00 - 03:00:00 “无黑盒机器学习课程 – 不用库学习”视频演示了如何在不使用机器学习库的情况下根据图形的特征对其进行分类。视频创作者强调了拥有快速响应系统来检查数据以避免人为错误的重要性。他们演示了如何向图表添加功能、如何隐藏背景以及如何使用带有 HTML 和 CSS 的动态容器在屏幕上显示预测标签。该视频还介绍了规范化和标准化等数据缩放技术。最后,视频展示了如何实现 K 最近邻分类器并统计 K 最近邻内每个标签的数量。

03:00:00 - 03:50:00 YouTube 视频“No Black Box Machine Learning Course - Learn Without Libraries”涵盖了与 K-最近邻分类相关的各种主题,无需使用 JavaScript 和 Python 等机器学习库。该视频介绍了如何将数据集拆分为训练集和测试集、分别处理训练和测试样本以及对数据进行归一化。讲师还讨论了决策边界在理解分类器如何运行方面的重要性,演示了如何在 JavaScript 中实现 K 最近邻 (KNN) 分类器,以及如何在不使用机器学习库的情况下生成基于像素的绘图。最后,该视频以呼吁观众探索 Python 的其他功能并反思他们到目前为止所学的内容结束。

第1部分

  • 00:00:00 在本节中,演讲者介绍了无黑盒机器学习课程,该课程专注于不依赖库的编码。该课程涵盖了构建识别绘图的 Web 应用程序的各种主题,包括数据收集、特征提取和可视化,以及实现分类器(例如最近邻和 K 最近邻)。演讲者强调了理解数据在机器学习中的重要性,并为学生提供了一个短暂的休息时间来专注于家庭作业,同时还建议了一些资源来重温高中数学和编程经验。然后课程进入第二阶段,其中将涵盖更高级的方法,例如神经网络。还演示了构建用于数据收集的绘图应用程序的示例,其中包含撤消和保存功能。

  • 00:05:00 在视频的这一部分中,讲师演示了创建网页的过程,该网页将用作数据集的数据创建者。他们首先创建一个名为 web 的新文件夹,并在该文件夹中创建第一个文件,即名为 Creator.html 的网页。该页面包括基本 HTML、标题部分和名为 Styles.css 的外部样式表。他们还为页面添加基本样式,包括字体系列和背景颜色。然后,讲师继续使用名为 sketchpad.js 的外部 JavaScript 文件来实现画板,并定义画板类构造函数来保存画布元素。

  • 00:10:00 在本节中,讲师使用 JavaScript 设置画布并添加“onmousedown”事件侦听器以检测鼠标操作。他们通过获取画布边界区域的矩形并分别减去左侧和顶部来获得鼠标坐标。将坐标舍入为整数后,教师创建一个路径数组,其中包含单击画布时的鼠标坐标。他们还将“绘图”设置为假,将“路径”设置为空。为“onmousemove”添加了另一个事件侦听器,以在鼠标移动时继续向路径数组添加更多点。

  • 00:15:00 在本节中,演讲者解释了如何在不使用库的情况下使用 JavaScript 实现鼠标事件以在画布上绘图。通过使用“onMouseMove”和“onMouseUp”的事件侦听器,代码可以跟踪鼠标移动并在用户绘图时将位置添加到路径中。此外,还创建了一个新的“获取鼠标”功能以将位置添加到画布。最后,演讲者演示了如何创建一个“绘制”实用对象来清除路径并将其绘制到画布上。

  • 00:20:00 在本节中,视频讲师继续构建一个没有任何外部库的绘图程序,方法是解决绘制线条的一些问题,例如拐角外观和直线末端。然后他们继续创建用于绘制多条路径的函数并将其合并到程序中。由于视口,讲师在移动设备上运行程序时遇到了一些问题,他们通过在 HTML 文件的 head 部分使用元标记来修复它。

  • 00:25:00 在本节中,本教程的重点是通过向 HTML 代码中的视口元标记添加特定命令,使画布适合移动设备等较小的屏幕。但是,触摸的事件监听器与鼠标的事件监听器不同,因此需要修改带有触摸事件监听器的画板。为了进一步增强画布,创建了一个撤消按钮,但只有在有撤消路径时才会这样做。当画布为空时,该按钮被禁用。

  • 00:30:00 在本节中,视频介绍了如何通过更改 CSS 文件中的样式来改进按钮的外观。讲述者添加悬停效果并设置禁用状态的样式。接下来,我们将学习如何创建一个供用户输入姓名的输入字段和一个用于前进到下一张绘图的按钮。该视频还解释了如何从这些字段收集数据并将它们存储在具有三个字段的对象中:学生、会话和绘图。最后,叙述者开始执行启动函数,该函数将用于启动绘图过程。

  • 00:35:00 在视频的这一部分,演示者展示了如何在不使用任何库的情况下使用 JavaScript 实现绘图应用程序。他们首先为他们想要绘制的东西的标签定义一个索引,例如汽车、鱼、房子等。他们还添加了一个用于说明的字段,并修改了开始按钮以在第一次绘制后更改为“下一步” .然后他们为“下一步”按钮实现一个函数,该函数增加索引、获取下一个标签并更新指令。他们还将绘图存储在特定标签的数据对象中,并添加一个公共方法来重置画板。演示者测试应用程序并显示数据对象正在收集图纸。

  • 00:40:00 在本节中,讲师将解释如何将用户绘制的路径保存在计算机本地。他们创建了一个 href 属性设置为“数据纯文本”的“a”元素,并使用数据的字符串化版本对 URI 组件进行编码。收集的数据以 JSON 字符串的形式保存在文件中,该文件具有根据时间戳生成的唯一名称。最后触发下载动作,下载文件。讲师还添加了有关如何处理下载文件的说明,并指出这将在下节课后更有意义。

  • 00:45:00 在本节中,讲师展示了如何通过在文档而不是画布上添加事件侦听器来解决画板的潜在问题。他还要求观众帮助在不同设备上测试系统并报告任何问题或提出解决方案。然后,讲师解释了如何使用 node.js 将收集到的数据处理成更易于管理的形式,并展示了如何导航到项目目录并创建一个新文件夹来存储数据。最后,他创建了一个“原始”文件夹,其中粘贴了从近 500 份学生提交的所有数据中收集的数据,每份数据包含八张不同的图画,并解释了他将如何处理这些文件以创建一个数据集,其中每个样本都是一张图画。

  • 00:50:00 +Alt+M 和 Json 文件将被很好地格式化。在本节中,讲师解释了他们将如何在 nodejs 中创建数据集生成器来处理样本并使用两个单独的文件夹可视化它们:一个用于 Json 表示,另一个用于图像。该脚本将从原始数据目录中读取文件名,从中提取内容,并存储有关每个样本的信息,例如它们的 ID、标签、学生姓名和学生 ID、会话和绘图。最后,本节简要介绍了如何运行和测试代码,从而在指定目录中创建示例 Json 文件。

  • 00:55:00 在本节中,演讲者解释了如何使用 JavaScript 生成与每个样本关联的数据。这涉及将文件写入 Json 目录并将每个特定标签的绘图字符串化。然后,演讲者演示了如何使用画布和公共目录中的“绘图路径”功能生成每幅绘图的图像表示。为此,演讲者从“draw.js”文件中导出“draw”对象以用于数据集生成器,并使用节点包管理器安装画布库。


第2部分

  • 01:00:00 在本节中,讲师展示了如何创建画布并使用它在画布上绘制路径,然后将其存储为图像。他们还在绘制新路径之前清除画布。生成图像文件后,导师修复了绘图应用程序中由于未在绘图 JS 中定义模块而导致的问题。他们使用将在整个课程中使用的结构,将常量分隔在另一个文件中并要求它。教师通过创建 utils 对象并添加名为 print progress 的函数,在名为 utils 的新文件中添加进度指示器。他们使用 process STD out 获取标准输出,使用格式化百分比的函数计算百分比,并将其写入标准输出以显示进度指示器。

  • 01:05:00 在本节中,视频创作者解释了如何以浏览器可以读取的方式存储生成的数据集。他创建了一个名为“JS_objects”的文件夹,其中包含可以在节点脚本和 Web 应用程序之间进行通信的文件。创建一个“样本”JavaScript 文件,它将初始化 JS_objects 文件夹中的一个 JavaScript 对象。视频创建者还提到他将为数据集创建一个查看器应用程序,并使用基本 HTML 代码创建一个名为“viewer.html”的 HTML 文件。文件的头部分包括一个用于支持 UTF 字符的元标记和页面标题。正文部分包括一个标题为“Data Viewer”的 H1 标签和一个 ID 为“container”的 div 以保存数据集。 “示例”JavaScript 文件包含在 HTML 文件中。

  • 01:10:00 在本节中,讲师正在创建一个表格,其中包含按学生 ID 分组的样本。为此,他们在 utils.js 文件中实现了一个“分组依据”功能,该功能按给定键对数组进行分组。然后他们将这些组记录到控制台以检查它是否正常工作。接下来,他们在一个单独的 display.js 文件中创建一个名为“create row”的函数,该函数将容器、学生姓名和样本作为参数,并创建一个行,左侧是名称,右侧是样本。他们创建一个循环来遍历每个学生 ID,调用“创建行”函数,并传入必要的参数以表格格式显示数据。

  • 01:15:00 在本节中,讲师将展示如何动态创建一行带有标签的图像并使用 CSS 正确对齐它们。他们首先循环遍历一组图像样本,创建一个图像元素并分配源和样式属性。然后将图像附加到一行,同时创建标签 div 并将其附加到示例容器。然后用一个 div 包裹示例容器,该 div 被赋予一个 ID 和一个类。然后,教师改进 CSS 以使标签和图像居中,并为较长的名称添加省略号。最后,他们通过创建一个 div 并将其附加到标签之后,为示例绘图添加了白色背景。

  • 01:20:00 在本节中,视频创作者修改了网络应用程序中收集的图像样本的显示。修改需要创建一个示例容器,该容器具有白色背景、居中对齐的文本、圆角和一个像素的边距。缩略图设置为 100,行标签具有占用 20% 空间的属性,其余八个样本各占 10% 空间。生成的显示结构很整洁,但有些图像并不完全适合,这没什么大不了的,因为它是为桌面应用程序设计的。此外,创作者还为被标记的用户使用其 ID 制作的一些图画添加了模糊滤镜。一些收集到的图纸令人印象深刻,而另一些则包含使数据更具挑战性的误解。

  • 01:25:00 在本节中,YouTuber 查看了数据集中的一些图画并评论了它们的质量,并指出有些图画非常详细,并且一定花了很长时间来创建。他们还提到他们的数据集与 Quick Draw 数据集不同,因为他们有一个撤消按钮并且没有时间限制,这意味着他们的绘图平均质量应该更好。最后,他们对页面的组织和样式做出随意的评论。

  • 01:30:00 在本节中,讲师解释了如何在不使用任何库的情况下从样本中提取特征。提取路径计数和点计数的函数在名为 features.js 的文件中实现,并添加到名为 features 的对象中。然后,在 feature extractor.js 文件中,读取样本并通过遍历所有样本并获取每个样本的路径计数和点计数来提取特征。然后将这些特征值组合成一个数组并写入一个新文件。最后,特征名称和示例组合在另一个名为 features.json 的文件中。运行特征提取器脚本时,日志显示“提取特征”,最后显示“完成”。然后可以检查数据集目录中的结果特征。

  • 01:35:00 在本节中,视频创作者解释了如何使用 JavaScript 对象来保存功能文件中尚未包含的其他数据。该对象可以保存到单独的 JavaScript 文件中,并用于提取 Web 应用程序所需的所有数据。创建者还演示了如何使用 Google 图表可视化数据,其中宽度、高度、轴标题和核心图表包等选项可以在对象中定义。创建一个数据表,其中包含两列用于特征值及其对应的名称。

  • 01:40:00 在本节中,视频演示了如何使用 Google Visualization 创建散点图,允许用户通过使用 Explorer 操作放大和缩小来更仔细地研究数据的不同特征。该视频还展示了如何使用不同版本的 Google 图表库(称为材料图表)为每个类别使用不同的颜色并实现透明度以更好地可视化不同部分的密度。

  • 01:45:00 在本节中,视频创作者展示了如何使用 Google 图表创建散点图,然后使用他们自己的 JavaScript 代码创建新图表。创建者简化了图表的选项,并将配色方案更改为使用表情符号,这样可以更轻松地识别数据点,而无需标签或图例。图表的透明度也进行了调整,以便更好地查看密集绘制的数据。

  • 01:50:00 在本节中,讲师向图表添加回调函数以识别下表中的任何选定项目。新功能叫做“handle click”,它为选中的item增加了一个“emphasize”类,并使用“scroll into view”和“block center”来确保它自动滚动到页面的中心。然后教师修改页面布局,使图表位于页面右侧,其他内容位于页面左侧。图表也固定在某个位置,因此当用户滚动时它不会移动。

  • 01:55:00 在这部分视频中,演示者展示了如何从图表和列表中选择和取消选择项目。他们指定一个参数来设置是否应该进行滚动,并添加代码来处理在尝试不选择任何内容时发生的错误。此外,演示者还添加了通过类强调元素的功能,如果已经强调了类,则删除该类。最后,他们测试图表的功能并调整图表大小。


第 3 部分

  • 02:00:00 在本节中,演讲者演示了如何使用画板作为输入来绘制要分类的内容。他们为它准备了一个容器,给它添加样式,并将它的位置固定在离屏幕右侧和顶部一定距离的地方。他们还为它留出了清晰可见的边距,并在中央提供了一个撤消按钮。然后他们添加了一个控制面板和一个按钮来切换输入是否可见,这在测试中成功运行。演讲者强调了在检查数据时拥有快速响应系统的重要性,以避免可能导致错误的手动错误。

  • 02:05:00 在本节中,视频讲师展示了如何向图表添加控制面板以及如何在存在输入时隐藏背景。他们展示了一种通过使画板画布轮廓透明来隐藏查看器 HTML 中的背景的解决方案。他们还展示了如何通过添加更新回调函数来在画板上绘制内容时立即在图表上显示特征,该回调函数以与特征提取器相同的方式提取特征。讲师遇到了称为特征的冲突对象的问题,但通过将它们重命名为特征函数来解决该问题。

  • 02:10:00 在本节中,演讲者演示了一个可以添加到图表中的动态点,该点会随着绘图的进行而移动。这是通过将一个属性设置为一个值并重新绘制它来实现的。动态点添加到图表类并在显示轴之前绘制。通过拖动,点移动到不同的区域,当在黑色背景上用透明的白色点绘制时,它会更加明显。该值需要很大,因为图表可能会放大,并且该点仍然可见而不会越过边缘。

  • 02:15:00 在本节中,讲师演示了如何在 sketchpad.js 中触发更新方法,该方法通过隐藏动态输入并在按下切换输入时显示数据来工作。使用触发更新方法,指导老师应用Common feature functions中的get width和height feature functions来计算绘图的宽度和高度,用于在节点特征提取器中提取新特征。讲师建议他们需要重构 HTML,以便使用相同的资源来提取和显示数据。

  • 02:20:00 在本节中,视频创建者演示了如何删除不必要的代码并用新的特征函数替换它,从而产生更通用和多维的点创建过程。重新生成特征并更新特征名称后,观察到一些有问题的样本点,这是处理数据时的常见问题。创作者指出,异常值和不一致在数据中是意料之中的,并邀请观众帮助确定问题的原因。

  • 02:25:00 在本节中,讲师解释了如何在不使用机器学习库的情况下根据图形的特征对其进行分类。他们从输入中提取特征并查看附近的点以对输入进行分类。为了找到最近的点,讲师从 math.js 图表中复制了获取最近的函数并将其粘贴到他们的代码中。然后他们调用该函数来识别绘图的标签并记录结果。

  • 02:30:00 在本节中,视频创建者添加了使用带有 HTML 和 CSS 的动态容器在屏幕上显示预测标签的功能。预测标签显示在白色容器中,并带有串联文本,显示对象是否为汽车。创建者尝试绘制不同的对象,例如时钟和铅笔,以测试程序的预测能力。然后,视频创建者使用带有标签和图像的动态点更新图表,并绘制连接最近样本的线。

  • 02:35:00 在本节中,演讲者讨论了在处理机器学习项目时不要挤压或拉伸图表中数据的重要性。它们演示了图表的纵横比如何影响数据的解释方式,从而导致混淆和错误。为解决此问题,演讲者计算最大 x 和 y 值的增量,并相应地调整图表。虽然这会产生空白,但它允许正确可视化数据和准确的机器学习结果。

  • 02:40:00 在这段文字记录中,视频创作者强调了数据缩放在机器学习中的重要性,以确保所有特征在分类中具有相同的意义。创建者演示了在特征提取过程中如何压缩和拉伸数据,从而导致对某些特征的不平等对待。为了公平竞争,创作者引入了归一化,这是一种将特征值重新映射到 0 到 1 之间的范围的常用技术。视频演示了如何在“实用程序”部分实现一个名为“归一化点”的新函数来实现这一点重新映射。

  • 02:45:00 在本节中,视频教程展示了如何通过将值更改为介于 0 和 1 之间来规范化数据。该函数已初始化为足够通用,并计算了每个特征的最小值和最大值。通过减去最小值并除以差值,将点修改为介于 0 和 1 之间。反 lerp 函数用于将给定值转换为百分比,以便对从图形中提取的特征进行归一化。最小值-最大值从函数返回并写入 JavaScript 对象文件之一以与界面通信。最后,生成数据,并将最小值-最大值包含在 JavaScript 对象文件中。

  • 02:50:00 在本节中,演示者解释了如何在尝试使用 Utils 归一化点函数对点进行分类之前对它们进行归一化。为此,加载原始要素数据并将其作为输入传递给函数。此外,可以传入最小-最大值以支持规范化,而无需计算它们。它还演示了归一化如何对离群点敏感以及如何处理它们,例如通过自动检测和删除它们或使用标准化作为不同的数据缩放。

  • 02:55:00 在本节中,讲师讨论了标准化技术,其中涉及计算每个特征的均值和标准差,并通过减去均值再除以标准差来重新映射。这种技术对异常值不太敏感,并且在某些情况下可以更好地工作。讲师还介绍了 K 最近邻分类器,其中类别是根据 K 个最近邻中的大多数来确定的。更新代码以允许搜索 K 个最近邻,并且讲师演示了如何计算 K 个最近邻内每个标签的数量。


第 4 部分

  • 03:00:00 在本节中,讲师解释了根据标签找出一组样本的大部分的过程。这涉及计算样本中每个标签的出现次数,并将多数标签设置为计数最高的标签。教师更新代码以返回所有最近的样本并在图表中为它们画线,而不仅仅是最近的样本。然后,他们演示了分类器在各种数据集上的功能,并鼓励观众分享他们自己对最近邻分类器其他变体的实现。最后,讲师强调需要将数据拆分为训练集和测试集,以客观地评估分类器的性能。

  • 03:05:00 在本节中,视频演示了如何将数据集拆分为训练集和测试集,将它们写入文件,并使用 JavaScript 在代码中为这些拆分定义常量。训练集设置为样本数的50%,视频警告在训练数据上测试错误。为了进行测试,代码循环遍历所有测试样本并将标签的值存储在名为 Truth 的属性中,同时假装不知道标签以用于测试目的。

  • 03:10:00 在本节中,视频介绍了如何分别处理训练和测试样本以及如何正确规范化数据。演讲者解释说,仅使用训练集对数据进行归一化很重要,因为我们不知道测试集是什么。他们还介绍了如何仅使用训练数据中的信息进行正确分类,并演示了如何使用分类函数处理未知数据点。

  • 03:15:00 在本节中,视频创作者将正确的属性添加到测试标签,并将该标签与之前的真值进行比较以确定准确性。还添加了一个副标题以阐明测试集的开始位置。然后创建者添加一个统计字段来计算并显示K最近邻分类器的准确率,设置为10个最近邻,结果准确率为39.62%。通过将参数更改为一个最近的邻居,准确度实际上更差,表明考虑多个邻居是一个好主意。

  • 03:20:00 在本节中,讲师重构代码并讨论决策边界对于理解分类器如何运行的重要性。他们创建一个名为“运行评估”的新文件并加载必要的常量和实用程序。讲师解释了如何创建分类器以及如何获取训练和测试样本以计算分类器的准确性。他们还引入了决策边界,它提供了有关分类器如何确定数据点分类的有价值信息。讲师指出,决策边界比简单地计算数据点的不同特征更有用。

  • 03:25:00 在本节中,演讲者解释了如何在 JavaScript 中实现 K 最近邻 (KNN) 分类器。该代码首先使用 KNN 方法为每个测试样本点预测标签,并通过检查正确的预测计数来计算准确性。创建 KN.js 文件是为了定义采用训练样本和 K 来存储和预测给定点的类。用于分类的类代码从查看器 HTML 复制到 KN.js 并进行修改以适应新类。运行评估脚本已更新为使用 KNN 分类器而不是旧的分类方法。通过以这种方式重构,代码变得更易于管理,并且可以避免愚蠢的错误。

  • 03:30:00 在本节中,讲师演示了如何在不使用机器学习库的情况下通过标准化像素值并根据预测值对它们进行颜色编码来生成基于像素的图。然后将绘图保存为 PNG 图像并设置为图表的背景。讲师展示了如何在 chart.js 文件中实现这一新功能,方法是根据数据获取左上角的坐标,从数据边界获取像素值到像素边界,并根据使用的缩放方式进行划分转变。

  • 03:35:00 在视频的这一部分中,演示者讨论了上一节中生成的图像,并评论了它的低分辨率和平滑效果。然后他们引入更高分辨率的图像,不再需要显示数据。他们解释说,彩色区域告诉我们不同的标签,以及观察不同区域出现的有趣程度。然后,他们要求观众计算所有可能的 K 值的准确性,并创建折线图以确定最佳值,并为最佳值生成高分辨率决策边界图。

  • 03:40:00 在本节中,YouTuber 解释了如何通过使用 JavaScript 编写一个函数将示例数据转换为 CSV 格式来为 Python 准备数据。他们创建了一个名为 toCSV 的函数,将带有标题和特征名称的示例数据转换为 CSV 格式,这在 Python 中很常用。他们为训练和测试数据输出带有特征名称和标签的 CSV,然后使用库继续使用 K 最近邻的 Python 实现。他们打开训练 CSV 文件,读取行,并将数据解析为以字符串表示的行数组,其中包含换行符。

  • 03:45:00 在本节中,讲师解释了如何在不使用库的情况下为 K 最近邻分类准备数据。数据从 CSV 文件中读取并存储在 Python 中的两个空数组中 - X 用于特征值,Y 用于标签。讲师通过一个循环来填充数组,将特征值转换为浮点数并将标签重新映射为数字。重新映射是使用 Python 字典实现的。然后将数据拟合到 KNN 分类器对象,其参数设置为模拟 Web 应用程序,包括 250 个邻居、蛮力算法和统一权重。讲师最后强调了 Python 中缩进的重要性,并将阅读特征数据作为函数从文件中提取出来。

  • 03:50:00 在本节中,演讲者演示了如何将数据传递给模型并使用评分函数检查其准确性。他们还鼓励观众探索 Python 的其他功能,例如安装 matplotlib 以可视化特征值和决策边界。视频最后呼吁观众反思他们到目前为止所学的知识,并为课程的下一阶段做好准备。

 

麻省理工学院 6.034“人工智能”。 2010 年秋季。第 1 讲。简介和范围



1. 简介和范围

该视频是麻省理工学院 6.034 课程“人工智能”的介绍,教授解释了人工智能的定义及其重要性,并继续讨论了对理解该主题很重要的思维模型和表征。最后,该视频提供了课程的简要概述,包括成绩的计算方式以及测验和期末考试的内容。

  • 00:00:00 在此视频中,一位教授讨论了人工智能的定义及其重要性。他继续说,任何参加该课程的人都会变得更聪明。教授还讨论了思维模型以及它们对于更好地理解该主题的重要性。最后,他谈到了表示对于制作好的模型的重要性。

  • 00:05:00 在此视频中,教授解释了陀螺仪的工作原理以及如何用图表表示问题。然后他接着解释了如何解决农民狐狸鹅和粮食问题,这个例子可能很多人从小就耳熟能详。

  • 00:10:00 视频介绍了人工智能的概念及其各种组成部分,包括人工智能生成的测试。然后视频继续讨论侏儒怪原则,该原则指出,一旦您可以命名某物,您就可以控制它。

  • 00:15:00 该视频介绍了简单想法的概念,这些想法非常强大,可以简单也可以复杂。然后视频继续讨论简单想法的定义和示例。该视频的要点是,简单的想法对于构建更智能的程序很重要,而且科学家和工程师研究它们的动机不同。

  • 00:20:00 该视频讨论了人工智能的历史,从一个多世纪前 Ada Lovelace 所做的工作开始。 1960 年马文·明斯基 (Marvin Minsky) 撰写的论文开启了人工智能的现代时代。总有一天,人工智能的讨论将包含在课程中。
     
  • 00:25:00 “推土机时代”指的是人们开始看到他们可以获得无限的计算能力,并开始开发基于规则的专家系统的时代。

  • 00:30:00 视频讨论了人类进化史和高中思想,即人类是通过逐渐和不断改进进化而来的。它继续讨论导致人类进化的偶然变化如何是偶然的进化产物,并推测这些变化可能是什么。

  • 00:35:00 本视频简要介绍了诺姆·乔姆斯基关于人类智能发展的观点。主要观点是语言是人类智能的中心,课程的主要目的是帮助学生发展该领域的技能。该视频还提到了背诵和教程的重要性,这是课程的关键方面。

  • 00:40:00 该视频简要介绍了麻省理工学院的课程,包括课程出勤率与成绩之间的关系。然后,该视频总结了课程如何计算学生的成绩,其中包括考虑学生在测验和期末考试中的表现。最后,该视频警告学生不要试图参加所有期末考试,因为压力太大,提高的机会也更少。

  • 00:45:00 视频介绍了测验和期末考试,并解释了测验的运作方式和期末考试形式。该视频还解释了学生将如何联系教师和安排教程。
 

第 2 讲 推理:目标树和问题解决



2. 推理:目标树和问题解决

该视频讨论了如何推理、目标树和解决问题。它介绍了一种称为“问题减少”的技术,并解释了如何使用它来解决微积分问题。它还讨论了如何使用启发式转换来解决问题,以及如何使用知识来解决复杂领域中的问题。

  • 00:00:00 视频介绍了问题简化,这是学生在微积分中常用的解决问题的技巧。它讨论了问题减少背后的教育理念,并提供了问题减少示例列表。

  • 00:05:00 演讲者正在解释问题解决的工作原理,以及不同的转换如何帮助解决问题。他们讨论了解决问题所必需的四个安全转换。第一步是应用所有安全转换,然后查看表以查看问题是否已解决。如果问题已经解决,那么speaker就会报告成功。

  • 00:10:00 视频讨论了目标树和问题解决的概念,并介绍了启发式变换的概念。这些转换虽然并不总是成功,但在某些情况下可能很有用。

  • 00:15:00 该视频讨论了可用于解决问题的各种启发式转换。这些转换之一是一系列转换,我将只向您展示其中一个。这个变换是这样的:如果你有一个函数的正切和 X 的积分,你可以将它重写为 Y 函数的积分超过 1 加上 y 的平方 dy。这种从三角函数形式到多项式形式的转换摆脱了我们不想处理的所有三角函数垃圾。我们还需要一个 C,这将是您正确的下意识反应。你看到 1 减去 x 平方的形式,当你看到它时你会怎么做?好吧,你可以那样做。如果 Kristen 有什么可以建议的,您将无能为力。她说,因为我们的匈牙利人在哪里我变成了我们的年轻人,这表明我们使涉及X人标志的转变适用。这意味着 Scylla 实际上不再需要记住这一点,因为今后,她将永远不必将任何个人融入她的生活。她可以模拟程序。这些从多项式形式回到三角函数形式,所以你有三个

  • 00:20:00 视频讨论推理、目标树和问题解决。演示者介绍了一种称为“目标树”的问题解决技术。这棵树显示了目标之间的关系,它有助于决定要解决的问题。主持人解释说,这种技术也称为“问题归纳树”或“树目标树”。

  • 00:25:00 该视频介绍了目标树和问题解决的概念,并展示了如何使用符号衡量函数组合的深度。然后,该视频演示了如何应用安全变换将积分分成三部分,以及它如何适用于特定的有理函数。

  • 00:30:00 视频讨论了推理程序,该程序通过组合安全转换来解决问题。它显示了程序如何在特定问题上没有找到解决方案而返回处理另一个问题。

  • 00:35:00 该视频讨论了 Schlegel 新生微积分问题模型背后的推理,在该模型中,有关变换的知识、老树的工作原理和表格是解决问题所必需的。该视频还提到功能组合的深度,这是布雷特建议的一种技术,实际上并不重要,因为树不会长得深或宽。

  • 00:40:00 视频讨论了知识在解决问题中的表现方式,以及某些转换如何使问题变得更简单。它还讨论了如何使用知识来解决复杂领域中的问题。

  • 00:45:00 演讲者演示了一个程序,据称可以演示计算机如何“智能化”。然而,演讲者很快意识到程序和他做的是同样的事情,所以计算机并不是真正的智能。
 

第 3 讲 推理:目标树和基于规则的专家系统



3. 推理:目标树和基于规则的专家系统

该视频解释了基于规则的专家系统的工作原理。该系统旨在解决使用更传统的方法难以解决的问题。该系统由多个规则组成,这些规则由门和门连接,使系统能够确定地识别特定动物。

  • 00:00:00 该视频介绍了如何构建基于规则的专家系统 (RBS),并提供了系统工作原理的示例。 RBS 旨在解决使用更传统的方法(例如代数方程)难以解决的问题。

  • 00:05:00 在此视频中,Patrick Winston 教授解释了推理程序或基于规则的专家系统的工作原理。该程序的结构非常简单,有四个块在迭代循环中执行,以达到预期的结果。该程序能够解决涉及简单块的问题,因为它从过去回答过的问题中获取提示,并使用递归来获得复杂的结果。

  • 00:10:00 该视频解释了如何使用目标树来回答有关某事如何完成的问题,以及如何使用与或树来做到这一点。它还解释了集成程序可以使用目标树来回答有关其自身行为的问题。

  • 00:15:00 该视频讨论了复杂的行为是如何由环境的复杂性而非程序的复杂性造成的。基于规则的专家系统是在 60 年代后期开发的,作为一种将知识封装在简单规则中的方法,它们至今仍在使用。

  • 00:20:00 这段 YouTube 视频讨论了如何使用基于前向链接规则的专家系统 (RBSES) 来识别小型动物园中的动物。 RBSES 由多个规则组成,这些规则由和门连接,使系统能够确定地识别特定动物。

  • 00:25:00 该视频解释了基于规则的专家系统 (RBE) 的工作原理,它通过从一个假设回溯来确定一个物体是否是某种动物。

  • 00:30:00 创建了一个基于规则的专家系统来设计类似于葡萄牙建筑师 Siza 设计的房屋。该系统能够将杂货店装袋工所说的话翻译成 if-then 规则,让知识工程师能够理解它。

  • 00:35:00 在此视频中,Patrick Winston 教授讨论了知识工程原理,包括对特定案例的需求和启发式方法的使用。他还提供了一个示例,说明如何使用启发式方法二(即两个对象相同或不同的问题)来解决问题。

  • 00:40:00 演示者讨论了可以增强人类智能的三种方式:通过构建基于规则的系统、通过开发目标驱动程序以及通过使用集成程序。第三个启发式是,当不遵守规则或目标时,系统将崩溃,表明需要进一步了解。演示者通过讨论一个案例来证明这一点,在该案例中,程序为患者开了一桶青霉素。

  • 00:45:00 该视频解释了如何通过目标树和基于规则的专家系统进行推理。在这两个例子中,系统都能够阅读故事并确定行动的后果。
 

第 4 讲 搜索:深度优先、爬山、Beam



4. 搜索:深度优先、爬山、Beam

在此 YouTube 视频中,Patrick Winston 讨论了不同的搜索算法,包括深度优先、爬山、Beam 和最佳优先搜索。他以地图为例,展示了每种算法的优点和局限性,以及了解不同的搜索方法如何提高解决问题的能力。温斯顿还讨论了搜索算法在智能系统中的应用,使用创世纪系统回答有关麦克白故事的问题。他还介绍了 Pyrrhic 胜利的概念,以及搜索程序如何通过查看图表并用英语报告他们的发现来发现这种情况。总的来说,该视频全面概述了搜索算法及其在现实场景中的实际应用。

  • 00:00:00 在本节中,Patrick Winston 讨论了不同的搜索方法以及它们如何与我们自己解决问题的能力相关联。他以在地图上找到从一个点到另一个点的最佳路径为例,展示了良好搜索算法的重要性。他还介绍了大英博物馆搜索的概念,探索每条可能的路径,但指出这种方法效率不高。他接着讨论了深度优先、爬山和波束搜索,以及如何在不同场景中使用它们。他强调,了解不同的搜索算法可以帮助培养解决问题的直觉,也可以深入了解我们的大脑如何解决问题。

  • 00:05:00 在本节中,使用地图示例介绍深度优先、爬山和波束搜索的概念。大英博物馆的算法被用来说明如何在地图上找到所有可能的路径而不咬自己的尾巴。虽然搜索是通过地图表示的,但很明显它不仅限于地图,而且实际上是关于在试图做出决定时所做的选择。深度优先搜索是显示的搜索之一,它包括以一心一意的方式向前推进,选择路径并在遇到死胡同时回溯。还引入了回溯过程,作为提高算法效率的一种方式。

  • 00:10:00 在本节中,视频讨论了两种主要的搜索算法:深度优先搜索和广度优先搜索。深度优先搜索最好与可选的回溯技术结合使用,因为它可以防止错过通向目标的路径。广度优先搜索逐层构建树并完成通往目标的路径。然后,该视频针对一个示例问题测试了两种搜索算法,移动了起始位置并相应地调整了搜索。引入流程图来演示搜索算法,利用队列来表示正在考虑的路径。

  • 00:15:00 在本节中,演讲者解释了深度优先搜索算法的工作原理。该算法从初始化队列和扩展队列中的第一条路径开始。扩展 s 之后,speaker 得到两条路径,s 到 a 和 s 到 b。对于深度优先搜索,新的扩展路径放在队列的前面,以便算法可以继续向下进入搜索树。演讲者还解释说,广度优先搜索使用与深度优先搜索相同的算法,只是改变了一行,即将新路径放在队列的后面而不是前面。

  • 00:20:00 在本节中,我们将了解广度优先搜索的局限性以及如何改进它。该算法被认为是低效的,无法判断它是离目标越来越近还是越来越远。此外,它经常会多次扩展到达同一节点的路径,我们需要避免这种情况。通过修改算法以不扩展路径,除非之前未扩展最终节点,我们可以避免在重复路径上浪费时间。使用这种方法,我们看到搜索效率和路径质量有了显着提高。

  • 00:25:00 在本节中,视频探讨了爬山搜索作为一种更明智的方法,通过考虑到节点的距离来找到目标节点。与深度优先搜索类似,Hill Climbing 按词法列出选项,并根据与目标节点的接近程度打破平局。这会导致没有回溯的更直的路径,尽管它可能并不总是最佳路径。该视频演示了与深度优先搜索相比,爬山法产生更少的排队和更直接的路径。如果可用,该视频鼓励在搜索算法中使用启发式算法。

  • 00:30:00 在本节中,讲师讨论束搜索技术,它是对广度优先搜索的补充或补充,允许使用启发式进行明智的搜索。 Beam Search 对每个级别要考虑的路径数量设置了限制,并且仅保留最接近目标的前两条路径,方法是利用额外信息或对目标距离的启发式测量。讲师提到爬山也是一种明智的搜索,它通过考虑到目标的距离将新路径添加到队列的前面,这些路径被排序以保持一切笔直。

  • 00:35:00 在本节中,演讲者讨论了波束搜索和最佳优先搜索,这两种额外的搜索算法可用于连续空间(例如山脉)。 Beam Search 涉及选择并保留 w 个最佳路径作为解决方案,而 Best-first Search 涉及始终在最接近目标的叶节点上工作,并且可以在搜索树中跳来跳去。爬山在连续空间中会遇到问题,例如卡在局部最大值或无法在平坦区域移动。最后,演讲者说明了在高维空间中爬山的另一个问题,其中可能存在尖锐的桥梁。

  • 00:40:00 在本节中,视频讨论了建模智能以及构建智能系统时对搜索算法的需求。演讲者使用地形图的例子来说明我们如何误以为自己在山顶,而实际上并非如此。这导致了搜索的概念,这是制定计划和评估选择所必需的。然后,演讲者演示了如何使用 Genesis 系统通过搜索算法回答有关麦克白故事的问题。该系统吸收信息,构建阐述图,并在故事中搜索与复仇和其他更高层次概念相关的模式。

  • 00:45:00 在本节中,Patrick Winston 讨论了 Pyrrhic 胜利的概念,这是一种情况,一开始一切似乎都很顺利,但最终会导致负面后果。他演示了搜索程序如何通过查看图表来发现此类信息,并可以根据该信息回答问题。这些程序结合使用显式语句和 if/then 规则来构建这些图表并以英文报告信息。温斯顿还提到,这些程序可以通过报告产生信息的搜索来生成常识性答案和更高层次的想法。最后,他展示了系统使用解析器系统生成的语言输出来回答有关麦克白的性格和动机的问题的能力。
 

第 5 讲 搜索:最优、分支定界、A*



5. 搜索:最优、分支定界、A*

该视频讨论了几种用于查找两地之间最短路径的搜索算法,重点是芝加哥和洛杉矶之间的 66 号公路示例。该视频介绍了启发式距离的概念,并提供了不同搜索算法的示例,例如爬山、集束搜索和分支定界。演讲者强调了在 A* 算法中使用可接受的和一致的启发式算法来优化搜索的重要性。此外,该视频还指出了使用扩展列表和航路距离来确定最短路径下限的有效性。最终,视频的结尾承诺将在下一讲中讨论 A* 算法的进一步改进。

  • 00:00:00 在本节中,教授讨论如何找到两地之间的最短路径,重点是芝加哥和洛杉矶之间的 66 号公路示例。他提到了艾森豪威尔总统创建的州际公路系统,他想复制德国军队在全国各地快速调动部队的能力。然后教授介绍了启发式距离的概念以及它如何帮助找到最佳路径,尽管它并不总是正确的。他还给出了不同搜索算法的示例,例如爬山和束搜索,旨在通过靠近目的地找到最佳路径。

  • 00:05:00 在这一部分,教授通过询问知道答案的人来讨论启发式距离的概念和问题解决的原则。使用在地图上寻找最短路径的示例,教授建议遵循 Juana 建议的路径,但通过检查所有其他可能的路径最终是否比建议的路线更长来验证它。教授详细阐述了计算路径长度和选择最短路径延伸的过程,直到路径长度与胡安娜建议的路径长度相匹配。

  • 00:10:00 在本节中,演讲者讨论如何在没有神谕的情况下找到最短路径。该方法涉及将最短路径延伸到目前为止,直到达到目标。演讲者举了一个例子来说明通过考虑非负长度的路径来寻找最短路径的过程。该方法检查到目前为止所做的任何工作是否被浪费,如果没有,则路径长度是最短的。演讲者解释说,这种方法可以找到最短路径,但如果存在零长度长度,则可能还有其他路径。

  • 00:15:00 在视频的这一部分,演讲者演示了使用分支定界法在更复杂的地图上寻找最短路径。他们提到了装饰流程图并解释了初始化队列、测试队列中的第一条路径以及扩展不是赢家的路径的过程。演讲者指出,分支定界方法将许多路径放入队列并扩展了很多不是最优的路径,但这可以通过仅扩展之前未扩展的路径来改进。演讲者强调了仅使用扩展路径方法寻找最佳路径的重要性。

  • 00:20:00 本节引入扩展列表的概念作为对分支定界算法的调整改进。扩展列表防止算法扩展已经扩展的路径,并且路径长度比已经到达同一点的路径更长。通过保留扩展列表,可以修剪掉树的大部分区域,从而减少获得解决方案所需的扩展数量。与前面的示例相比,新算法只需要 38 个扩展而不是 835 个,从而大大节省了计算时间。

  • 00:25:00 在本节中,介绍了使用航线距离来确定最短路径下限的概念。累计距离和航线距离相加以提供路径的下限。然后通过选择从 S 到 G 的潜在距离最短的路径来演示模拟。在平局得分的情况下,选择词法值最小的路径。
     
  • 00:30:00 在本节中,演讲者讨论了使用启发式方法来加速图形搜索算法。使用可接受的启发式是指保证估计值小于实际距离。扩展列表比使用这些下限启发式方法之一更有用。然而,启发式的有效性取决于问题,通过改变起始位置的位置,可以改变搜索结果。最后,重要的是要注意,使用启发式方法可能不会重复通过同一节点的移动,但它不一定会做一些对于有效搜索必不可少的事情。

  • 00:35:00 在本节中,视频讨论了 A*,这是一种结合了可容许启发式算法和分支定界算法的搜索算法。通过利用这两种技术,A* 可以大大提高他们的个人表现。可接受的启发式使用严格的目标,而分支定界算法理解所涉及的空间探索。该视频展示了 A* 如何在结合使用这两种技术时更有效地解决问题。然而,该视频还指出,如果搜索超出传统地图范围,某些情况下可能会导致无法受理。因此,可容许层次结构和 A* 算法在寻找最优解时可能变得不太有效。

  • 00:40:00 在本节中,教授解释了 A* 算法中可采纳启发式的概念。他展示了一个具有奇数距离的地图示例,并解释了使用可接受的启发式方法可能并不总能找到最短路径。教授强调,可接受的启发式仅适用于地图,并且要使算法在非地图的情况下工作,这需要比启发式中的可接受性更强的东西。该视频的结尾承诺将在下一讲中讨论这一改进。

  • 00:45:00 在本节中,讲师讨论了启发式函数在 A* 算法中工作的要求。他介绍了可接受性和一致性的概念,解释了启发式函数必须是可接受的和一致的,才能在非地图的情况下工作。他表明,使用可接受但不一致的启发式可能会导致算法失败,即使在一致的启发式会起作用的情况下也是如此。最后,讲师强调了利用所有可用优势来优化 A* 算法的重要性,包括使用扩展列表和适当的启发式函数。
 

第 6 讲 搜索:游戏、Minimax 和 Alpha-Beta



6. 搜索:游戏、Minimax 和 Alpha-Beta

该视频讨论了 AI 玩游戏的历史,从德雷福斯 (Dreyfus) 的名言“计算机无法下棋”开始。演讲者解释了 if-then 规则如何在玩游戏程序中无效,并且需要更深入的分析和策略。他们引入了 minimax 算法和 alpha-beta 剪枝的概念来优化游戏搜索效率。该视频还探讨了诸如最大限度地降低保单成本和逐步深化等技术。演讲者得出结论,虽然推土机的智能很重要,但它不一定与人类头脑中的智能类型相同。

  • 00:00:00 在这一部分,演讲者讨论了 AI 游戏的早期历史,强调了 Hubert Dreyfus 的一句名言,即计算机不能下棋。然而,演讲者争辩说游戏可以模拟某些智力元素,因此他们继续解释计算机如何下棋。他们考虑使用 if-then 规则来接近游戏,这种方法不是很有效,但已在一些跳棋程序中成功实施。演讲者最终得出结论,除了战术和速度之外,更深入的分析和策略在玩游戏程序中是必需的,他们将在本节中进一步探讨。

  • 00:05:00 在本节中,演讲者讨论了创建强大的国际象棋下棋程序的第三种方法,其中包括展望未来并评估所有可能的棋步结果,以确定最佳棋盘情况。这需要一个结合棋盘特征的函数来产生一个用于确定最佳棋盘情况的静态值。演讲者解释说,形成静态值的最流行方法是使用线性评分多项式。但是,所使用的方法不必对棋盘情况进行排名或给它们数字;它只需要确定最好的一个。演讲者还谈到了移动树的分支因子以及如何计算终端节点或叶节点的数量。

  • 00:10:00 在本节中,演讲者解释了由于游戏决策树中的大量叶节点,大英博物馆算法在国际象棋中的局限性。根据 Claude Shannon 的说法,国际象棋中大约有 10 到第 120 个叶节点,这使得使用大英博物馆的处理方法来评估最佳着法是不切实际的。为了正确看待这个数字,演讲者计算出即使宇宙中的所有原子自大爆炸开始以来都以纳秒级的速度进行静态评估,我们仍然会少 14 个数量级。因此,演讲者得出结论,如果我们想评估国际象棋中的最佳着法,我们需要尽可能向前看。

  • 00:15:00 在本节中,演讲者解释了 minimax 算法,该算法涉及为游戏树的叶节点分配值并逐级“备份”以确定每个玩家的最佳可能移动。最大化玩家想要将游戏推向最大值,而最小化玩家想要将游戏推向最小值。通过计算这些值并决定最佳行动方案,该算法可用于玩国际象棋等对抗性游戏。演讲者用一个简单的博弈树说明了该算法,还展示了一个使用更大的博弈树的算法示例。

  • 00:20:00 在视频的这一部分,重点是找到尽可能深入搜索树的方法,以阐明棋盘质量的粗略衡量标准,从而很好地了解下一步行动.切断大部分搜索树的解决方案在于 alpha-beta 算法,它是 minimax 之上的一层。 Alpha-beta 使用两个参数 alpha 和 beta 来截断搜索树的部分,从而实现更高效的搜索。该算法不是 minimax 的替代方法,而是一种使其更有效的方法。给出了一个例子来演示 alpha-beta 算法在实践中是如何工作的。

  • 00:25:00 在本节中,演讲者讨论了游戏搜索过程以及如何通过使用 minimax 和 alpha-beta 等算法对其进行优化。使用的例子是一棵深度为四或更大的树,演讲者在其中圈出需要计算的数字,表明某些分支由于被切断的情况而无需评估。这节省了计算时间并允许更有效的游戏搜索。演讲者还介绍了 deep cut off 的概念,即在树中的不同级别比较数字,某些分支被认为是不相关的。虽然这看起来难以置信,但这个过程是有效的,可以大大提高游戏搜索效率。

  • 00:30:00 在本节中,视频讨论了 alpha-beta 剪枝的概念以及它如何在游戏算法中节省计算时间。通过评估棋盘状态,最小化者和最大化者可以决定可能采取的最佳行动。最小化者以某种方式获得 8,最大化者可以以另一种方式获得 9,从而形成截止情况。 Alpha-beta 剪枝允许算法通过树进行处理,alpha 和 beta 围绕情况缩小,从而节省计算量。虽然这种方法只适用于分支因子恒定的最优情况,但它仍然节省了大量的时间和计算量,使其成为玩游戏程序的必备工具。

  • 00:35:00 在本节中,我们将学习如何最小化博弈树计算的保险单成本。通过计算底部上方一级而不是一直向下的静态值,它提供了一种保险策略以确保良好的移动而不必计算 b 到 d 叶节点。保单成本是通过将树的每一层的叶数相加来计算的。但是,为了最大限度地降低成本,从第一层开始策略应覆盖多少层是有限制的。使用代数,发现最高级别的策略所需的计算等于 b 到 d 减 1 超过 b 减 1,这是一个易于管理的计算。

  • 00:40:00 在本节中,引入了渐进深化的概念,作为优化博弈树中保险政策结果的一种方式。通过始终在每个级别上都有可用的移动作为防止无法进入下一个级别的保险政策,渐进式深化举例说明了算法如何在任何时候总是在需要时立即准备好答案。此外,Christopher 建议使用临时值来提高 alpha-beta 的性能,这一想法后来被证明是对一个重要概念的重新发明。深蓝程序与其他玩游戏的程序没有太大区别,只是它使用了并行计算和针对最终游戏的专用技术。

  • 00:45:00 在本节中,演讲者讨论了游戏中不均匀树的发展,以及树为什么没有必要下降到固定水平。他谈到深蓝在 1997 年击败了卡斯帕罗夫,因为深蓝拥有额外的优势。然而,他提到这种计算方式与人类智能不同,这种计算方式与推土机处理砾石的方式相同。人类国际象棋大师以不同的方式下棋,识别模式而不是进行长时间的计算。演讲者得出结论,理解推土机的智能很重要,但它不一定与人类头脑中的智能类型相同。