ShowMeAI-人工智能工具笔记-八-

news/2024/10/15 3:48:34

ShowMeAI 人工智能工具笔记(八)

PyTorch 极简实战教程!全程代码讲解,在实践中掌握深度学习&搭建全pipeline!<实战教程系列> - P9:L9- 数据集和数据加载器 - 批量训练 - ShowMeAI - BV12m4y1S7ix

大家好,欢迎回到新的Pytorch教程。今天,我想向你展示Pytorch的数据和数据加载器类。到目前为止,我们的代码看起来是这样的,我们有一个以某种方式加载的数据集。例如,从一个CSV文件。然后我们有一个训练循环,循环遍历时代的数量,然后我们基于整个数据集优化我们的模型。

所以,如果我们在整个训练数据上进行梯度计算,这可能非常耗时。因此,对于大数据集,一个更好的方法是将样本划分为所谓的小批量。然后我们的训练循环看起来大致是这样的😊,我们再次循环遍历时代,然后再进行另一个循环,遍历所有批量。

然后我们获取x和y批量样本,并仅基于这些批量进行优化。所以现在如果我们使用Pytorch内置的数据集和数据加载器类,那么Pytorch可以为我们进行批量计算和迭代,因此使用起来非常简单。现在我想向你展示我们如何使用这些类,但在跳到代码之前。

让我们快速谈谈一些批量训练时的术语。所以首先,一个时代意味着对所有训练样本进行一次完整的前向和反向传递。而一个批量大小是指在一次前向和一次反向传递中的训练样本数量。迭代次数是指每次使用批量大小样本的传递次数。

所以这里我们有一个例子。如果我们有100个样本,而我们的批量大小是20。那么我们对于一个时代有5次迭代,因为100除以20等于5。所以是的,这就是我们应该知道的。现在让我们跳到代码。所以首先,我已经实现了一些我们需要的模块。所以torch,当然,还有torch vision。

然后从torch dot u导入数据。我们导入数据集和数据加载器。所以我刚刚提到的类。然后让我们也导入Ny和math。现在我们可以开始实现我们自己的自定义数据集。我们称这个为酒数据集。

这必须继承数据集。然后我们需要实现三件事情。我们需要实现初始化方法。并且使用self。在这里我们进行一些数据加载,例如。然后我们还必须实现双下划线get item方法,它接收self和一个索引。这将允许以后进行索引,因此我们可以用索引0调用数据集,例如。

然后我们还必须实现长度方法,它只有self。这将允许我们调用数据集的长度。那么现在让我们开始。在我们的案例中,我们想查看酒数据集。所以我这里有CSV文件,我也把它放在我的Github仓库中,你可以在这里查看。

数据集看起来是这样的。所以第一行是标题。在这里我们希望计算或预测葡萄酒类别。我们有三种不同的葡萄酒类别,1,2和3。类别标签在第一列。然后所有其他列都是特征。

所以让我们加载这个并将我们的列拆分为X和Y。因此在这里我们可以说X,Y等于Ny dot load T。X,T。

在这里我必须指定文件名。所以这是在数据文件夹中,然后我有一个葡萄酒文件夹。然后它叫做wine dot csv。接下来让我们给定一个分隔符,等于逗号,因为这是一个逗号分隔文件。接下来让我们也给它一个数据类型。因此我们假设数据类型等于nuy dot float64。然后让我们说跳过行等于一。因此我们希望跳过第一行。

因为这是我们的头部。现在让我们将整个数据集拆分为x和y。所以我们说self dot x等于。在这里我们可以使用切片。所以X,Y。我们希望获取所有样本。然后我们不想要第一列。所以我们希望从列号一开始,一直到最后。

这将给我们X。然后self dot y等于X,Y的。在这里我们再次希望获取所有样本,但只获取第一列。我们将其放入另一个数组中,以便我们有样本数量乘以一。这将使后面的某些计算更容易。嗯。所以,是的。

并且这也将其转换为一个十组。因此,我们可以说使用Numpy的torch dot,然后将其传递给我们这里的函数。所以torch dot来自Numpy。我们不需要这个,但我们可以做到。我们也可以稍后转换,但我们可以在这里直接做。那么我们来做这个吧。并且让我们也获取样本数量。所以我们假设self dot样本数量等于X。

Y dot shape。然后是0。因此第一维是样本数量。然后我们可以在这里返回。这是我们的整个长度函数。所以返回self dot样本数量。在这里我们也可以将其实现为一行。因此我们可以说返回self dot X的这个索引,然后self dot Y的这个索引。

所以这将返回一个元组。是的,现在我们完成了。这是我们刚刚实现的数据集。现在让我们创建这个数据集。所以我们假设数据集等于wine数据集。现在让我们看看这个数据集。因此现在我们可以说first data等于数据集。现在我们可以使用索引。

让我们看看第一个样本。现在让我们将其拆分为特征和标签。这个是第一数据。现在让我们打印特征并打印标签,以查看是否有效。是的,我们有一列特征或仅一行。因此这是一个行向量。然后是标签。因此在这种情况下标签是1。是的。

这就是我们获取数据集的方式。现在让我们看看如何使用数据加载器,所以我们可以说data loader等于内置的数据加载器类,然后传递。我们说数据集等于这个数据集。然后我们也可以给定批次大小。所以批次大小等于,假设在这种情况下为4。然后假设shuffle等于true,这对训练非常有用。这将对数据进行洗牌。

然后我们还说nu workers等于2。所以你不需要这样做,但这可能会使加载更快,因为现在使用了多个子进程。好的。现在让我们看看如何使用这个数据加载器对象。现在我们可以将其转换为迭代器。所以假设data iter等于Iter data loader

然后我们可以调用next函数,所以我们可以说data等于data iterDot next。然后我们再次解包,称为featureslabels等于data。现在让我们打印特征和标签,看看是否有效。好的。在这种情况下,我指定了批次大小为4。

这就是我们看到四个不同特征向量的原因。然后对于每个特征向量,类标签。所以在我们的标签向量或标签张量中有四个类标签。现在我们也可以遍历整个数据加载器,而不仅仅是获取下一个项目。现在让我们进行一个虚拟训练循环。假设一些超参数。假设nu epochs

假设epoch等于2。然后我们获取总样本数量。总样本等于我们的数据集的L。现在让我们获取一个epoch中的迭代次数。这是总样本数除以批次大小,除以4。然后我们还需要进行取整。所以用math seal。嗯。现在让我们打印总样本和迭代次数。

然后我们看到有178个样本和45次迭代。所以现在让我们开始循环。假设对于epoch在范围内的epoch数量。现在我们进行第二个循环,遍历训练加载器。假设对于I。在这里我们可以通过说inputslabelsenumerate中解包。

数据加载器。这就是我们需要做的所有事情。现在,这个enumerate函数将给我们索引,然后是inputs和已经解包的labels。在训练中,我们通常应该进行前向和反向传播,然后更新权重。这只是一个虚拟示例。在这种情况下,我只想打印一些关于我们这里的批次的信息。

假设如果I + 1模5等于0。那么每第五步,我们想打印一些信息。打印epoch。在这里,让我们打印当前的epoch。然后所有的epoch,假设nu epochs。然后我们也打印当前步骤。步骤为I + 1。然后是总步骤,这就是迭代次数。

然后我们也打印一些关于输入的信息。所以输入。假设我们想只打印 input.shape。好的,现在让我们运行一下,看看它是否正常工作。是的,我们在这里看到了打印语句。我们看到我们有两个轮次,每个轮次有 45 步,每第五步我们打印一些信息。

我们还看到我们的 Tensor 是 4 x 13。所以我们的批量大小是 4,每个批次有 30 个不同的特征。好的,这就是我们如何使用数据集和数据加载器类。然后我们可以非常轻松地获取一个单独的批次。单个批次。嗯,这样。当然。

Pytorch 还内置了一些数据集。因此,例如,从 torchvision.datasets.AMNIST,我们可以获取著名的 MNIST 数据集。我们还可以获取 Fashion MNIST 数据集或 CIFAR 数据集,甚至是 COCO 数据集。是的,这个数据集是我们在接下来的教程中会使用的。现在。

这就是我想向你展示的数据和数据加载器类。我希望你喜欢它,请订阅频道,下次见,再见!

Pytorch 进阶学习讲座!14 位 Facebook 工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P8:L8- TorchVision - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,欢迎来到 2020 P Georgeor 开发者日。我是 Francisco Massa,Facebook AI 的研究员。我在 Ptorrch 团队工作,并且是 Torch Vision 的维护者。今天,我将讨论 TorteViion 是什么,以及它如何帮助你在 Byytorch 中开始计算机视觉的旅程。

最近一年中,TorVision 引入的最新功能。

你可能首先会问自己,什么是存储视觉?

Torch Vision 是一个旨在促进计算机视觉研究和实验的库。它扩展了 Pytorch,增加了非常特定且对计算机视觉有用的功能,从而保持 Pytorch 库的精简和专注于核心抽象。但我们的视觉中实际有哪些内容,让我们仔细看看。

T Divisionion 通过提供多个构建模块,促进计算机视觉的研究和实验,使你能够快速启动一个新项目。它提供数据集,常见数据集涵盖了许多主流视觉任务,如分类和目标检测。

它也有模型,我们提供分类、检测等模型的参考。TtVision 还具有专门针对计算机视觉模型的存储打印操作符,以及数据转换操作符,以简化数据增强管道的创建。此外,它包含高效图像和视频读取的原语,最后提供参考训练脚本。

下面几个文件展示了如何训练模型以进行视觉处理。😊。

利用我们提供的构建模块。在过去的一年里,我们一直在通过我们的视觉进行改进,以简化从研究到生产的路径。

Pytororch 通过 Trot 脚本来实现研究到生产的路径,Trot 脚本是你 Pytororch 程序的中间表示,可以导出以在 C++ 环境中运行。每个深度学习管道的核心部分都依赖于其模型。通过与 Torch 脚本和 Onx 团队密切合作。

我们已经使所有 Tortvis 模型原生支持 Trch 脚本和 OnX 导出。得益于预训练模型和视觉工具,你可以快速构建 C+ 分类,利用深度学习的力量。但在将你的 Python 代码嵌入 C++ 运行时时,模型仅仅是故事的一部分。你常常需要将输入数据准备成与模型兼容的格式。

DVi 以前依赖 pillow 进行大多数数据转换,因此将您的应用程序移动到 C++ 需要以兼容 C++ 的方式重新实现转换。现在,Torch Vi 转换可以直接在 Torch dance 上工作,并且可以导出到 Torch 脚本,因此您只需在 Python 中实现一次转换。最后。

T Divisionion 现在提供原生 IO 功能用于图像和视频解码,使得完整的原始数据到模型生产管道可以从 Python 转换为 C++。

现在让我们更详细地看看这些要点。

所有充电的 Vi 模型都支持原生 Trar 脚本和 Onx 导出,因此可以用几行代码将它们导出到 C+。此外,所有模型都支持混合精度训练和推理,使运行时间更快,同时内存占用更低。

😊,Tort vision 转换已从 N 模块继承,并接受带有 torch cry 兼容性的 torch 张量作为输入。这为数据增强管道带来了几个好处,例如现成的 GPU 支持,视频使用案例的启用,通过高效的帧批量转换,以及将转换与模型一起在 C++ 环境中导出的可能性。

TorchVision 现在提供 JPEG 和 PNG 格式的图像读取和写入操作符,支持原生 TorchQ。您可以将本地图像路径直接读取到 torch densesr,或者将操作符分解为原始文件读取,仅读取文件的字节并返回为 U8 densesor,并将原始数据切割为图像 densesr。

由于原生充电食品支持,图像解码可以与您的模型一起嵌入,实现端到端导出体验。最后,TVision 提供了一个基于帧的视频编写 API,支持音频和视频以及 Tr 脚本兼容性。

视频读取器是一个迭代器,可以与工具结合使用,实现高级视频读取模式,例如在指定时间戳后读取下一个 10 帧,或跳过视频的每隔一帧,或读取两个时间戳之间的所有帧。

这个新的视频读取 API 当前作为 beta 发布,其 API 可能会根据用户反馈而改变。

我们在 GitHub 上的示例中有一些新功能的附加示例,您可以找到 Vi Read API 及其转换的笔记本。在 Tro vision 中,我们欢迎任何贡献。如果您发现错误,或者有改进或新功能的请求,请通过 ToVision GitHub 页面的问题跟踪器告诉我们,或通过拉取请求贡献。

🎼感谢您观看,希望 Torch Vision 能帮助您构建利用 Torch 的出色新应用。

Pytorch 进阶学习讲座!14位 Facebook 工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P11:L11- PyTorch 性能 - ShowMeAI - BV1ZZ4y1U7dg

🎼。

你好,我是 Naal Gahan,是 Facebook 的应用研究科学家,我在 Pytorch 性能方面工作。今天我将讨论低精度支持和我们在 Pytorch 中实施的新性能改进及操作基准测试。因此,低精度支持。😊。

在现代硬件上,你可以牺牲一些精度,以获得显著更好的性能。Pytorch 使得处理低精度数据类型变得简单方便,并支持量化,但这在其他地方有详细介绍。我将主要讨论 T32 和 FP16 数据类型,而 FP16 在 CPU 和 GPU 的无方向开发上已经得到了支持。

右侧的图表显示了相应数据类型的内存表示,绿色框是指数位,红色框是有效位。😊你可以看到 FP16 可以用八个指数位表示广泛的动态范围,其动态范围与标准 FP32 数据类型相同,但只有 7 个有效位的有限精度。FP16 则作出了相反的权衡,具有有限的动态范围和更好的精度,而 T32 则兼具两者的优点。

它的动态范围与标准 FP32 数据类型相同,但与 FP16 一样有许多有效位。T32 在新的 MPR GPU 上启用,支持 32 位存储,因此标准网络在计算密集型操作读取输入数据时可以透明地受益,只读取 10 位有效位,因此存在一些精度问题。

然而,内部累积发生在 FP32 中,因此我们不期望转换会受到影响。你可以开启和关闭 T32,以观察其对性能和转换的影响,使用下面的评论与基准测试,Hi face Roberta 模型大约提高了 3 倍的速度,而在 ResNet 等较低复杂度的模型中则提高了大约 2 倍,相比于同一硬件上的 FP32 性能。

TF32 开箱即用,无需对现有脚本进行修改,这非常好。然而,如果你愿意稍微调整现有脚本,以实现更好的性能,FP16 将会很有用。自动混合精度现在在 Pytorch 中得到支持,该功能源自由 NVIDIA 维护的流行 ABIX 包。

🤢它自动化训练 FP16 网络,并处理由于 FP16 训练中的有限动态范围而产生的数值问题。Pytorch 旨在覆盖广泛的用例,支持对无偏梯度的操作,支持对稀疏梯度的操作。更高阶的自动梯度可以通过 Torch 的 autograd 计算,支持自定义 autograd 函数。

如果你有涉及多个模型和多个损失的复杂脚本,Python和C++路径都被支持。同时,示例和文档可在Pytor的网站上找到。

这是一个使用amp的简单示例。有两个重要部分。第一个是控制所有缩放的标量对象,第二个是M Autotocast上下文管理器,所有缩放都是为了确保转换和数值稳定性,Autocast上下文管理器确保mods和卷积以FP16运行,从而在进行需要全精度的操作时以FP32运行,达到最佳性能。

最后,调用优化器步骤的语法稍有不同,你还必须更新下一次迭代的低缩放,如这个代码片段所示。但总体来说,所需的代码更改非常少,你应该能够实现比TF32更好的性能。如果P16在所有的GPU(如Volta)上都得到支持。

现在让我们转到下一个主题,即在许多后端和数据类型中,通道丢失。例如,T32和我们刚刚讨论的FP16,当数据以通道丢失格式时,卷积性能最佳。Pyr支持通道丢失的物理内存格式,同时保留维度的传统语义意义,例如对于四个维度,我们的第一个维度仍然是批次元素的数量,第二个维度是通道,其余是空间维度。

为了充分利用通道SA支持,模型中的所有或大多数操作必须支持通道SA,而Pytor中大多数操作都支持。例如,在TorchVision中,一个流行的模型就是涵盖的。

这里有一个小示例,展示了如何通过调用辅助函数将模型转换为通道Los格式。输入也必须是通道Los格式,因此你必须修改数据加载,以直接提供通道丢失的输入,或在脚本中手动对输入调用转换函数。

输入布局在大多数操作中被传播,因此网络中的中间变量将保持通道快速。复制和张量工厂操作也保持布局,如这里的示例操作所示。类似于张量工厂的操作也会逐点保留其输入的布局,而复制操作也会以与输入相同的格式生成输出。对于卷积网络,你可以预期通过切换到通道成本获得约20%的收益。

我们在Pythr forage APIs中实现的另一个有趣特性是提供了对批量张量的高效逐点操作。与其为批量中的每个张量启动一个小内核,不如为每个张量启动几个较大的内核,每个内核处理多个张量。这种模式在优化器中尤其常见且有用。

即使现在,如果您将张量复制到连续的内存区域,然后直接在该连续内存区域上进行操作,您也可以避免启动多个内核。但这需要额外的内存,并且如果每次操作的张量子集不同,可能会变得脆弱,因为每个操作直接在不相交的内存区域上进行,并且可以在每次应用前廉价地组装列表。

这里是比较在循环中对张量批次和forage操作的时间线。循环的GPU时间线显示在底部行。您可以看到这里的GPU大部分时间处于闲置状态,内核非常短,但大多数情况下是在内核之间的空闲时间。CPU则不断忙于启动这些小内核。

相比之下,当我们使用4H APIs进行相同的操作时,GPU总是处于忙碌状态,并运行相对较大的内核。CPU一开始在提交这些内核时忙碌,但随后在其余时间内处于闲置状态,而上方的时间线仅显示处理的少量张量,在下方的时间线中,在相同的时间内处理了几百个张量。

Poche 107使用forage APIs实现了通用优化器,能够实现约从3到6倍甚至更大的加速,具体取决于网络中的参数数量。forage也易于使用,可以实现您自己的优化器,或者如果您网络中的模式需要对不规则批次的张量进行操作。

所以,试试看,将您的优化器替换为基于forage的,并查看它是否能改善性能。最后,让我们谈谈基准测试工具。Pytorch基准测试工具是针对Pytorarch用户和开发者的。当然,您也可以自己开发基准测试工具,但这需要处理一些问题。您希望基准测试运行足够长的时间,以获得可靠的时间和测量结果。

但您不希望它们永远运行,您需要收集统计数据以估计测量中的噪声。您需要确保您比较的是同类项,所有同步调用都已执行,且CPU上的多线程得到了适当控制。

如果你是一名开发者,正在为 Pytorach 开发新操作,或者在处理现有操作,你需要确保在各种输入大小下性能良好,而不仅仅是针对某一特定输入大小进行超优化。完成所有基准测试后,你可能会面对一大堆难以分析和表示的数字,因此你需要一些后处理数据的方法。我们的基准测试工具使所有这些事情变得简单。这个代码片段展示了如何使用计时器和比较 API 来比较性能。

对于两种相似的 pytharch 操作,如 take 和 gather,针对不同数据类型的计时器 API 是基于 Python 的时间模型,因此它们应该显得很熟悉。它们还提供了一些附加选项,可以包含元数据,以便后续分析更为简便,幻灯片左侧显示了该脚本的输出,时间以表格形式展示。

我们希望你会觉得我们的基准测试工具很方便。

这里是一些资源,你可以用来获取更多关于我提到的话题的信息。

感谢你的聆听,希望能在 Pyr 的性能讨论中见到你。

Pytorch 进阶学习讲座!14位 Facebook 工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P14:L14- PyTorch 移动和 Android 神经网络 API - ShowMeAI - BV1ZZ4y1U7dg

🎼。

嗨,我是 Ollly,Android 机器学习的产品经理。今天我将与您谈谈 Pytorch 对 Android 神经网络 API 的支持。在设备上进行机器学习可以带来一系列好处。通过将计算移到数据本地,我们可以提高隐私保护。

确保我们的功能在间歇性连接情况下也能正常工作,并减少延迟。这带来了诸多好处。😊。

但在移动设备上,我们始终面临功率限制。因此,尽可能高效地进行计算至关重要。

幸运的是,现代设备拥有一系列专业芯片,能够真正提供帮助。😊 GPU、DSP 和新型专用的机器学习硬件加速器,通常称为 NPU,可以在不单独使用 CPU 的情况下提高功率效率。这些芯片各自适合不同的任务,不同的移动设备可以配置不同的芯片组合。这种复杂性可能使得在所有用户中推广一个功能变得困难。

因此,Android 神经网络 API 提供了一个一致的计算卸载接口。右侧的图示展示了一个示例架构。应用可以调用机器学习框架或直接调用神经网络 API。然后图形根据设备在运行时的能力进行分区。

这些分区随后被传递给特定的供应商驱动程序代码,以根据所使用的硬件优化调用。我们一直在构建这些功能,在 Android 11 中支持超过 100 个操作,包括 LSTM。我们有浮点和量化数据类型,现在可以在图中直接使用 if 和 while 构造实现控制流。诸如服务质量、异步命令缓冲和内存域等功能使工作负载的优化变得更加广泛。

我们还将 Android 神经网络 API 制作成了可升级模块。这意味着我们可以在 Android 版本发布之外进行更新,以更好地跟上机器学习社区的步伐。机器学习的进步以及更强的加速可以在开发功能时带来显著的好处。MLKt 在从 CPU 切换到使用 API 后,看到延迟减少了 9 倍。

Google Lens 团队在将其 OCR 模型切换到 API 后,看到近 4 倍的性能提升。我们希望将这些好处带给尽可能多的开发者,因此很高兴 Pytorch Mobile 已经增加了对神经网络 API 的支持。

利用Pytorch Mo,你可以获得相同熟悉的Pytorch API,而无需编写本地C代码。你可以直接从CPU卸载到专用硬件,以在Android生态系统中获得最佳性能。那么,如何开始呢?其实非常简单。

首先,下载Pythtorch mobile夜间版本,然后转换你的模型。

这只是一小段代码,如此展示。你需要使用你的torchscript模型。创建一个输入变量以匹配输入形状,然后将布局设置为N HWC。接着你可以转换你的模型。可选地,如果你愿意,可以将输入打包,以便于基准测试。最后。

保存你的模型,你就可以开始使用了。

当进行运行时推理时,如果你使用基准测试或直接在你的应用中,则不需要任何代码更改。只需将现有模型切换为新的N& API模型。实时分割是一个可以真正受益于硬件加速的功能。想象一下,在虚拟绿幕效果中,试图从背景中识别前景用户的场景。

你希望持续运行此功能并保持低延迟,以提供响应迅速的用户体验。但通常你还会同时进行大量并行计算,例如视频合成效果。Facebook Messenger团队现在正在测试N API,以用于他们的沉浸式360背景功能,利用新的Pytorrch mobile能力。他们看到延迟减少了两倍,功耗也减少了两倍。

初始版本支持一套强大但小型的功能。它支持Android 10+设备,线性卷积模型,如Facebook Ne和多层感知器模型。此外,团队正在全力以赴开发下一组功能,包括更多的操作符类型,支持流行的mask RCNN模型以及优化CPU路径的回退。

团队还在调查对早期设备和控制流语义的额外支持。这是对Android神经网络API的新Pytorj mobile支持的简要概述。今天下载Pytorch mobile夜间版本,开始测试代码。请务必提供你的反馈。

想要了解更多关于Android Ne网络API的信息,请查看Android NDKDevelop文档;想了解更多关于Pytorch mobile集成的信息,请访问Pytorch mobileDevelop页面。

🎼我们迫不及待想看到你如何利用Pytorch mobile的全部硬件能力,在Android上创造出令人惊叹的机器学习驱动体验。谢谢你。😊。

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P1:L1- PyTorch 中的复数 - ShowMeAI - BV1ZZ4y1U7dg

🎼。

嗨,大家好。感谢你们今天让我来这里。我的名字是Anjuli,我在Pytorch团队工作了过去一年,参与了一个令人兴奋的项目。这个项目就是复数,今天我们将讨论的就是这个话题。所以直接开始吧,让我们聊聊复数是什么。

你们中的一些人可能已经熟悉复数。但我会简单回顾一下,以确保我们在同一页面。😊。

复数是可以表示为 a + b 的数字,其中 A 和 B 是实数,I 是单位虚数,等于负1的平方根。所以现在我们已经确定了复数是什么,让我们谈谈它们的应用领域。复数在多个领域都有应用。

特别是在数学、物理和工程领域,量子力学和信号处理是你可能熟悉的一些例子。感谢欧拉,他提出了这个神奇的公式,如屏幕上所示,将虚数与正弦和余弦项联系起来,例如。

这个关系可以用来将标准的余弦波方程重写为两个复指数的乘积,这通常简化了相关的数学计算,因为复指数比它们的正弦对应物更容易处理。😊我们还可以在深度学习领域中从复数中获益。

最近关于神经网络的工作和旧有的基本理论分析表明,复数可能具有丰富的表示能力,但由于Pytorch缺乏原生复数支持,使得解锁这种潜力变得更加困难。在Pytorch,我们致力于赋能我们的用户,我们的理念是使事情易于使用,并为用户扫清困难的障碍。随着我们收到对复数支持的请求。

我们决定对此采取一些措施。以下是我们多年在Pytorge讨论论坛收到的一些请求。稍后我们会讨论这里列出的一些内容,但我想特别强调的是,这是一个以社区驱动的项目,我们根据社区的持续反馈来优先考虑我们构建的功能,并与社区合作进行实际开发。

我们从社区听到的意见归结为三个主要点。这是添加原生复数支持的动力。第一个是自然表示。历史上,我们将复数表示为两个实数的元组。但我们听到许多用户反映,使用这种约定编写代码实在太累了。

因此,我们希望引入一个 API,使得在 Pytorrch 中处理复数变得更简单,同时让代码更易于维护。其次是复数功能。如果你想为复数操作提供类似的支持,并利用 Pytorch 在加速器上运行的能力。😊到目前为止,我们还在 CPU 和 GPU 上添加了许多专用内核,以优化复数操作。

事实上,在 CPU 上,我们也支持复数操作的复用。第三是自动微分。正如我之前提到的,我们希望支持神经网络研究,因此我们正在努力添加复数自动微分支持,这在优化问题中是非常有帮助的。

那么,让我们来看看复数张量如何简化我们在 Pitorrch 中的生活?

那些在 Pytorch 中查看过谱图的朋友,可能对右侧的代码比较熟悉。显示的张量展示了我们历史上在 torch 中如何表示复数。正如你所见,它看起来笨重、丑陋且难以阅读,实际上没有理由不在 torch 中使用复数数据类型。因此在 Pytorch 1.6 中。

我们引入了两种本地复数 D 类型,complex 64 和 complex 128,分别对应于 float 和 double 数据类型。我还想提到,新增加的第 15 模块中的函数,迈克尔稍后会讲到,支持复数。现在,拥有本地复数支持的另一个好处是,你不再需要编写所有麻烦、耗时且容易出错的解决方法。

在我们最新的版本中,许多常见操作,如 Mamall、SVD 等,已经为我们的复数用户提供了支持。我们还添加了核心属性和张量构造函数的支持,以便提供自然的复数支持,正如你在 Ny 和 Python 中所熟悉的那样。

右侧是使用本地复数支持编写的 Facebook 代码函数的示例。代码的细节并不重要,重要的是我们不断添加功能,以优先满足社区认为有价值的用例。

😊。

这里是我们迄今为止添加的一些操作符的示例。正如你所见,我们已经支持了许多线性代数操作、三角函数操作和代数操作,并且我们不断努力添加更多。

而且不仅如此,在最新版本中,你还可以对复数函数进行微分。

对于那些熟悉复杂微分的人来说,我们计算共轭词导数;对于那些不熟悉但希望能够使用复杂参数的优化器的人,我们为你提供了梯度约定,现有的优化器可以开箱即用,处理优化实值目标的常见情况。如果你只是好奇想要编写自定义梯度函数,可以查看我们网站上的复杂自动微分文档。

这就是我们今天的现状,展望未来,我们正在积极工作以支持分布式计算,这将帮助我们实现更大的性能提升。😊 我们还在扩展复杂操作符的覆盖范围,并努力为torch audio添加本地复杂支持,因为它使用了大量的复杂数字。

所以我希望我们能让你对在Pytorch中使用复杂数字感到兴奋。我们在网站上提供了文档以帮助你入门,所以请尝试一下,给我们反馈,让我们知道你的想法。我们收到的每一条反馈,如每一个bug报告和每个“这很奇怪,我们不明白为什么会发生”的意见,对我们都非常有价值。我们在Github上还有很多有趣的讨论,如N N模块的冲突支持,你可以参与其中。

如果你想请求新的功能或加入这个精彩的贡献者社区,请在Github上查看我们。我们一直在监控Github上的复杂表格。因此,提交新问题和参与讨论是让我们知道你希望在即将发布的版本中看到什么的好方法。我想以感谢我们出色的开源贡献者为结束,感谢他们为Pytorch添加了大量的冲突支持。

😊。

感谢你今天的收看和关注。

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P2:L2- 使 PyTorch 更加“与 NumPy 兼容” - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我是 Mike Ruberry,Facebook 的一名工程师,负责 Pytorrch。我将谈谈我们如何使 Pytorrch 更加兼容 Numpy。在这次简短的演讲中,将分为三个部分。首先,我将描述 Pytorrch 兼容 Numpy 的意义以及我们的目标。在第二部分,我将谈谈我们在 Pytororch 1 中的许多新操作符和更新的操作符。

使其成为迄今为止最兼容 Numpy 的 Pytorch 版本。在第三部分,我将简要谈谈我们在 Pytorch 1.8 及之后的发展方向。那么让我们开始讨论 Pytorch 兼容 Numpy 的意义。对于那些不知道的人,Numpy 是一个流行的 Python 包,用于处理数组,或者说 Pytorch 所称的张量。

它的 API 是众所周知的,这使得许多首次使用 PyTtororch 的用户感到熟悉。通过使 Pytorch 兼容 Numpy,这意味着它实现了与 Numpy 相同的功能,并且这些功能的行为在 Pytorch 和 Numpy 中几乎相同。这意味着熟悉 Numpy 的人将已经对 Pytorch 感到熟悉。

使其直观易用。这应该让人们花更少的时间查看文档,而更多的时间开发他们的程序。

兼容 Numpy 的 Pyedtort 并不是一个新概念。从一开始,Pyedtort 就被设计成类似于 Numpy,正如这些代码片段所示,这两个包今天非常相似。然而,Pytorch 和 Numpy 之间存在小差异。例如,如前所述,Numpy 所称的,Pytorch 称为张量。

在这个片段中,我们还看到 Pytorch 对数据类型的要求更为明确,要求在调用指数函数之前,指定张量 B 包含浮点值。

现在,我们可能会认为 Numpy 兼容性的目标是消除 Pytorrch 和 Numpy 之间的所有差异。但实际上并非如此。Pytorrch 和 Numpy 之间将始终存在差异,因为它们关注不同的场景。例如,Pytorch 旨在在多个设备上运行,而不仅仅是在 CPU 上。它还可以在 GPU、TU、移动设备和自定义 ASIC 上运行。

Pyitetorch 也旨在运行神经网络。神经网络通常比科学程序以较低的浮点精度运行。最后,Pytorch 旨在支持 autograd,这有其特定的要求。例如,为了正确计算反向传播,Pytorch 必须保存中间计算结果。

在这种情况下,Pytorch 和 Numpy 之间将永远无法完全相同,但我们仍然可以努力使 Pytorch 尽可能类似于 Numpy。

现在,让我们谈谈在 Pytorch 1.7 中是如何做到这一点的,以及为什么这是我们发布过的最兼容 Numpy 的 Pytorch 版本。

这是因为我们添加了许多 Numpy 中存在但 Pytorch 缺失的新运算符,并且更新了一些 Pytorch 中行为与 Numpy 中相应运算符不同的旧运算符。例如,我们添加了一系列与快速傅里叶变换相关的功能。我们还增加了用于计算统计量的新函数,比如 Torcht Quantile。

我们有一些用于操控张量的辅助函数,如 Htac、Vt 和 Dt。我们甚至有第一类的零阶改良贝塞尔函数。我们还更新了一些运算符,比如除法,例如,在 Pytorch 中的除法现在与 Numpy 和 Python 3 中的除法兼容。

总是执行真实除法,而不是有时执行整数除法。😊 总的来说,我们在 Pytorch 1.7 中修改了超过 65 个运算符。

现在,我们的目标是什么?在 Pytorch 1.8 中,我们预计将增加或修改另外 38 个运算符。我们也希望扩展两个新模块。第一个是 Torch dot F of T 模块,包含我之前提到的快速傅里叶功能;第二个是 Torch dot lineal 模块,包含线性代数功能。我们还计划保持与社区的互动。

在撰写本文时,我们有 14 位活跃的社区贡献者。

从那时起,我们已经添加了几个新功能。这是一个让你也参与进来的好机会。如果你希望在 Pytorch 中看到 numpy 或 scipy 的某个功能,请通过在我们的 GitHub 上提交问题来告诉我们。如果你想通过贡献一个运算符来参与 Pytorch,请查看相关问题链接以获取更多信息。

再次感谢我们的社区贡献者。这个幻灯片已经过时,这很遗憾。但与我们出色的 Pytorch 社区合作,使 Pytorch 更加兼容 Numpy,最终让它更易于使用,这是一次很棒的经历。

所以再次感谢截至今年十月所有活跃贡献者的帮助和支持。🎼感谢你倾听这次关于我们如何使 Pytorch 更加兼容 Numpy 的演讲。

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P4:L4- PyTorch 分布式 RPC - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我叫沈丽。我是P团队的研究科学家。今天,我将讨论Py分布式包,并重点讲解RPC。这是我们今年引入的新特性。我将首先简要解释什么是RPC,然后介绍一些基本的RPC API。之后。

我将介绍如何使用RPC实现不同训练应用的高级思路。

好的,那么什么是PyRPC?PyRPC是一个通用分布式训练的低级框架。在此之前,分布式数据并行(DDP)一直是PyTorch为分布式训练提供的主要特性。然而,DDP是一种特定的训练范式,每个进程都有模型的完整副本,并将输入分配到多个进程。这种方式适用于许多应用。

但是,还有许多其他应用不适用于DDP。例如,如果你的模型太大,无法放入一台机器中,你将需要多机模型并行。这与数据并行不兼容。你需要手动在进程间发送中间输出和参数,并在应用代码中恢复所有必需的内容,这可能变得非常复杂。另一个例子是,有时我们需要将参数服务器与数据并行结合使用。

对于稀疏传感器使用参数服务器,对于密集传感器使用数据并行。仅用DDP无法轻松实现这一点。解决这个问题的一种选择是为每种用例添加不同的特性。然而,如果我们这样做,将会创建一个庞大的API表面,这可能会成为用户上手的障碍。同时,也会增加编写和维护的工程开销。

此外,我们无法完全预测未来可能会出现哪些新的训练范式。另一种选择是提供一组灵活的低级工具,允许用户进行即兴创作。所以这里推出了PyRPC。我们希望它能够填补那些无法使用DDP的分布式训练应用的空白。

如果有新的分布式训练范式被广泛采用,我们总是可以选择为其引入一个专用的高级API。

现在我们知道为什么要引入RPC。那么,RPC提供了什么特性呢?在1.7版本中,IP RPC包中已经有一长串特性。但我今天的讲座只会关注最基本的部分。第一个是远程执行。这允许你在特定的远程进程上运行用户函数。

这正是你期望从任何 RPC 系统中获得的。第二个是远程引用,允许你引用远程对象并传递它。使用远程执行而不传输实际数据。它充当离散的共享指针。第三个是分布式自动梯度。它将远程执行的本地自动梯度图拼接成一个分布式自动图。

这样,当你在一个进程中对损失张量调用 backward 时,它会联系所有参与的进程和机器,并相应地计算梯度。

这是一个非常高层次的解释。现在让我们深入了解更多细节。远程执行。它允许在远程运行可调用对象。在 Part sharp C 中,所有进程都是的。任何进程既可以是颜色也可以是协调者。在通过调用 RRPC 初始化后,任何进程都会在后台运行消息监听器,并使用线程池处理请求和响应。

此后,有三种方法可以远程运行可调用对象。RRPC 同步、RCA 异步和远程。RRPC S 以同步方式滚动 R PCC。它将阻塞,直到返回值在颜色上可用。另一方面,RBC ASync 立即返回结果的未来对象。第三个 API 是远程,也立即返回,但不是返回未来对象。

它返回一个远程引用,可以视为结果的离散共享指针。R PCC 异步和远程之间的区别在于,前者总是将结果取回到颜色。但是远程 API 并不这样做。远程引用将使结果在调用期间保持活跃。本页中的代码展示了如何将不同类型的可调用对象传递给 A R PCC API。

它可以是 Pythtch 构建的操作符,也可以是用户定义的 Python 函数或脚本函数。如果性能是一个问题,请使用脚本函数,因为这不会对全局解释器锁产生竞争,这意味着不同的 IP PCC 可以在调用上并发运行。远程引用。

远程引用就像一个分布式共享指针。它指向本地或远程进程中的一个对象,并将通过引用计数管理数据对象的生命周期。当一个调用希望将输出直接转发到另一个进程并避免将实际数据取回时,这非常有用。在这个例子中,worker Ze 充当协调者进程。

它在四个其他进程之间建立数据依赖关系,并且没有实际数据对象经过 W0。白色虚线箭头是轻量级的 R PCC 远程调用,而粗红色箭头是重量级的数据模式。我们来看一个远程调用,从 W0 到 W3。参数 R 和 RB 是来自 W1W2 的输出的远程引用,当在 RPRPC API 中使用 R 和 RB 作为参数时。

RRPC系统将自动在W3上分叉R和RB,并相应增加引用计数。在W3上,从W1和W2获取真实数据的成本为2,这将阻塞直到在W3中收到数据。通过这种方式,远程引用允许WDro在分布式环境中异步高效地设置功能执行和数据依赖。

远程执行和远程引用帮助应用程序在进程和机器之间拼接前向路径。Pytorch中的另一个重要组成部分是自动微分系统,它支持反向路径。RPC框架扩展了本地自动微分引擎,使其能够在分布式环境中工作,并提供分布式优化以更新应用程序中涉及的所有参数。

本地自动微分和分布式自动微分之间的一个区别在于,分布式自动微分引擎将梯度存储在专用上下文中,而不是存储在peri dotgrad字段中。对于同一组参数,可以同时存在多个自动微分上下文。这样设计的原因是,可能会有多个并发反向传递显示相同的参数,而在这种情况下。

我们需要确保这些反向传递不会相互干扰。因此,为了使用分布式自动微分,你需要首先创建上下文。在该上下文中创建的所有RPC将携带上下文信息,这将帮助调用者和同事在反向路径中找到彼此。

在右侧的这个工具示例中,它首先使用两个远程调用来创建两个千米,并使用千米远程引用列表初始化分布式优化。之后,它通过简单地从所有者获取参数并将它们相加来运行前向传递。

然后它将损失张量输入到分布式自动微分反向函数中。该函数计算分布式自动微分图中所有参数的梯度,并将梯度存储在上下文中。最后,我们可以将上下文ID传递给分布式优化步骤函数。该函数将联系所有参数的所有者,从上下文中检索相应的梯度,并使用提供的本地优化更新参数。

在这种情况下,它是STGD。如你所见,分布式训练的API与本地训练非常相似,唯一的区别是你需要为其创建一个上下文。

鉴于所有这些新工具,你能用它们做些什么?

这解锁了许多在Pythtorch上离散的训练场景,我将简要描述其中三个。第一个是参数服务器,你可以有一个参数服务器,或者多个分片的peri服务持有参数,然后可以有多个训练者运行训练集成。

R PC框架可以帮助将它们连接在一起。另一个例子是分布式模型并行。在这种情况下,模型可能无法适应一台机器。在这种情况下,你可以将模型分割成多个子模块,并使用RPC和RF将它们拼接在一起。第三个例子是管道并行。你可以使用R PCC中的异步API来处理一个批次,然后在多个批次上同时运行干预。

这些用例都有教程可用。好吧,这就是关于Python Sha PCC的非常简短的介绍。在这个讲座中,我希望确保至少向你传达一个信息,那就是,如果DDP不足以满足你的用例,请尝试P tryC。我们有很多教程。

我们还有一个全面的API页面。我们每天都在积极监控数据问题和论坛关于RPC的提问。所以如果你遇到任何问题,请告诉我们,如果Pyth RRPC有任何改进的空间,也请告知我们。

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P5:L5- PyTorch 分布式数据并行 (DDP) - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我是Priam themania,我是Facebook的一名软件工程师,正在研究Pythtos Dis,但今天我将详细讲讲Pyths Dis。关于议程,我会谈谈分布式数据并行,简称DP,以及CTND,这是一种分布式通信库。然后我会讨论一下PythOs分布式的未来工作。

首先,让我们快速回顾一下分布式数据并行。如果你有一个足够小的模型可以适应单个GPU,你会使用分布式数据并行在大规模的数据和多个GPU上进行训练。你会在多个GPU上复制这个模型。

运行前向和后向传播并行处理,得到梯度后,所有的rank会进入一个同步梯度操作,以聚合所有的梯度。接着,你会继续其他迭代,进行更多的前向和后向传播以及同步梯度操作。

这只是一个快速概述,现在让我们谈谈未来的改进,DP的一些新进展。第一个是DP通信钩子。这个功能允许你完全覆盖我刚才提到的同步梯度操作,因此你可以注册一个Python可调用对象,然后根据你想要如何聚合梯度来添加任意逻辑。这里有一个例子,如果你想在通信之前对梯度进行FP16压缩,你可以有这样的一个可调用对象,首先压缩梯度,将其转换为float 16,进行全局归约,最后再解压回float 32。这是一个例子,你还可以做更复杂的事情,比如gossip gridd,这是一种非全同步的SD算法。

好的,下一个项目是DP对不均匀输入的支持,所以如果你在不同的rank中有不均匀数量的批次。通常发生的情况是,一些已经完成其数据的rank不会进入这个同步梯度调用,而其他仍在处理数据的rank则会进入这个调用,结果会导致挂起或某种超时。因此,这在DP中一直是一个长期存在的问题,许多Pythto用户对此表示不满,现在我们对此有了修复,你可以使用这个在这里显示的模型或联合上下文包装器。这确保了一旦某些rank完成了数据处理,它们会执行一系列虚假的同步操作,以匹配仍在处理数据的其他rank,这确保所有rank能够同时完成他们的处理,这真是太好了。

这是处理训练中不均匀输入的一种方法。然后我们有一些针对DP的内存优化,因此今天的DP会创建一堆桶,将参数批处理在一起以进行一次更高效的全归约调用,但DP所做的是为这些桶创建整个梯度的副本,因此如果你有一个一GB的模型,你将拥有大约一GB的参数。

一GB的梯度,DP会再占用一GB,因为它会创建这些梯度的副本。为了避免这种情况,我们引入了一个新的参数D,称为梯度桶视图,因此这使得你的参数的dot grad字段成为桶的一个视图,这样我们就只拥有一份梯度副本。

接下来我想谈谈将DP与RPpC结合使用,因此在他的演讲中,Shan描述了RPpC框架以及它如何用于分布式模型并行,而DDP用于分布式数据并行,所以现在我们可以将这两个框架结合起来,形成更复杂的训练范式。如你所见,在这个例子中,我们有一个DP模型,这个模型被包装在DP中,因此这个模型被复制,然后我们在worker1上有一些远程参数,所以现在如果你想训练这个模型,你需要在前向传播中设置分布式优化器,你检索RF,通常是通过RPpC来检索的,然后将其输入到DP中,计算损失,然后运行反向传播和优化步骤,这将执行反向传播,它将跨所有副本聚合梯度,然后还会更新远程参数。

它也会远程运行优化器。如你所见,你可以非常顺利地结合这两个框架。

好的,现在我想谈谈 DP 中的动态分桶。DP 会将参数分成多个桶,如我刚才提到的,它假设反向传播的顺序是模型参数的反向顺序。当它构建这些桶时,如果这个顺序不成立,而在许多模型中确实是这样,那么桶就不会以最佳顺序构建,结果可能是桶 2 在桶 1 之前准备好,随后桶 1 需要等待才能调度它的全归约。这会导致性能 suboptimal。为了解决这个问题,DP 现在记录了第一次反向传播中的参数顺序,并以最佳顺序重建桶,这样你就可以更优地调度全归约。因此,在像 B 和 Roberta 这样的模型中,性能提高了大约 3% 到 7%。

然后,最后是一些杂项改进。我们在 niel 中添加了更好的错误处理,通过几个环境变量进行配置。你可以查看文档以获取更多细节。我们在 C&D 中有一个分布式键值存储,主要用于会面和协调,所以我们主要只是规范化了这个 API,并为用户添加了一些好的文档。我们为 CTD 添加了 Windows 支持,我想感谢 Microsoft 的贡献。

那么,现在在 Py 分布式中即将推出的内容是什么呢?这可能是在短期内,比如 Pytch 1.8 或 Pytch 1.9,我们将添加点对点通信支持和进程组以及 C1D。这是基于 nichels 的点对点发送和接收支持。我们还将为 RPpC 框架添加原生 GPU 支持,这样你就可以无缝地通过 RPC 发送和接收 GPU 张量。我们将为分布式模型并行性添加一个远程模块和远程设备类型的 API,因此如果你想将一个模块或模型的一部分放在不同的主机或 GPU 上,你只需使用远程模块来实现,这将是一个不错的高级 API。

我们将为 Pytch 添加管道并行性,这是一种非常流行的训练模型的方法,适用于不能在单个 GPU 上运行的模型。因此,这对于训练更大模型将非常有用。最后,我们将添加 C&D 扩展以支持第三方集体通信库,我想对此表示感谢。感谢 Intel 的贡献。好的,这就是短期的计划。

如果我们考虑更长期的规划,也许是一年之后或更长时间,我们正在考虑在 Pyth 分布式中添加零样式训练框架,以支持真正的大型模型。这是一个非常有趣的范式。

这是由微软提议的,我们正在尝试将其纳入Py分布式,然后计划添加内部并行性,因此这是一种非常有趣的技术,曾被NviDdia的Megatron用于训练大型变换器模型,我们还计划为C1D API添加类似的支持。

所以今天如果你有一个非常复杂的模型,模型内部有一些集体通信,你无法真正对该模型进行处理,因为这对于C1D API来说是不可能的,因此我们计划添加对这一点的支持,此外我们还计划为DDP添加自动调优,因为DDP有许多参数需要手动调优,例如我提到的桶的大小,因此我们计划添加一些自动调优功能,用户不必为特定环境调优DP。

然后我们有一个叫做混合并行性的想法,我们计划确保像管道并行性、模型并行性、数据并行性以及内部并行性能够无缝协作,以便用户可以灵活组合,找出最适合他们的训练范式。

接下来,一旦你有了混合并行性,我们是否可以完全自动化这一过程,用户只需提供模型和训练资源,然后我们就可以找出最适合该模型的混合并行性组合,用户无需担心。

最后,我想分享这页关于Pyth分布式概述的页面。这是一个包含Pyth分布式所有信息的地方。我一定推荐你去查看一下。

🎼这就是我所要说的。非常感谢你们的观看!

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P6:L6- TorchAudio - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我是Vincent Kenville Bellair,我是Tordu的技术负责人。这就是我今天要谈论的内容。Torruio的目标是为其他研究人员和工程师提供构建模块,使他们能够将研究带入生产。

通过这种方式,Tortrivio 可以加速其他开源生态系统库的开发。Toorodo 是围绕以下核心功能构建的。第一个功能是IO,用于从各种文件格式(如MP3、wave、FL和SP)读取和保存张量。我们还可以下载并使用常见的音频数据集,样本在使用torch多进程工作时并行加载。

第二个功能是用于音频和信号处理的变换,例如谱图和FCC。变换作为Tor2 dot transforms中的神经网络模块提供。由于变换是使用纯Pytorch操作编写的,因此计算可以在GPU上进行,并可以使用Trchcr进行编译。

第三个是Sox和Cdi兼容性。Sox和Cdi是用C++为Sox编写的音频处理库。我们提供接口以使用它们的变换进行CAdi的操作,支持读取和写入CAdi二进制文件,以及提供与谱图、Ns NF bank等同等功能。

最终的功能是模型的分发,以及用于主要任务的分布式训练的标准示例管道。

如我所说,第一个功能集围绕IO展开。

这是一个使用双重编码和变换的小片段。波形变量是一个张量,它是从文件中读取的,文件的相应采样率作为标量读取。变换谱图的输入参数用来配置其行为。然后将输入张量传递过去,计算得到谱图张量作为输出。

我想强调的特别之处在于,变换不仅是标准的torch模块,因此可以使用Jit进行编译,而加载函数使用torch minings,因此也可以在支持Git的地方编译和移植。目标是使整个管道能够轻松在生产中使用Jit。😊。

我们支持针对不同任务的多个数据集,例如用于语音识别的库语音和用于文本到语音的库TTS。

我提到的下一个功能集是变换,正如我之前所说,它们是用纯Pytorch编写的,因此支持批处理、torch grip和GPU。这里是另一个例子,由于每个变换都是一个torch模块,因此它们可以组合在一个标准的顺序包装器中,以方便数据增强。

在这里,我们获取一个声谱图,应用随机时间拉伸,计算复数范数,应用随机频率掩蔽和随机时间掩蔽,然后将幅度转换为分贝。频率掩蔽和时间掩蔽是声学信号处理的一部分,这就是我在图像中展示的内容。一段频率和另一段时间被随机掩蔽。

代码被分为执行计算的功能和一个变换,后者是一个NN模块,包装每个功能并保持其状态。这里我列出了一些我们最近添加的新功能。例如,你可以看到用于频率和时间掩蔽的maone轴。我们还有几个在信号处理或语音执行检测操作中使用的双通道滤波器,以检测语音。

下一个功能是与socks和qualitydi的接口。

对于suck,我们提供了一种直接在Pytorrch中以torchscriptable方式使用其效率加操作的方法。例如,这里我正在对Pytorrch张量直接应用增益、速度、速率变化、填充和修剪的效果。对于CAdi,Torrode为Torrodo转换提供了一个包装器,模拟提供给CAdi二进制文件的标志。

你还可以通过Torrojiio读取Arc和SCP文件,以便CAdi的处理输出可以在你的Torrod程序中使用。CAdi在Aio社区中使用非常广泛,因此我们希望简化与它的接口。

我想谈论的最终功能集是库中模型的添加。

对于语音识别,我们添加了一个使用Lib语音数据集和Wa到字母模型的语音识别训练示例管道。对于文本到语音,我们添加了基于WaR&N模型的vcoder,以及在示例文件夹中使用Libris TTS数据集的示例训练管道。对于源分离,我们添加了COVtizedNe模型和一个使用华尔街日报混合数据集的示例训练管道。

在结束之前,我想强调几个在我们路线图上的功能。

首先,由于社区的需求,我们希望包含质量音调特征提取。其次,我们有兴趣包括一个波束涌现解码器接口,这对语音识别应用尤其有用。最后,用户请求的另一个损失是添加RNN转导损失。

要使用和了解 Pytorch,你可以访问 Pytorch。它包含关于 API 的文档、安装说明、教程以及链接到 GitHub 页面。我们还有一个新的语音命令识别教程,玩得开心!Torchd 兼容 Linux、Mac OS、Windows,并支持 Python 3。

6 及以上,就像 Pytororch 一样。

感谢观看。

Pytorch 进阶学习讲座!14位Facebook工程师带你解锁 PyTorch 的生产应用与技术细节 <官方教程系列> - P7:L7- TorchText - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,欢迎参加2020年的PyTch开发者日。我叫乔治。我是Facebook的一个软件工程师,工作于Pytot的文本领域。我在Facebook的工作是支持PyToch用户,特别是在文本领域,从研究到生产。因此,在这次演讲中,我将讲解2020年的一些主要更新,并帮助你了解我们的工作如何促进你的研究和PyToch的生产。

那么为什么我们希望在Pyth之外有一个文本领域呢?首先。我们希望加速NLP研究,并为前沿研究提供一些可重用的正交和正确的构建块。基于我们对文本领域和研究社区的了解。我们希望与内部团队和外部开源社区合作,建立一个更好支持的管道。

同时支持Facebook的产品和外部研究。其次。😊。我们希望提供一个解决方案,将研究转化为生产。我们在这里的意思是将这些管道和模块与广泛的py能力集成,如touchscript量化、分布式数据并行和移动。我们的目标是为大多数NLP管道的研究到生产过渡提供更好的支持,第三,我们希望与社区互动,探索新技术。

正如人们所注意到的,NRP领域发展非常迅速。所以Pyth团队希望在NLP领域发展良好的技术理解,并建立新的研究合作。为了未来的社区。考虑到这些,我们提供了对数据集的便捷访问、文本处理管道和一些与NLP相关的模块。所以如果你有时间,请逐一查看这些内容。

我们的行文本数据集和转换。还有一些与NP相关的模块,我会逐一和你讲解。

好的,所以新的数据集在文本中。我们也重写了一些现有的数据集,在文本夜间发布中。所以在这里。对于夜间发布,我们将这些新内容视为原型。因此,我们将很快发布这些新的数据集。😊,很快就会发布。所以这里展示的新数据集与Py中的数据加载器完全兼容。

用户将能够灵活构建数据处理管道,并使用一些标准的分词器和词汇块。好的,在这里我列出了我们beta发布中可用的新数据集。与此同时,你可能会想,一旦我有了这些原始数据,我该如何将其转换。

像张量可以用于训练模型,所以在这里我们提供了一些改进的性能,我们提供了一些具有改进性能的数据管道。使用一些 C++ 扩展。因此,这里的目标是我们希望能轻松转移到生产环境。以下是使用 PyTorch 和 Torch Text 的一些端到端管道的概述。原始数据字符串被读取并发送到字段转换,这里您可以看到分词器。

词汇,向量占用和转换癌症,对吧?

目前我们正在将此数据处理转换重写为一个正交构建模块,并与 G 端口结合。因此,在这一步之后,我们称之为预处理。数据被发送到数据加载器和采样器,在那里我们生成。它们有学士学位。然后数据就准备好供模型使用。因此,我们尽力将这些写成一个构建模块。

单独的构建模块,这样您将拥有完全的灵活性来将它们组合在一起。通过 C++ 扩展,我们能够支持所有这些转换的 Gt。我们相信这对生产环境提供了更好的支持。好的,现在我们进入与 NLP 相关的模块,我们在 Torch Text 中发布了新的多头注意力模块。

除了丢弃替换之外,如果您在 PyTorch 库中使用多头注意力,我们支持丢弃替换,因此您可以轻松地从 PyTorch 的多头注意力切换到文本的多头注意力。此外,新的多头注意力容器也适用于 Touch 脚本。根据用户的反馈,我们添加了增量解码和广播支持。

这个新多头注意力容器的想法是为用户提供一些在变换器架构下的新颖研究理念。现在,变换器架构在文本、音频和视觉领域非常流行。我们希望能提供一个非常灵活的多头注意力模块,以便用户可以在不同的想法中应用它。这里我给您一个例子,展示如何将 PyTorch 的多头注意力切换到我们的 Torch Text 多头注意力容器。

仅通过这几行,用户可以更灵活地尝试不同的自定义组件,与多头注意力的概念相结合。您可以放置自定义的投影容器、多头注意力容器。O 技能狗产品。您可以在这个多头注意力容器中应用不同的想法。

好的,最后但同样重要的是。在我们的网站上,我们有几个与文本相关的教程,包括一个展示如何使用新的数据集进行文本分类分析的教程。请查看这些教程,了解如何将其写入 NLP 管道。请记住,我们也会更新这个教程,以展示如何构建 N 到 N 管道。

在视频的最后,感谢观看这个视频,并希望你享受今年的Pytor开发日,我们下次再见!

Pytorch进阶学习讲座!14位Facebook工程师带你解锁PyTorch的生产应用与技术细节 <官方教程系列> - P13:L13- PyTorch移动版 - ShowMeAI - BV1ZZ4y1U7dg

🎼。

嗨,我是大卫。我是Pytorch的一名工程师,今天我要谈谈我们在过去一年中对Pytorch Mobi所做的一些改进。具体来说,CPU性能的提升,我们对GPU的原型支持,扩展的文档和教程,以及关于移动推理加速器的一些消息。

首先,CPU性能。CPU是手机上最普遍的计算单元。它们也是最灵活的,在某些情况下也是最强大的。因此,CPU性能始终是我们在PyTtorch Mobi上的高优先级!

在过去的一年里,我们做了很多改进。这里是PyTtorch 1.3、PyTtorch Mobi的首次发布和最新发布的Pytororch 1.7之间的比较。作为基准,我们使用了mobileNet V2模型的浮点版本。最初,我们大约在250毫秒内运行此模型,但现在在最新版本中。

我们的速度超过了10倍,在15毫秒内运行此模型。因此,如果你将我们与其他一些移动推理框架进行比较,我们大约处于中间位置,考虑到我们与之比较的其他框架的高质量,我们对此感到相当满意。现在,手机的限制比服务器要多,因此我们不能运行所有花哨的编译器机制,以从模型中获得最佳性能。

你需要进行一些前期准备,以确保你的模型运行得尽可能快。

幸运的是,我们已经能够将所有这些内容打包成一个单一的函数,你可以调用它来获得最佳性能。它被称为为移动优化,使用起来非常简单,如你所见,只需从Pytororch导入它。你在模型上运行它,然后将生成的模型保存到磁盘。这将确保你执行诸如将批量归一化操作折叠到先前卷积中的优化。

预打包模型权重以获得最大吞吐量,并运行模型冻结以消除不必要的开销。我们希望在未来将更多优化添加到这个入口点。因此,这涵盖了模型的准备,但在运行模型时,你还可以做一些其他事情来提升性能。

我们最近发布了一个用于内存的缓存分配器。现在,PyTtorch的默认行为,无论是在移动端还是服务器端,都是一旦你完成了张量,它的内存缓冲区就会立即释放回系统分配器,在某些情况下,释放回操作系统,这对于内存效率非常有利。

但是如果你不断重复运行相同的模型,你可能会浪费大量时间快速释放和重新分配这些缓冲区,而缓存分配器则可以让你更明确地控制内存策略。😊使用方式相当简单,你创建这个缓存分配器对象,通常在加载模型时就会创建。

每次你要运行模型时,首先创建这个缓存分配器保护对象,确保你的缓存分配器在推理过程中被积极使用。你只需要这样做,我们观察到使用缓存分配器后性能提升在5%到20%之间。

当然,这会导致在推理运行时内存使用量增加,现在从CPU移动到GPU。

很多人可能知道,GPU在服务器端的机器学习中已经流行了一段时间,但几乎所有的移动设备也都有GPU,它们可以用于加速设备上的推理。在高端手机上,使用强大的GPU可以显著提升性能,但即使在配置较低的设备上,你也能获得其他好处,比如降低功耗和释放CPU以进行其他密集型操作,例如进行视频通话。

例如,今天我们发布了对iOS上使用两种不同API进行GPU推理的原型支持,我们有Metal,这是苹果的高性能低级GPU访问API,而在Android上我们有Vulkan,这是下一代跨平台GPU访问的开放标准。使用这些后端的方式是针对移动设备进行优化。

我们之前介绍的实用函数用于获取最佳性能,你只需传递另一个参数,告诉它你想使用哪个后端,它将为你的模型进行适当的准备。现在,当你运行模型时,还有几个额外的小步骤需要做。这个第一个示例是针对iOS的。当你获取输入张量时。

你需要调用这个.metal方法,将其移动到GPU,以便Metal可以访问它。然后在运行完模型后,你需要调用.CPUU将结果带回CPU进行进一步处理。如果你在Android上使用Vulkan的C++ API,你会做一些非常相似的事情。但如果你使用我们的Java API,会有更简单的方法。

在加载模型时,你只需传递一个额外的参数,即设备(device),告诉Vulcan模型将在哪个设备上运行,它可以在运行模型时自动处理输入和输出的移动到GPU和回退。现在,从GPU运行所获得的好处会因设备和模型而异,但举个例子,我们发现将ResNet 18模型从我们最佳的CPU实现切换到Metal后,性能提高了33%,在iPhone 11上表现尤为明显。

我今天最期待的发布并不是代码发布,而是我们扩展的文档和教程集。Pytorch移动的首要任务之一是让其易于使用和可访问,我们认为文档是实现这一目标的重要方式。因此,我将介绍一些可用的文档教程,其中一个最有趣的是Pytorch移动性能食谱,这是一个关于性能技巧和窍门的一站式资源,包括如何进行操作符融合和量化。

确保你使用最佳的内存格式。

确保你适当地重用内存。同时,如何设置基准测试,以确保你能够测量你的模型,并验证你从这些优化中获得的收益。我们今天还发布了针对Vulcan和Metal的教程,深入介绍如何正确使用这些API以获取GPU的访问权限。

我们还发布了一些演示应用,展示如何将Pytorch移动集成到应用程序中,这些应用可用于Android和iOS,并涵盖了一系列功能,如图像分割和机器翻译。

我们还发布了一个教程,展示如何在Android应用中使用自定义操作符,这到目前为止有点棘手,因为你必须配置Android NDK以使用外部依赖项。但这个教程将引导你完成这一过程并简化操作,这里有一个使用ROI对齐操作符在这个演示应用中运行更快的RCNN目标检测模型的示例。

我们今天发布的最后一项是让你可以访问移动推理加速器,这些加速器利用在GPU上运行模型的好处,将其提升到一个新的水平,但我将让下一位演讲者来详细介绍这一发布的细节,并留下相关链接以获取更多Pytorch资源。

在官网上,您可以通过手机点击查看我们的首页教程,然后查看我们的深入教程和教程食谱,移动设备将带您到食谱,这些是关于如何使用特定功能的小技巧和窍门。希望您在使用Pytorch移动版时玩得愉快,非常感谢。

Pytorch进阶学习讲座!14位Facebook工程师带你解锁PyTorch的生产应用与技术细节 <官方教程系列> - P9:L9- 最新的Profiler API和最佳实践 - ShowMeAI - BV1ZZ4y1U7dg

🎼。

你好,我叫Ellia,我是一名在Facebook工作的软件工程师,专注于PyOch。在这次演讲中,我将讨论PyTch Pror和我们最近添加的两个新功能。

那么Pytoch Pror是什么?Pytoch包含一个易于使用的工具,允许你测量模型操作符的运行时和其他性能指标。在一个简单的例子中,我们首先开始必要的模块输入,然后创建Gsite 18模型,正如你所看到的,我们在模型推理中。通过Profile Cons管理器。一切都在这个Conx管理器内部被分析,一旦你完成。

你可以打印出结果。在这种情况下,你会看到一个按操作符名称分组的表格,并且有一些关于自我和总CPU时间的指标。Profiler还具有更多功能,例如按操作符输入形状分组,支持CPU和GPU操作符,自定义标签代码范围。

并以Chrome JON格式保存跟踪。例如,如果你想查看操作符的输入形状,只需传递记录形状为真,并按输入形状分组。在这种情况下,我们看到多个操作符,例如卷积,具有不同的输入形状。

所以让我们检查最近添加的内存使用情况功能。除了测量运行时,Pror还可以用来测量模型操作符使用的张量内存量。只需传递Pro内存为真,然后你可以按CPU或Quda内存使用量进行排序。在我们的示例中,我们看到大部分内存被空操作符消耗。

这并不令人惊讶,因为我们使用这个操作符来创建新的张量。此外,Resize操作符也消耗了内存,它用于改变张量的大小。根据总CPU内存列,你可以看到还有其他操作符直接或间接调用空和resize。

但是如果你想知道的不仅是操作符,还有操作符在模型中的位置呢?

堆栈跟踪在这种情况下很有帮助。因此你可以只需传递stack2,然后按顶部和堆栈条目进行分组。在我们的示例中,我们看到有两个顶部Mkelian N卷积操作符。在源位置,我们不仅可以看到torch和M卷积模型内部的位置。

但也有两个不同的煤炭站点在原始Resnet模型脚本中。

如果你想了解更多关于Profilr的内容并查看更多示例,请查看我们网站上的Pror食谱,非常感谢你。

Pytorch进阶学习讲座!14位Facebook工程师带你解锁PyTorch的生产应用与技术细节<官方教程系列> - P10:L10- 使用TensorBoard进行可视化 - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我的名字是Si Chii Yan。我是Facebook Pytorch Model DevX团队的软件工程师。今天我要讲的是如何使用TensorBoard可视化Pytorch模型。以下是我演讲的议程。首先,我将概述Tensable API,然后深入探讨监控训练过程的API,以及模型监控工具的API。

最后,我将简要介绍一些当前正在开发中的功能。

总体来看,自Pytorge 1.2以来,我们已推出对TensorBoard的原生支持,自那时起,我们与Google TensorBoard团队建立了持续的密切关系。因此,Pythtor中的Tensor API非常易于使用。你只需初始化summerwriter并传入表示你想要记录数据的目录的锁定器。

这可以是本地目录或远程目录,比如S3。然后你可以使用像At Scalla这样的API或添加图像来加载你的数据。

最常见的用例是监控训练过程。这包括使用Sca API监控模型学习曲线、QPS或CPU YouTubes在整个训练过程中。

你只需传入标签名和sca值到Add Sca API。你也可以通过使用多线图或边距图API在同一图表中可视化多个Scala系列。直方图API允许我们在训练过程中可视化张量的直方图和分布。这包括模型权重、激活或梯度。

你只需传入标签名和张量值以添加直方图API。然后张量直方图和分布将自动计算并解锁到TensorBoard。图像MPI允许我们可视化图像训练样本或目标检测框,或在训练过程中从Mapllib或Pli生成的图像。例如,人们可以生成散点图或条形图。

通过我的partlib将模型预测值转换为图像并通过图像API记录。Tensible还提供各种其他API,用于记录模型的PR曲线、文本、视频、网格等。

下一部分是关于TensorBoard中的模型和监控工具。

图形插件允许我们可视化模型架构并识别性能瓶颈。你只需传入一个Pythr模型和输入张量。然后模型图将自动生成并解锁到TensorBoard。

嵌入投影插件允许我们在三维空间中可视化嵌入值。

H prime插件允许我们可视化模型参数与模型性能指标之间的关联,从而帮助我们识别最有前景的超参数集合。在这个例子中,我们使用平行的柱状图深入分析一些最有前景的运行,并识别它们在超参数方面的共同特征。What if2允许我们可视化大量示例并按某种方式对其进行分组。

特征值或模型预测值可以帮助深入理解模型在不同细分领域的性能或公平性。它通过自定义预测函数和Torch Serve与Pytorrch完全集成。可以作为独立应用程序或Tensoror插件进行查看。

最后一部分将涵盖我们目前正在开发的一些功能,并计划在不久的将来带入开源社区。

Profiler插件将启用自动模型性能分析和建议。它还将提供每个操作和GPU内核的模型性能详细视图。Ploty插件将使我们能够在板上原生可视化Ploty图形,提供更好和更互动的用户体验。

与通过图像API将其转换为图像和日志相比,警报插件允许我们监控训练过程中的某些模型指标。当这些指标超出或低于某些阈值时,可以自动获取警报。该阈值可以是绝对阈值、导数阈值或比较阈值。

这就结束了我的讲座,想要了解更多关于Pythtor Tensor Board的信息,请访问我们的网站Pythtor.org,并查阅Tensor Board文档和教程。非常感谢您观看这段视频。

Pytorch进阶学习讲座!14位Facebook工程师带你解锁PyTorch的生产应用与技术细节<官方教程系列> - P12:L12- Windows上的PyTorch - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我们来谈谈我们在Windows平台支持方面最近的改进。我是Max Lucano,微软Azure AI平台团队的产品经理。你们可能会想,微软为什么要谈论Pytorch和Windows,下面我来澄清一下。最近,微软成为了Pytorotch Windows的主要支持者。

我们的目标是改善Windows平台支持的质量,以便Windows用户在自己选择的平台上构建AI应用时获得良好的体验。在这一部分,我们将谈论我们在Windows平台上启用Pytorch各项功能方面取得的最新进展。

最近,我们在当前版本中启用的主要功能之一是分布式训练,因此我们将稍微谈一下这个内容,并演示如何在Windows上进行分布式训练。

但首先,让我们谈谈作为Python社区的YV,应该关心Windows平台。根据最新的SeflowDevelop调查,Windows仍然是最受广泛开发者欢迎的操作系统。而这对于今天的Pythors社区来说可能并非如此,因为如今的Pythors社区更倾向于那些习惯使用Linux和Mac的专业研究人员。

但如果你展望未来,看看我们希望引入Pytorch的下一批用户,那么Windows用户将是最大的用户群体。这一点通过我们自己的用户研究得到了进一步确认,如果查看LinkedIn的个人资料,那么声称具备机器学习能力但没有博士学位的机器学习专业人士人数是博士生人数的七倍,而在过去的一年中,这些非博士的机器学习专业人士数量几乎翻了一番。

好吧,博士人数显然没有增长太多。这意味着未来使用Pytorch的潜在用户是软件工程师和分析师,以及那些非常关注Windows平台的用户。我们来谈谈Pytorch的现状。首先,Pytorch和Windows是一个社区努力的结果,通过这个社区的努力。

实际上,我们在Pytorch的各项功能覆盖范围方面取得了相当不错的状态。正如你所看到的表格,我们也有很好的覆盖。不过在功能深度的覆盖上还有一些空白,因此我们需要在这方面做更多的工作。最初的感谢应该归功于Je和Poo,他们是将Windows平台支持引入Pytorch的原作者。

他基本上独自实现了原始的Windows支持,最近还添加了Torch音频支持。在微软方面,我们实际上已经开始在Windows上工作,现在我们有四位贡献者在这个领域工作,其中两位已经成为长期维护者。

我们开始改进Pythtors的质量。因此,我们增加了测试自动化,使其与Linux平起平坐,并改进了教程。新的Pyth用户在学习Pythtorch和Windows时有很好的体验。在此次发布中,我们的主要特性是分布式训练。

我们将在下一张幻灯片上详细讨论这个问题。我们还与Vi Amazon合作,为Torservve带来了Windows支持,Elijah Repert也在为job Bi提供Windows支持。非常感谢大家的努力。这将是培训的内容。首先,最新的1.7版本的Pyth现在可以使用,如果你在Windows上安装它。

你将拥有支持分布式训练的二进制文件。支持多GPU和多节点配置,但需要注意的是,我们还没有花很多时间测试multin。因此,请期待目前可能不稳定,但我们计划在即将发布的版本中进行额外测试。Pythtorarch有两种类型的分布式训练:分布式数据并行和新的RPC框架。在此次发布中,我们启用了分布式训练的分布式数据并行模式,并期待在即将发布的版本中启用RPC。RPC是一个令人兴奋的新特性,将用于Pythtorch的各种新特性,因此将其引入Windows也很重要。

当前版本在分布式训练后端的情况稍微复杂一些,我们有救护车胶水后端,但niel和MPPI后端当前不受支持。与NikIel的情况更为复杂,因为NikIel由Nvidia支持,而Nvidia不为Windows平台提供支持,所以我们需要与Nvidia合作,确定NikIel后端的计划。

有了这些,我们准备深入了解byytor Windows的实际操作。我这里有一台配备强大DP的Azure虚拟机。

让我们在VDdia SMMI中查看一下,你可以看到这台机器上有两块NviDAV100 GPU,因此这应该有足够的性能来加速我们的模型训练。让我们看看我们能在这里做些什么。我这里也安装了Pytorch的最新版本,当然是1.7,并且支持Kudo。现在我们可以去Pythtorch教程,看看有什么样的内容。嗯。

我们可以使用的示例是Python教程,正如我提到的。我们改进了其中一些,实际上是所有的,并且在Windows平台上实现了它们的平滑分离,因此我们选择这个关于分布式数据并行的入门教程,该教程通过三个不同类型的分布式数据并行训练示例引导用户,并提供示例代码供他们在自己的机器上执行。

你可以看到我们在这里添加了一些特定于Windows的说明,以确保用户在Windows平台上成功。我已经将这个源代码复制到我的虚拟机中。因此,现在我们在我的Visual Studio Code环境中展示了这个教程。

我们可以花一点时间进行探索,但我们实际上要尝试并运行这个示例。因此,你可能在这里看到的第一个评论或第一个要点是初始化方法,PyTorch支持三种初始化方法。

TCP/IP通信环境变量和远程文件存储,目前这是我们发布版本的一个限制,我们仅支持远程文件存储。因此,在这里我们指定文件的路径,该路径被工作节点用来相互传达其配置设置。

在这种情况下,我们使用单台机器和多个GPU。因此,我们只是使用本地文件在两个进程之间进行通信。对于跨多台机器的真实分布式训练,你需要使用远程文件系统,将文件放在远程文件系统上。

让我们探索一下我们要尝试的模型。在这个教程中,有三种模型被尝试。第一个是一个简单的两层网络,这个教程基本上是使用标准的分布式数据并行模型在两个GPU上进行分布式训练,并汇总来自这两个GPU的梯度,因此这是在多个GPU上训练模型的标准模式。

第二个示例说明了如何进行检查点和同步。因此,它再次训练模型,但其中一个工作节点保存检查点。大约在零时保存检查点,然后另一个工作节点加载检查点。在这两者之间,我们使用分布式训练屏障同步,以确保操作按正确顺序进行。这是分布式数据并行概念的另一个示例,现在可在Windows上使用。

最后一个示例实际上说明了如何进行分布式模型并行训练。它在一个GPU上训练一层,然后将数据传递给第二个GPU以训练第二层。因此,随着大型NLP模型的引入,这种模型并行训练变得越来越重要。在我们运行这个脚本之前,还有一个最后要提到的点是它是如何实际运行的。

你可以看到,这个脚本会自动根据 GPU 数量扩展所需的工作线程。我们这儿的电压大小将是 GPU 数量。因此,现在我们所需要做的就是运行这个脚本。

让我们来看一下。我们可以使用 N SMI 监控它的进展。你可以看到,现在两个 GPU 都被我们的脚本利用了。所以现在它开始运行第二个示例,两个点的示例。你可以看到负载稍微大一些,它在 GPU 之间异步进行,但随后它会平衡,并且最终第二个模型并行训练也是以更异步的方式运行。

你可以在 NDSM 中看到,它实际上跨越多个 Python 进程,以同时利用两个 GPU 卡。因此,你已经看到在 Windows 上运行分布式数据并行是多么简单。这与 Linux 非常相似,如今在 Windows 上运行与在 Linux 上一样容易。至此,我们的演示结束。非常感谢你观看这一部分。我是 Maxim Lucianov。

如果你对 Pytorch 和 Windows 有任何问题或想法,请给我发消息,祝你度过愉快的 Pythtorch 开发者日。

Pytorch进阶学习讲座!14位Facebook工程师带你解锁PyTorch的生产应用与技术细节<官方教程系列> - P3:L3- Autograd的高级API - ShowMeAI - BV1ZZ4y1U7dg

🎼。

大家好,我的名字是Alban,我是Facebook的一名研究工程师,正在纽约的Pytorch前端团队工作。更具体地说,我在Autograd子系统上工作。所以今天我将与大家讨论我们为Autograd添加的全新高级API。

特别是,我将简要概述这个新API的动机、实际样子以及如何使用,最后介绍一些未来的工作计划!

首先,这个新API的动机是当前的autograd API并不适合所有人。特别是,dot backward函数非常针对Torch和N用户,因为它填充了所有张量的dot grad字段,并且与我们在StN中使用的状态和优化器紧密相关。类似地,autogradgrad则更倾向于神经网络用户,因为它是为反向传播构建的,所有命名和API设计都是如此。

想到神经网络。因此,我们认为,现在有更多的普通用户使用Autograd进行比单纯的神经网络更多的优化。我们需要一个好的通用API,供这些人使用,以满足他们的所有需求。此外。

对于更高级的功能,比如计算雅可比,我将在这里用作许多事情的示例。在Pythtorch中拥有一个参考实现是非常好的。原因是直到最近,如果你想用Spytorch计算雅可比,你需要复制粘贴几年前做的代码。

所以,人们在他们的代码中基本上拥有一个过时的版本g。我们不能真的对计算雅可比的方式进行改进,让每个人自动获得这个新的升级版本。因此,这个新API将帮助我们通过这个通用API为用户带来更多性能改进。

而且,基于这个想法,我们最近还围绕这个API添加了一个完整的基准系统,以确保现有模型和我们用户经常使用的模型具有良好的性能,并且我们也可以通过不同的变化来衡量我们正在做的改进。

但我们也可以测量回归并确保它们不显著,并在它们影响主要发布之前捕捉并修复它们!

那么这个新API在哪里呢?它位于torch.dot.autogra.functional符号下。你可以在autograd文档中找到它,名为功能性高级API。与现有API相比,它具有稍微不同的理念,主要是将函数作为输入,而不是前向传递的结果。

这样做的主要原因有两个,一个是因为它更接近数学公式,且人们习惯于直接对函数进行求导,而不是先进行前向路径再计算梯度。第二,它还使我们在前向传播中对发生的事情有了更多的自由,特别是对于我们计划的一些优化。

在前向传播期间,我们需要做一些特殊的事情,不希望用户担心。因此,这个新API将允许我们非常高效地做到这一点。

那么这个新API包含什么呢?第一大部分是一阶梯度。正如我之前提到的,我们有一个直接为你计算雅可比矩阵的函数,给定一个函数和一些输入点。我们还有一个向量雅可比乘积,它对应于反向模式自动微分,在神经网络领域对应于反向传播算法。

这实际上非常接近现有的autograd dot grad函数。最后,我们还提供了一个雅可比向量乘积。另一种方式,这个对应于前向模式自动微分,可以用于计算方向导数。

这个API的第二个部分对应于二阶梯度以及非常相似的函数。一个计算所有二阶导数的海森矩阵函数。一个向量海森乘积,它使我们能够有效地进行反向模式自动微分,计算海森矩阵与给定向量之间的乘积。

同样,海森向量乘积则更对应于前向模式自动微分。

现在来举一个如何使用DC API的例子。再次作为雅可比函数的例子,现在你不需要从旧的代码中复制粘贴代码,你可以直接从torch导入。正如你在第一个例子中看到的,当你有一些输入时,只需调用雅可比函数,你就能得到雅可比值,这很简单。

这就是你需要做的所有事情。很不错的是,你可以将这个新API与现有的autoquad API组合起来。例如,如果你输入需要梯度,你可以请求雅可比矩阵的计算来创建图形,从而能够反向传播,正如你所看到的,你可以计算刚得到的雅可比矩阵的范数并进行反向传播。

然后你可以将其与训练的其余部分组合,以获得你所需的所有量。还有许多更多的例子,这里的一些例子包括基于雅可比计算的梯度惩罚,以及与前向模式自动微分相对应的雅可比向量积计算。这尤其有趣,因为它们实际上计算高维的方向导数。

这些导数对许多优化算法非常有用。同样,计算海森矩阵或海森向量积的二阶方法使你能够更高效、更简单地执行牛顿步法或近似牛顿步法,而不是使用当前的 Auto RE API。

所以最后谈谈一些未来的工作。第一部分实际上是我们目前正在进行的工作。第一个是针对节点 8,目标是对于雅可比向量和海森向量积,将其替换为实际的前向自动微分。这项工作正在进行中,希望我们能很快发布。

基于此,你可以获得非常好的性能提升。关于这个新 API,有一件有趣的事情是,如果你在其发布时已经使用了这个 API,你将免费享受到这个新前向模式 ID 的好处。同样,你可以获得徽章渐变。因此,这与你听说过的 VMap 功能是一个合作,目的是加速雅可比和海森计算的计算速度。

最后,torch.nN 的可组合性是我们正在研究的另一个主题。原因在于,当前的 NN 模块持有大量状态,并且它们不是功能性的,因此与我们设计的新 API 并不完全兼容。因此,这里的想法是尝试在 Torch 端提供 NN 模块的功能性版本,以便我们能更高效地使用它们。对于长期的工作,我们在寻找想法,请分享你对这些工作的反馈。

它如何帮助你实现你想做的事情。如果你对这里发生的事情有问题或担忧,请在 GitHub 或 Pythtorch 论坛上公开问题。并请帮助我们让 DC API 完全符合你的需求。

🎼非常感谢你们的倾听,祝你们有美好的一天。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P1:L1- 介绍 - ShowMeAI - BV1Pu41117ku

🎼嗨,我的名字是Mosh Hamiddani,我非常兴奋能成为你的讲师。在这个三个小时的课程中,你将学习到开始使用SQL所需的一切。首先,我将给你一个三分钟的SQL介绍,然后我们将安装必要的工具并编写我们的第一个SQL查询。这个课程非常适合那些想从头开始学习SQL的人,也适合那些有一些基础知识但想填补空白的人。在这个课程结束时,你将能够检索和插入数据。

更新和日常数据在数据库中,我们将讨论表,关系,不同类型的连接,子查询,正则表达式等等。这些是每个软件开发者或数据科学家必须了解的基本概念。这个SQL课程包含大量练习,帮助你学习和记住SQL语法。此外,视频下方有一个目录,可以快速跳转到特定教程。

😊。

现在让我们开始吧。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P10:L10- AND、OR 和 NOT 运算符 - ShowMeAI - BV1Pu41117ku

在这个教程中,我将向你展示如何在过滤数据时组合多个搜索条件。所以假设我们想要获取在1990年1月1日后出生的所有客户,并且他们的积分超过1000,这时我们使用与运算符,因此我们输入并,然后在输入另一个条件,比如积分。

😊,大于1000。现在,当我们执行这个查询时,我们只获得满足这两个条件的客户。我们来看一下。所以执行。我们只有两位客户。如果你看,这两位都是在1990年后出生,并且他们的积分超过1000。这就是与运算符的作用。

这两个条件都应该为真。与与运算符相对,我们有或运算符。所以使用或时,只要这两个条件中的至少一个为真,该行就会在结果集中返回。我们来看一下。现在我们再次执行这个查询。结果不是两条记录,而是😊,相当多的记录。所以例如。

我们有这个人在1990年后出生,但如果你看他们的积分,他们超过了1000分。因此,任何满足至少一个条件的客户记录都会被返回。现在让我们将其提升到下一个层次。假设我们想要获取在1990年后出生的客户,或者他们应该至少有100000积分并且居住在弗吉尼亚州。所以我们这样做。我们输入并,然后添加另一个条件,州等于弗吉尼亚。

让我们执行这个查询,看看我们得到什么。我们只得到完整的记录。因此,这些客户要么是在1990年后出生,要么积分超过1000且居住在弗吉尼亚。如果你看这里的第一个客户,这个人并没有在1990年后出生,但你可以看到她住在弗吉尼亚,并且积分超过1000。

所以最后两个条件对于这个客户是成立的。现在,在组合多个逻辑运算符时,你需要注意这些运算符的顺序。早些时候我谈到了算术运算符的顺序。我告诉过你,乘法的优先级高于加法和减法,我们可以使用括号来覆盖默认顺序,逻辑运算符也有相同的概念。所以与运算符总是优先计算。因此,当执行这个查询时,查询执行引擎首先评估这个条件,因为在这里我们使用的是与运算符,即使我们在第一个条件后输入了这个条件也无所谓,因为与运算符具有更高的优先级。现在,你始终可以使用括号改变顺序,这也确保了代码更简洁,更易于理解。

😊,所以我们可以在最后两个条件周围加上括号。我们也可以把这些放在新的一行。😊,为了清晰,像这样。所以任何阅读这段代码的人都可以很容易理解这个查询的意图?

现在我们还有另一个逻辑操作符称为非,我们用它来否定一个条件。让我给你演示一下,所以我将简化我们的“或”子句。😊假设我们正在寻找1990年后出生的客户,或者他们的积分超过100。 如果我们执行这个查询,我们得到。这些人,客户ID为1、3、5,等等。

现在我们可以使用非操作符来否定这个条件。所以我们在这里应用非操作符,并且最好在这个条件周围加上括号。现在,当我们执行这个查询时,我们会看到其他不在当前结果集中的客户。让我们来看一下。😊因此,我们看到的客户ID为1、3、5、6,等等。

我们得到的客户ID为2、4和10。现在从技术上讲,这些客户出生在1990年之前,并且积分少于1000。所以如果你看看这里,第一个客户出生在1990年之前,并且他的积分少于1000。我怎么知道的?让我告诉你我在数学中学到的一个技巧。每当你有一个非操作符时。

你可以这样简化你的表达式。我们将非操作符应用于第一个条件,即在1990年后出生的人。我们如何否定这个条件呢?嗯,大于操作符变成了小于或等于。这就是该条件的逆。对吧?现在我们应用“非”来否定“或”。我们得到了“与”。最后。

在最后一个条件上应用非操作符,即拥有超过1000积分的人员。当我们否定这个条件时,我们得到的客户是积分少于或等于1000的客户。现在我们可以去掉非操作符以简化这一点。我们不再需要括号,因为我们只有两个条件是通过“与”连接的。

这是结果。正如你所看到的,这样阅读和理解要容易得多,出生在这个日期之前的人,他们的积分少于1000。

好的,这里是你的练习。从订单项表中获取订单号为6的项目,其中该项目的总价格大于30。好的,这里是订单项表,在这个表中我们有这些列:订单ID、产品ID、数量和单价。如果我将数量乘以单价,我们可以得到该项目的总成本,然后我们可以将其与30进行比较,所以让我们继续编写这个查询。

选择所有。来自订单项表。在这里我们需要两个条件,一个是订单。所以订单ID应该是6。第二个条件,我们想要计算总价格。所以我们获取单价。😊将其乘以数量。这个值应该大于30。所以如我们所见,我们可以在“或”子句中使用算术表达式。

这并不局限于选择类。好的,😊现在让我们执行这个查询,看看我们得到什么。我们应该只得到一个项目。该项目为产品1,数量为4,单价略高于$8,因此该项目的总价格大于30。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P11:L11- IN 运算符 - ShowMeAI - BV1Pu41117ku

在本教程中,我将向你展示如何在SQL中使用“in”运算符。举个例子,假设我们想获取位于弗吉尼亚州、佛罗里达州或乔治亚州的客户。编写这个查询的一种方法是这样:where state equals Virginia 或者 state equals Georgia。😊。或者 state equals Florida。对于刚接触SQL语言或编程的人来说,这个表达式可能有点奇怪。

他们问,Msh,为什么我们不能这样写这个表达式?

当state等于弗吉尼亚州或乔治亚州或佛罗里达州。这就是我们使用或运算符组合多个条件的原因。所以这里我们有一个条件,或者更准确地说是一个表达式。但在这个或运算符的右侧,我们有一个字符串。在SQL中,我们不能将字符串与产生布尔值(真或假)的布尔表达式组合在一起,这就是我们必须这样编写查询的原因,所以我们有多个表达式或多个条件,并且我们通过或运算符将它们组合在一起。好吧,现在如果我们执行这个查询,我们会得到这些客户。

但是有一种更简短、更清晰的方法来获得相同的结果,而不是使用或运算符组合多个条件。我们可以使用“in”运算符,所以where state is in,然后在括号中添加所有值,例如弗吉尼亚州、佛罗里达州、乔治亚州,顺序不重要。这个查询与我们之前的完全等效。😊,但如你所见,它更简短且更易于理解。让我们执行它。看。

我们得到了完全相同的结果。现在这里我们也可以使用非运算符。假设我们想要获取这些州以外的客户,所以我们可以使用“where state not in”。😊。这个列表。现在如果我们执行这个查询,我们会得到位于科罗拉多州、德克萨斯州等地的客户。所以当你想要将一个属性与一系列值进行比较时,请使用“in”运算符。

😊。

现在这里有一个练习,我希望你写一个查询,获取库存数量等于49、38或72的产品。暂停视频,完成这个练习,然后继续观看。😊。

好吧,这很简单,所以我们执行一个选择所有列的查询,从产品表中获取库存数量为49、38和72的记录,使用“in”运算符来比较这个属性。让我们执行这个查询,我们得到了。😊,只有两条记录,因为我们没有库存数量等于72的产品。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P12:L12- BETWEEN 运算符 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我们将查看 SQA 中的 between 运算符。所以假设我们想获取积分在1000以上和3000以下的客户。查询是这样的,where points greater than 1000,更准确地说是大于或等于1000,并且 points less than or equal to 3000。当我们执行这个查询时,我们得到。😊,我们得到了多少人,四个人符合这个标准?

现在,无论何时你在用一个属性与一个范围的值进行比较时,你都可以使用 between 运算符,这使得你的代码更简短、更清晰,因此我们可以将这个表达式重写为 where points between 1000 和 3000。这与我们之前的内容完全等效。

所以这些范围值也是包含的。这意味着点数大于或等于1000,或小于或等于3000,让我们执行这个查询。我们得到完全相同的结果。😊。

嗯。

好的,现在作为练习,我想写一个查询来获取出生日期在1990年1月1日到2000年1月1日之间的客户。

好的,我们从选择所有开始。从客户那里,哪里?出生日期在这条线上,日期在……所以这里需要注意的是,我们也可以对日期值使用 between 运算符。这不仅限于数字的使用。所以我们出生日期在现在,我们需要提供两个日期值。正如我之前告诉你的,日期的格式是四位数的年份,所以是1990。

月份需要两个数字,日期也需要两个数字。所以生日应该在这个值和第二个值之间,20,0,1 和 01。让我们执行这个查询。我们得到。

只有三个人符合这个标准。哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P13:L13- LIKE 运算符 - ShowMeAI - BV1Pu41117ku

在本教程中,我将向你展示如何检索与特定字符串模式匹配的行。例如,假设我们只想获取姓氏以“B”开头的客户。因此在WHERE子句中。😊,我们输入“where last name”。这就是我们使用like运算符的地方,紧接着我们添加一个字符串模式。因此,我们想获取姓氏以“B”开头的客户,并且“B”后可以有任意数量的字符。

因此,我们使用百分号来表示任意数量的字符。在“B”后可能有一个字符、没有字符或十个字符。使用这个模式,我们可以得到所有姓氏以“B”开头的客户。而且无论是大写“B”还是小写“b”都没关系。让我们执行这个查询,结果出来了。我们只有三位姓氏以“B”开头的客户。😊,作为另一个例子。

假设我们只想获取姓氏以“brush”开头的客户。因此,我们将模式改为“brush percent”。现在执行查询,我们只得到这位客户。现在,这个百分号不必位于模式的末尾,可以在任何位置。例如,假设我们想搜索姓氏中含有字母“B”的客户。

无论是在开头、中间还是结尾。因此,我们将模式改为“percent B percent”。这个模式意味着在“B”之前或之后可以有任意数量的字符。让我们执行查询。这些客户的姓氏中有“B”,而且不管“B”是在开头、中间还是结尾。

让我们看另一个例子。我想获取所有姓氏以“y”结尾的客户。😊。所以这是我们使用的模式,执行这个查询,我们有五位姓氏以“y”结尾的客户。这就是我们使用百分号的方法。现在,我们还有一个下划线,它匹配一个单一字符。因此,使用这个模式,我们得到的客户姓氏恰好有两个字符。

我们不关心第一个字符是什么,但第二个字符应该是“y”。让我们执行这个查询。显然,我们没有任何姓氏与这个模式匹配的客户,但如果将模式更改为五个下划线,即“1,2,3,4,5”。😊,再加上一个“y”。我们应该能获取这些客户,因此他们的姓氏恰好有六个字符。

我们不关心前五个字符,但它们都以“y”结尾。现在,作为另一个例子,我们可以用“B”替换第一个下划线。这意味着我们想获取姓氏以“B”开头的客户,且在“B”后面恰好有四个字符,最后以“Y”结尾。让我们执行这个查询,因此我们只有一位客户符合这个模式。😊,这就是我们使用like运算符的方法。

我们使用百分号来表示任意数量的字符。并且。😊 一个下划线来表示单个字符。现在这个like运算符在MySQL中是一个较旧的运算符。但我们还有一个更新的运算符,它更强大,可以让我们搜索任何字符串模式。这就是我接下来要向你展示的内容。😊

好的,这里我将给你两个关于like运算符的练习。首先,我想让你找到地址包含“trail”或“avenue”的客户。接下来,我想让你找到电话号码以9结尾的客户。😊

好的,让我们开始第一个练习。所以从customers表中选择所有记录,条件是地址像这样搜索。😊 我们想要“trail”,但“trail”可以出现在地址的任何地方。因此我们在“trail”前后都放一个百分号。接下来,我们应该使用or运算符来搜索另一个模式。

或者地址像,让我把这放到新的一行,这样更好。地址像,再次使用百分号“avenue”百分号。就这样。所以让我们执行这个查询。😊 这里是你应该得到的结果,ID为2、9和10的客户,如果你查看他们的地址,他们的地址中都有“trail”或“avenue”。现在让我们开始第二个练习。

我们想找电话号码以9结尾的客户。这非常简单,所以让我修改我们的工作条件。😊,在电话号码那一栏,我们再次使用like运算符,后面跟一个百分号和9,这就是你需要做的。😊 让我们执行这个查询。结果是,ID为3和7的客户。

他们的电话号码以9结尾。所以这就是我们如何使用like运算符,顺便说一下,你可以在这里始终使用not运算符。假设你想找电话号码不以9结尾的客户。那么我们只需在like前加上not。现在如果我们再执行一次这个查询,我们会得到数据库中的所有其他客户。😊

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P14:L14- REGEXP 运算符 - ShowMeAI - BV1Pu41117ku

在上一个教程中,你学习了 SQL 中的 like 运算符,因此作为另一个例子。假设我们想搜索姓氏中包含单词 filled 的客户。因此,我们输入一个类似于这样的 where 子句:where last name like percent,field percent。这样单词 field 可以出现在姓氏的任何位置。让我们执行这个查询。

我们只得到一个客户,很好。现在,我们在 MySQL 中还有另一个运算符,即 red X。😊它是正则表达式的缩写,正则表达式在搜索字符串时非常强大。因此,它们允许我们搜索更复杂的模式。这里有一个例子。如果我想使用正则表达式重写这个最后的 where 子句,它看起来是这样的。

where last name,R A G,E X P。😊现在在我们的字符串模式中,我们不需要输入人名符号,我们只需输入 field。所以第4行的内容与第3行完全相同。让我们执行这个查询。😊我们得到了相同的结果,很好。现在在正则表达式中。

我们有额外的字符,而在使用 like 运算符时并没有这些字符。例如,我们可以使用插入符号来表示字符串的开头。因此,如果我把插入符号放在单词 filled 前面。😊这意味着我们的姓必须以 field 开头。显然,如果我们执行这个查询。

我们没有任何匹配该条件的记录,因此我们使用插入符号表示字符串的开头。😊我们还可以使用美元符号表示字符串的结尾。因此,这个模式意味着姓氏必须以 field 结尾。让我们执行这个查询。我们得到了与之前相同的结果。现在我们也可以在这里搜索多个单词。例如。

假设我们想找到姓氏中包含单词 filled 或 Mac 的客户。因此我们使用管道符号,竖线并输入另一个模式。😊让我们执行这个查询。在这里我们有两个客户,其中一个的姓中有单词 Mac,另一个的姓中有单词 field。😊现在我们可以将其提升到下一个层次。

假设我们想找到姓氏中包含单词 field、Mac 或 row 的客户。😊让我们执行这个查询。我们得到了三个客户,很好。因此,我们使用管道符号或竖线来表示多个搜索模式。现在,作为另一个例子,我们可以将第一个搜索模式更改为类似这样的内容。😊

现在这个模式意味着姓氏要么以 field 开头,要么包含单词 field,要么包含单词 row。让我们执行这个查询。😊现在我们只得到了两个客户,因为我们的客户姓 Bru field,不符合这个模式。然而,如果我们将第一个模式改为 field 加上美元符号并执行查询,我们会得到三个客户。所以这就是我们在构建复杂模式时如何组合多个特殊字符。

现在让我们来看另一个例子,假设我们想要搜索姓氏中包含E的客户。这些都是符合条件的人,现在假设我们想确保在字母E之前要么有G,要么有I。所以这就是我们使用方括号的地方,括号内添加多个字符,如G和I,这样就能匹配任何姓氏中在E之前有G或I或M的客户,因此这些字符中的任何一个都可以在E之前出现。😊现在让我们执行这个查询。看吧,我们在第一个例子中只得到两个客户,在E之前我们有I。

在第二个例子中,E之前的方括号内包含的字符之一是G,它也是E之前的另一个有效字符。现在,再一次,方括号不必在E之前,我们可以将其放在E之后,因此任何在姓氏中以E后跟F、M或Q的客户都可以用这个模式返回。显然,我们的数据库中没有人。所以这就是我们如何使用方括号。

所以我们也可以提供字符范围。例如,我们可以有E,E之前要有任何从A到H的字符。我们不必像AB、C、D、E、FG那样逐一输入,这样显得很冗长,所以我们可以输入A到H,现在如果你执行这个查询,我们得到这三个人。😊让我们快速回顾一下在本教程中你学到的关于正则表达式的所有内容。

我们使用插入符号来表示字符串的开始,所以是开始。😊我们使用美元符号表示字符串的结束。我们使用竖线或管道表示逻辑或,因此我们可以提供多个搜索模式。我们使用方括号来匹配括号中列出的任何单个字符。

最后我们使用方括号和一个连字符来表示一个范围,所以任何从A到F的字符。😊从技术上讲,我的学校支持更多特殊字符,但老实说,我在本教程中列出的那些是你在90%的情况下会用到的,所以记住这些就可以了。说实话。

很多初学者发现正则表达式的语法令人困惑。因此,在这个视频中,我将给你四个练习,我精心设计了这些练习,以帮助你快速了解这套语法。这是第一个练习。获取名字是Elca或Amber的客户。注意这个是Amber的拼写。😊现在是第二个练习。

返回姓氏以EY或ON结尾的客户。这是第三个练习。获取姓氏以my开头或包含SE的客户。最后作为最后一个练习,返回姓氏中包含B后跟R或U的客户。请花两到三分钟完成这个练习,完成后请回来继续观看。

好的,让我们完成第一个练习。所以我们想要获取所有。😊,哎呀,这里有个C。选择商店从客户中,正则表达式。😊,这是我们的模式。我们想搜索两个词,Elca或Amber,简单就是这样,让我们执行这个查询。我们应该得到两个客户。看,Amber和Elca。好的。

现在让我们完成第二个练习,我要删除这个。我们不再需要它。😊。所以我们想要获取客户,选择从Custom开始。哪里姓氏?

应该以EY或ON结尾。所以在搜索模式中。我们输入EY后面跟一个美元符号来表示字符串的结束。然后我们添加一个竖线来提供第二个搜索模式,O,再一次,美元符号。让我们执行这个查询,哎呀,实际上我忘记输入正则表达式了,你看。😊。

所以让我们执行这个查询。我们应该得到这四位客户,ID为1、3、5和7。前面的三位,他们的姓氏以E、Y结尾,最后一位客户,他或她的姓氏以ON结尾。好的,现在,让我们进行第三个练习。我将更改这里的正则表达式。

我们想要获取姓氏以my开头或包含S的客户。所以我们用一个字符来表示字符串的开始。😊,所以它应该以my开头。或者它应该再次包含S,很简单,让我们执行查询。😊,我们得到了ID为4、8和10的客户,最后我们想获取姓氏中包含B的客户。

所以让我们更改搜索模式,我们应该有B后面跟R或U。现在,有两种方式来写这个正则表达式。我们可以使用方括号。所以我们有B后面跟R或U。这是一种方法。另一种方法是使用竖线,所以。BR或BU,这两者都是有效的解决方案。希望你在下一个教程中完成这些练习,我将向你展示如何获取缺失值的记录。

😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P15:L15- IS NULL 运算符 - ShowMeAI - BV1Pu41117ku

哦,在本教程中,我将向你展示如何查找缺少属性的记录。例如,如果我们选择我们数据库中的所有客户。😊你会看到客户ID为I5的客户没有电话号码。所以如果你仔细看,这里会看到值为null。null表示缺少值。现在。

假设我们想查找所有没有电话的客户,也许我们想给他们发一封邮件,告诉他们“嘿,你的电话在我们的系统中缺失”。那么我们该如何获取这些客户呢?这非常简单,我们使用空运算符。所以在条件中我们写出“电话为空”。现在让我们执行这个查询。😊我们只得到一位没有电话的客户。

现在我们也可以使用非运算符来获取确实有电话的客户。所以我们将条件改为不是空,让我们执行查询。现在在查询结果中,每位客户都有电话号码。

对于这个练习,我想写一个查询来获取尚未发货的订单。这是一个在许多实际应用中使用的非常有用的查询。例如,假设你是一个在线商店的管理员。你想查看尚未发货的订单,以便跟进。😊所以写一个查询来获取这些订单。😊所以这里我们有订单表。

让我们快速查看一下这个表中的数据。😊好吧,如果你仔细观察,你会发现一些订单没有发货日期,这些订单也没有承运人ID,承运人ID是用于识别承运人的唯一编号。因此,任何缺少发货日期或承运人ID值的订单都被视为未发货订单。接下来我们来写一个查询来获取这些订单。

所以回到我们的查询编辑器,选择所有订单。从订单表中,条件为“发货日期为空”。你也可以写“承运人ID为空”。这两种写法都是正确的。现在让我们执行这个查询,我们应该得到五个订单,订单1、3、4、6和8。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P16:L16- ORDER BY 运算符 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我将向你展示如何在 SQL 查询中对数据进行排序。这里我们有一个查询,用于选择客户表中的所有客户。如果你查看查询结果,你会看到我们的客户按 ID 排序,所以我们有客户 1。

2,3,4 等等,这是默认的排序列,但我们可以使用 order by 子句随时更改这一点。不过首先让我解释一下为什么客户 ID 列是默认的排序列。😊所以我先打开左侧的导航面板,这里是客户表。

现在让我们点击这个看起来像工具的中间图标。😊这将我们的客户表打开为设计模式,在这里我们可以更改列。我们可以添加新列或删除现有列,或者更改它们的名称或顺序等等。现在如果你仔细观察,你会看到客户 ID 前面有一个黄色的钥匙,这意味着此列是此表的主键列。

在关系数据库中,每个表都应该有一个主键列,该列中的值应唯一标识该表中的记录。因此,回到我们的查询窗口。你可以看到该列中的值唯一标识每个客户。

客户 ID 列是此表中的主键列,这就是为什么当我们针对此表编写查询时,我们的客户默认按 ID 排序。现在让我向你展示如何按其他列对客户进行排序。所以在 order by 子句中,我们输入另一个列的名称,比如名字。😊

让我们执行查询。现在你可以看到我们的客户不再按 ID 排序,而是按名字以升序排序。现在,如果你想反转排序顺序,只需输入 D E SC,这是降序的缩写。现在你正在按降序排序这些客户。好的。

我们也可以通过多个列对数据进行排序,例如。假设我们首先想根据客户的州进行排序。然后在每个州内,我们想按名字进行排序。因此,我们在这里输入多个列,州和名字,然后执行查询。

现在你可以看到,我们这里的第一个州是加利福尼亚州,接着是科罗拉多州,而在佛罗里达州,我们有两个客户,这些客户按名字排序。让我们仔细看看,首先是 Amber,然后是另一个客户。我们也可以在这里随时使用降序参数,例如,我们可以按州以降序排序,然后按名字以升序排序,或者再次以降序排序,因此我们可以用多种方式对数据进行排序。

现在,MySQL与其他数据库管理系统之间的一个区别是,在MySQL中,我们可以按任何列排序数据,无论该列是否在选择子句中。例如,假设我们只想选择每个客户的名字和姓氏,现在我们可以按这个表中的任何列对结果进行排序,它们不必是名字和姓氏,例如,我们可以按他们的出生日期排序。

看看。这是一个在MySQL中的有效查询,但其他数据库管理系统有时会对你写这样的查询大喊大叫。现在我们也可以通过别名排序数据,例如,在我们的选择子句中添加数字10,并给它一个别名,比如说得分。所以得分在这个表中不是一个有效的列,它只是一个表达式的别名,在这种情况下是一个简单的数字。现在这里我们可以有一个复杂的数学表达式,实际上并不重要。😊。

我们仍然可以通过别名对数据进行排序,这样我们可以先按得分排序,然后按名字排序。再一次,这是从玛雅·斯基的角度来看一个有效的查询。现在在我们结束这个教程之前,还有最后一件事,我看到一些教程教你如何按列位置排序数据。例如,在这里我们可以按1和2排序,这基本上意味着按名字和姓氏排序数据,这些列的顺序是如果我们执行这个查询的话。

你可以看到我们的客户是按名字和姓氏排序的。😊。虽然这种方法有效,但你应该避免,因为如果将来你在名字列前面添加一个新列。

假设说出生日期。现在,我们的客户不再按照之前的顺序排序。因此,通过列位置排序数据会产生意想不到的结果,这是你应该避免的。相反,始终按列名排序,比如名字。嗯。好吧,这是你在这个教程中的练习。在这个数据库中,我们有一个名为订单项的表。

我们可以找到每个订单的商品。现在我写了一个你看不到的查询,因为这是我将给你的练习的解决方案。这个查询产生了这个结果。所以我们只得到了订单ID为I2的商品,并且我们根据每个商品的总价格对这些商品进行了排序。

因此,每个商品的总价格等于数量乘以单价。在这种情况下,产品1的总价格刚好超过$18。所以继续写一个查询,选择订单ID为I2的所有商品,并按总价格降序排序。

😊。

嗯。

好吧,我们从订单项中选择所有内容,条件是订单ID等于2。这将返回该订单的所有商品。现在我们要确保按总价格对它们进行排序。所以在ORDER BY子句中,我们写出一个表达式,即数量乘以单价。这将返回每个商品的总价格,然后我们在这里添加降序参数。

所以再一次,我们在order by子句中使用的表达式不一定要是列名。它可以是一个别名或像这样的算术表达式。让我们继续执行这个查询。😊这就是我们得到的结果。为了清晰起见,我想在结果中添加另一列。假设是数量。😊在价格下的单位,再给它一个别名,比如总价格。

让我们执行查询。我们可以清楚地看到,这些数据是按总价格降序排列的。然而,我们的查询中有一些重复。我们在两个地方重复了这个表达式。所以现在我们可以通过使用一个别名(总价格)来简化我们的order by子句,我们得到完全相同的结果。😊接下来,我将向你展示如何限制查询返回的记录数量。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P17:L17- LIMIT 运算符 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我将向你展示如何限制从查询中返回的记录数。例如,当我们执行这个查询时,我们获得了所有客户和客户表。所以我们在这里有10个客户。😊,现在,如果我们只想获取前三个客户怎么办?这就是我们使用限制子句的地方,让我给你演示一下。所以在from之后,我们输入limit 3。

这将仅返回前三个客户。如果我们传递的参数大于我们的查询产生的记录数,我们将得到查询结果中的所有记录。例如,如果我在这里传递300,显然我们在这个表中没有300个客户。因此,当我们执行这个查询时,我们将得到这个表中的所有10个客户。

所以这就是限制子句的工作原理。😊,现在我们可以选择性地提供一个偏移量。这在我们想要分页数据的情况下非常有用。例如,假设我们有一个网站,在这个网站上有一个网页供用户查看数据库中的所有客户。现在为了简单起见,假设我们每页只想显示三个客户。

那么我们在第一页上会有什么客户呢?😊,我们会有客户,1,2,3。在第二页,我们会有客户4,5,6,在第三页,我们会有客户7,8,9。😊,现在假设我们想写一个查询来检索第三页的客户,我们该怎么做呢?我们想跳过前六条记录,然后选择三条记录,对吧,所以我们把限制子句改成这样。

😊,限制为6和3。所以6是我们所称的偏移量,这基本上告诉mySQL跳过前六条记录,然后选择三条记录。让我们执行这个查询。😊,好的,现在我们得到。客户,7,8和9。

现在,对于你的练习,我希望你获取前三个忠实客户。这些客户的积分比其他人都高。好的,首先,我们从客户表中选择所有内容。😊,现在我们需要按积分降序排列这些客户。所以如果你查看查询结果,你会看到客户按忠诚度排序。

所以最忠诚的客户首先出现,现在我们只想选择前三位客户,这就是我们使用 limit 子句的地方。所以 limit 3。😊,让我们执行这个查询。这些就是最忠诚的客户,客户 ID 为 5、6 和 3。现在我希望你记住一件事,那就是 limit 子句的顺序。limit 子句应该始终放在最后,所以首先我们有 select 子句,然后是 from,可选的我们可以有 where,接着是 order by,最后是 limit。这些子句的顺序很重要,如果你改变顺序,My SQL 会对你大喊大叫,所以在编写查询时请注意顺序。

😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P18:L18- 内部连接 - ShowMeAI - BV1Pu41117ku

哦,到目前为止,我们只从一个表中选择列,但在现实世界中,我们经常从多个表中选择列。这就是我将在接下来的几个教程中向你展示的内容。😊 所以在左侧,如果你查看我们的订单表,让我们选择这里的所有数据。😊 在表中。

我们使用客户ID列来识别每个订单的客户。正如我之前告诉你的,我们这里不存储客户信息,比如他们的电话号码、电子邮件和地址,因为这些信息可能在未来发生变化。如果某个客户下了多个订单。

那么我们必须回来更改多个记录。我们不想这样。这就是我们为客户和订单设置单独表格的原因。😊 现在在本教程中,我将向你展示如何选择订单表中的订单,但不是显示客户ID,而是显示每个客户的全名。😊

所以让我们回到查询窗口。😊 好的,我们想从订单表中选择所有内容。现在我们应该将这个表中的列与客户表中的列结合,这就是我们使用join关键字的地方。现在我们可以选择性地输入inner join,因为在SQL中,我们有两种类型的连接,inner join和outer join。

我们稍后将在本节中查看外连接。所以现在我们只使用inner join,而这个inner关键字实际上是可选的,因此我们不必输入它。😊 所以你想将订单表与客户表连接。现在,我们希望基于什么来连接这些表?好吧,在客户表中,我们有这个客户ID列。所以如果我们将这两个表放在一起。

我们希望对齐记录,使得客户ID相等。这就是我们使用on短语的地方。😊 所以在on后面,我们输入一个条件。这里是我们需要输入的条件,订单表中的客户ID应该等于客户表中的客户ID。😊 现在,这超出了屏幕范围。让我分开这一行。

这样更好。通过这个查询,我们告诉MyQL,嘿, whenever you’re joining the orders table with the customers table,确保订单表中的客户ID列等于客户表中的客户ID列。😊 现在让我们执行这个查询。😊 看看结果。因为我们在这里选择了所有内容。

前几列来自订单表,因为我们先列出了这个。😊 现在,在订单表中的所有列之后,我们有客户表中的列,包括客户ID、名字、姓氏等等。😊 现在让我们简化结果集,只选择订单ID、名字和姓氏。

所以回到我们的查询,我们选择订单ID,名字和姓氏。现在我要执行查询。😊那更好,所以在每个订单ID旁边,我们可以看到下单客户的名字。😊现在,如果你想在这里显示客户ID呢?😊,那么。

我们把这个放在这里,看看会发生什么,自定义I。执行查询。我们得到一个错误。如果你查看底部的输出窗口,你应该会看到一个错误,提示列customer ID D字段列表是模糊的。现在,不幸的是,我无法展示这个错误,因为我的录制窗口比MySQL工作台小。

不过先放一边,让我解释一下为什么会出现这个错误,因为在订单和客户表中都有这个customer ID列。所以我的技能不确定我们想从哪个表中选择这个列。这就是为什么它说这个列是模糊的。😊所以我们需要通过在前面加上表名来限定这个列。😊。

我们可以从订单表或客户表中选择,实际上没有关系,因为值是相等的,对吧?😊所以在你有多个表中有相同列的情况下,需要通过在前面加上表名来限定它,好的,现在再执行一次查询。

所以,你看,我们有订单ID,客户ID和全名,很美丽。😊现在在结束这个教程之前,还有一件事,如果你仔细注意。我们在多个地方重复了“订单”这个词,我们在这里也有,在连接条件中也是如此,客户表同样如此。

我们在这里重复了。😊我们可以通过使用别名来消除这种重复,使我们的代码更简单。所以在每个表后面,我们可以给它一个别名。😊O,是订单的简称。所以按照惯例,我们缩写表名。现在,无论何时我们有订单,应该用O替换它。所以在连接条件中,我们用O替换订单,再一次。😊。

在选择子句中。你看,我们也可以为客户表应用一个别名。😊我们得到了C,然后我们简化我们的连接条件,如此。😊所以这就是我们如何从多个表中连接列。现在,作为你的练习,我希望你查看订单项表。所以,在这个表中我们有订单ID。

产品ID,数量和单价。现在我想让你写一个查询,将这个表与产品表连接。对于每个订单,返回产品ID及其名称,后面跟着数量和订单项表中的单价,顺便说一句。

确保使用别名来简化你的代码。😊!

好的,首先,让我们从订单项目表中选择所有内容。然后将其与产品表连接,我们该如何连接这些表呢?😊。在订单项目表上,实际上我们现在就给它一个别名。所以我们用Oi作为订单项目的缩写,P作为产品的缩写。

所以Oi.dot产品ID。😊,应该等于P或产品do产品ID。顺便提一下,记住当你给表赋别名时,你必须在其他地方使用该别名。所以在这里我不能写出products。我的技能会对我大喊大叫。所以让我们使用缩写。好的,这就是我们如何连接这些表。让我们在此之后执行查询。😊,好的。

所以我们看到所有来自订单项目表的项目,后面是来自产品表的列。😊。现在我们想在这里明确选择几个列,所以从订单项目表中。我们想要选择。😊,或者它们的下划线ID。嗯,技术上讲。我们不必用表名来前缀,因为这个列没有在多个地方重复。

所以这并不模糊。让我们缩短代码,这样更好。😊。现在我们想选择产品ID列,但因为这个列在两个表中都有。我们必须用表名来前缀,OI或P都可以,实际上没关系。😊,接下来。我们想选择数量,最后选择单价。实际上这里在两个表中都有单价这一列。

所以这是订单项目表中的单价,这是产品表中的单价。现在你可能会好奇为什么在两个地方都有这个列。原因是产品的价格可能会变化。所以对于每个订单项目,我们想要在用户或客户下单时的价格。

所以这是在特定时间点的价格快照。我们在产品表中的单价。是现在的当前价格。这对于报告非常重要。否则,我们无法正确计算销售。因此,因为在这种情况下我们在两个地方都有单价列。

我们应该从订单项目表中选择,因为这是下单时的价格。现在让我们执行查询,这就是最终结果。😊。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P19:L19- 跨数据库联接 - ShowMeAI - BV1Pu41117ku

哦。在现实世界中,当你作为开发者或数据库管理员工作时。你常常需要与多个数据库合作。在本教程中,我将向你展示如何合并来自多个数据库表的列。这是相当简单的。所以在SQL store数据库中,我们有这些你比较熟悉的表。

现在假设这个产品表不在这里。😊,现在,如果你查看SQL库存数据库。你可以看到这里有。😊,另一个产品表。这个产品表与我们在SQL store数据库中的产品表完全相同。因此它具有相同的列和相同的数据。😊,从技术上讲,这并不是一个好的设计。

我们不希望在多个地方重复相同的表。但是为了这个演示,假设我们在这里没有产品表。所以我们想将订单项表与SQL库存数据库中的产品表连接。让我们开始吧。因此,从订单项表中选择所有内容,我们立即给它一个别名。我们想将其与产品表连接。这个产品表是SQL库存数据库的一部分。所以我们必须在前面加上它的数据库名称。因此我们输入SQL inventory。

😊,点。😡,现在,再一次,我们可以给这个一个别名,例如P。😊,然后输入我们的连接条件。因此,OI.dot产品ID应该与P.dot产品ID相同,让我们运行一个查询。你看,这样我们就成功地连接了跨多个数据库的表。请注意,我们在前面加上产品表的数据库名称,因为我们正在对SQL store数据库编写这个查询。

请查看导航面板,SQL store数据库以粗体显示,因为我们之前写了。😊,使用语句选择了一个数据库,即SQL store。现在,如果我们选择SQL库存数据库,会发生什么呢?让我们看看。因此SQL inventory。😊,现在。由于我们有多个语句,我们必须用分号结束这一切。😊。

现在我们想从订单项表中选择所有内容。 但是我们在这个数据库中没有这个表。😊。所以现在我们必须在这个表名前加上它所在数据库的名称,即SQL Underline Store。😊。让我们执行这个查询。😊,好的,一切运作得非常顺利。所以这是教训。

你只需要为那些不属于当前数据库的表加上前缀。换句话说,你的查询将根据当前数据库而有所不同。😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P2:L2- 什么是 SQL? - ShowMeAI - BV1Pu41117ku

🎼让我们以快速概述数据库开始课程,什么是数据库以及我们如何使用它。数据库是以易于访问的格式存储的数据集合。为了管理我们的数据库,我们使用一个叫做数据库管理系统(DBMS)的软件应用程序。我们连接到DBMS并给它指令以查询或修改数据,DBMS将执行我们的指令并返回结果。

🎼现在有几种数据库管理系统,这些系统分为两类:关系型和非关系型,也称为NoSQL。在关系型数据库中,我们将数据存储在通过关系相互链接的表中,这就是我们称这些数据库为关系型数据库的原因。每个表存储特定类型对象的数据,如客户、产品、订单等。SQL或结构化查询语言是我们用来操作这些关系型数据库管理系统的语言。它看起来像这样:我们使用SQL查询或修改数据。在本课程中,我们将学习关于这门强大语言的一切。现在市面上有许多不同的关系型数据库管理系统,最流行的有MySQL、微软的SQL Server和Oracle,当然还有许多其他的。每个数据库管理系统都有自己版本的SQL,但所有这些实现都非常相似。

🎼基于标准SQL规范,因此你在本课程中学习的大部分SQL代码都适用于任何数据库管理系统,在本课程中我们将使用MySQL,这是全球最受欢迎的开源数据库。

现在回到这个图表,关于非关系型数据库:在非关系型数据库中,我们没有表或关系。这些数据库与关系型数据库非常不同,但这是另一个完全不同课程的话题。你需要知道的是,非关系型数据库管理系统不理解SQL,它们有自己的查询语言,因此我们使用SQL来处理关系型数据库管理系统。在我们开始安装MySQL之前,让我迅速澄清一件事:当你与不同的人交谈时,你会听到SQL的两种不同发音:SQL或S-Q-L。哪个是正确的发音?这要看你问谁,当然每个人都认为自己的发音方式是正确的。但这里有一个关于这门语言的小历史:SQL最初是在70年代由IBM开发的,当时最初被称为QL,代表结构化英语查询语言,但后来他们将缩写改为SQL,因为QL。

一直以来,这种语言的发音方式存在争议。一般来说,非英语国家的人称其为SQL。我习惯称之为SQL,因为它比SQL更简短、更易记,但如果你更喜欢称它为SQL,我对此完全没问题,我不会因此而生气。这就是这种语言的历史。那么,关于MySQL作为软件产品,开发者们更喜欢称之为MySQL,而不是MyQL,但他们并不介意我们称之为MyQL。在本课程中,我将教你如何使用MySQL。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P20:L20- 自联接 - ShowMeAI - BV1Pu41117ku

哦,在SQL中,我们也可以将表与自身连接。让我给你一个例子。看看这个数据库,SQL HR。😊在这个数据库中,我们有这两个表:员工和办公室,让我们查看员工表中的数据。你看,这里有这些列,员工ID,名字,姓氏,职位。

薪资和reports2,这是这个员工或此人的经理的想法。现在我们不想在这里重复经理的信息,比如他们的电话号码、地址,因为这些信息将来可能会改变,因此我们仅使用他们的标识符或ID在表中引用他们。

现在,我们在哪里可以找到关于这个经理的信息呢?嗯,这个经理实际上是同一组织的员工😊。看看这个例子,经理ID是37270。现在,如果你看左侧,这里是那位经理的ID,也就是另一个员工😊。那么这个员工的经理是谁呢?让我们来看看😊。

我们这里没有任何值,所以这个销售的值为null。因此这个员工没有经理,这意味着他们是CEO😊。现在让我们写一个查询,将这个表与自身连接,以便选择每个员工及其经理的姓名😊。回到查询窗口,首先我们需要选择SQL HR数据库。接下来。

我们从员工表中选择所有内容,我们给它一个别名,如E。现在我们需要将这个表与自身连接。因此再次输入员工表,但我们需要一个不同的别名,我们该如何称呼这个别名呢?好吧,我们想将这个表与自身连接,以便找到经理,所以我们可以用M作为经理的缩写。

😊现在让我们写出我们的连接条件。因此,从员工表中,我们需要将reports underline两列连接到经理表,这基本上是员工表本身,涉及的列是员工的ID。现在让我们执行这个查询,看看结果😊。

我们看到员工表中的所有列都重复了,第一组列代表员工的信息,接着我们有关于经理的信息,在这个表中我们只有一个经理,但通过这个技巧我们可以轻松创建一个组织结构图,我们可以有一个经理的层级。现在让我们简化查询,只选择员工的姓名和他们的经理。

回到这里。由于员工表中的每一列都重复了两次,我们需要在每列前加上表名,例如,从员工表中你想获取员工的ID😊,以及名字。然后从经理表中你也想选择名字。

所以每一列都应该以表名或更准确地说,别名为前缀,因为所有这些列在两个表中都存在。对,我们来执行这个查询。😊,所以。这是我们得到的员工ID、名字。这里是经理的名字。我们可以通过给这个列一个别名来改进这个查询,因为有两个名字列是没有意义的,所以。😊,我们给第三列经理起一个别名。现在,再执行一次。

最终结果是,我们有员工ID、名字和Add。😊。因此,自连接表与连接其他表非常相似,唯一的区别是我们需要使用不同的别名,并且每一列都需要加上别名。😊,这就是我们所称的自连接。接下来,我将向你展示如何连接两个以上的表。😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P21:L21- 连接多个表 - ShowMeAI - BV1Pu41117ku

在本教程中,我将向您展示如何在编写查询时连接多个表,例如。回到我们的 SQL 商店数据库,看看订单表。😊。现在您知道如何编写查询,将此表与客户表连接,以返回每个订单的客户信息。但是这里我们还有一个类似于客户 ID 列的状态列,因此这些状态的名称并不存储在此表中,而是在订单状态表的其他地方。

我们快速看一下。所以我们的订单可以是处理中的、已发货或已交付的,这些是每个状态的标识符。现在回到我们的订单表。😊。在状态列中,我们存储订单状态 ID。因此现在我们应该编写一个查询,将订单表与两个表连接。

客户表和订单状态表,这个查询的结果将如下所示。😊。因此,对于每个订单,我们看到订单 ID、日期、客户的名字和姓氏,最后是订单的状态,这是我们可以为用户创建的美丽报告,所以让我告诉您如何编写这个查询。

😊,回到我们的查询编辑器,首先我们需要选择 SQL 商店数据库。现在我们需要从。😊,订单表中选择所有内容,让我们给它一个别名。😊。接下来,我们要与客户表连接。哦,客户 ID 应该等于那个客户 ID。目前为止没有新内容,和之前完全一样。

现在这里我们可以写另一个连接关键字。😊,将订单表与订单状态表连接。因此我们输入订单状态,并给它一个别名,比如 O。我们的连接条件是什么?好吧。回到订单表,我们有状态列,因此该列中的值应等于订单状态表中的订单状态 ID 列,对吧,所以回到查询。😊。

所以订单表的状态应该等于订单状态的订单状态 ID。确保名字正确,不要拼写错误。否则您将遇到错误。这就是我们如何连接三个表。在现实世界中,随着您处理更复杂的问题,您可能会最终连接多达 10 个表。因此,在 SQL 世界中,这并不罕见。

现在让我们继续执行这个查询。😊,首先我们从订单表中获取列,接着是客户表的列,依此类推。这个结果非常复杂,难以提取信息。😊。让我们明确选择几个列,从订单表中。

我们想选择订单 ID 列。😊,以及订单日期,然后从客户表中选择名字和姓氏?最后,从订单状态表中选择名称列,现在我们可以给它一个别名,比如状态。😊,这样更好。让我们再执行一次查询。😊,所以,结果如下,我们有订单 ID 或日期。

客户的名称,接着是订单的状态。😊

嗯。

好吧,作为你的练习,看看这个SQL发票数据库。这里有一个支付表,这些是每个客户对特定发票所做的支付。让我们看看数据。😊,我们有像客户ID这样的列来识别客户,因此可以将此表与客户表连接,以查看客户的名称。😊。

接下来我们有发票ID,还有日期、金额和支付方式。因此,我们可以类似地将此表与支付方式表连接。让我们看看这个表中的数据,这些是支付方式:信用卡、现金、PayPal和电汇,所以回到支付表,我希望你写一个查询,将此表与支付方式表以及客户表连接,生成一个显示更多细节的报告,比如客户名称和支付方式。

嗯。一开始,我们需要使用SQL发票数据库。现在我们可以选择支付表中的所有内容,我们称之为P。😊。接下来,我们要将其与客户表连接,称之为C。😊。在P的客户ID应该等于C的客户ID,让我仔细检查一下列名,以确保我没记错,回到支付表,列叫客户ID。

😊,我们还有一个叫做支付方式的列,需要与支付方式表的支付方式ID列连接。所以回到查询中。再次使用连接语句。与支付方式连接,但给它一个别名PM。在P的支付方式上,应该等于PM的支付方式ID。

确保正确输入,否则会出现错误。让我们继续执行到此为止的查询。好了。最后,让我们选择最有意义的列。所以,从支付表中选择一个日期,接着是发票ID。还有什么呢?我们有客户ID,发票ID,日期。

金额和支付方式,我也要从这里选择金额列。回到查询P。金额。😊,现在我们需要添加客户的信息。让我们看看这个表,客户。这里有像名称、地址、城市等列。我们需要的只是名称列,所以回到查询。😊,从客户的表中。

让我们选择名称列,最后从支付方式表中选择那个列?😊,它叫做名称。所以回到查询。PM,那名称。所以这是最终结果。😊,现在我们可以按任意顺序放置这些列,这真的无所谓,让我们执行查询,确保一切正常。😊,那么在这个日期。

对于这个发票,我们有这个客户使用信用卡支付的金额。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P22:L22- 复合连接条件 - ShowMeAI - BV1Pu41117ku

哦。在你所看到的所有示例中,我们使用单个列来唯一识别给定表中的行。例如,在客户表中。我们有这个客户ID列,它唯一标识此表中的行。但有时我们不能仅使用单个列来唯一标识给定表中的记录。例如,看一下订单项表。在一个表中,我们有诸如订单ID、产品ID等列。

等等。现在如果你查看数据,你会发现订单ID列中的值是重复的。它们是重复的,我们有2、2、2、66等等,因此我们不能仅凭此列唯一识别每条记录,产品ID也是如此,这一列中的值也被重复,因此在这个表中我们使用这两个列中值的组合来唯一识别每个订单项,作为例子,在这个订单中我们有三项产品。

4和6,每个产品都有数量和单价。😊。因此,如果我们使用这两个列中值的组合,我们可以唯一识别每个订单项。换句话说,我们没有两个记录对应订单ID2和产品ID1,现在我们只为该项有一条记录,好的,现在让我们在设计模式下打开这个表,所以在这里点击这个看起来像工具的中间图标。😊,注意,这两个列上都有表示主键的黄色钥匙。

这就是我们所说的复合主键,复合主键包含多个列。😊,那么这有什么重要性呢?当你有一个复合主键的表时,你需要学习如何将该表与其他表连接,例如。

这里我们有这个订单项备注表,用于保存每个订单项的备注,让我们看看这里的数据,因此我们有这个备注ID列,它唯一标识此表中的记录,旁边是订单ID和产品ID,你会发现这两列的组合唯一表示一个订单项。

😊,所以对于订单号二,产品号一,我们有两条备注。😊。现在让我告诉你如何将这个表与订单项表连接。😊,所以回到我们的查询。😊。你可以看到我已经选择了SQL存储数据库,所以我不需要输入使用语句。😊,好吧,让我们从中选择所有内容。

订单项表。给它一个别名。😊,现在我们需要将其与订单项备注连接。也给它一个别名。😊,我们将如何根据两个列连接这些表,回到订单项表?

这些是我们在联合条件中需要使用的列。因此在订单项表中,我们有这个订单 ID 列。这将等于订单项备注表中的同一列,所以是 OIN.dot.order ID。但是这还不够,我们还应该根据产品 ID 列来连接这些表。因此我们输入“and”,然后输入我们的第二个条件。

所以订单项的产品 ID 应该等于订单项备注的产品 ID。这就是我们所说的复合连接条件,因此我们有多个条件来连接这两个表。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P23:L23- 隐式连接语法 - ShowMeAI - BV1Pu41117ku

哦。在这个教程中,我将讨论MySQL中的隐式连接语法,所以这里我们有一个基本的内连接。我们从订单表中选择所有内容,与客户表连接,条件是订单的客户ID等于客户的客户ID。这是基本的,使用隐式连接语法还有另一种方式来编写这个查询。让我告诉你这是如何工作的。

😊,所以。我们选择所有内容。从现在开始,我们可以输入多个表名,比如订单、客户,并且我们也可以给它们起别名,比如C和O。然后我们将这个连接条件移动到where子句中,所以我会从这里复制,输入一个where子句并粘贴条件。😊这两个查询是等价的。😊。

我们这里有的是隐式连接语法。虽然MySQL支持这种语法,但我建议你不要使用,因为如果你不小心忘记输入where子句,你会得到一个笛卡尔积。😊让我给你演示一下。我首先会删除第一个查询。😊并执行这个。

所以我们得到了10条记录,因为在这个数据库中我们有10个订单,目前一切顺利。😊但是如果我们不小心忘记输入where子句会发生什么呢?结果可能不是10条记录,而是100条记录,因为订单表中的每一条记录现在都与客户表中的每一条记录连接。😊这就是我们所称的笛卡尔积,稍后在本节中我将更详细地讨论笛卡尔积。

但我想在这个教程中指出,使用显式连接语法更好。所以我们使用连接,因为这个语法强制你输入连接条件。😊 如果你只是将订单与客户连接而不输入连接条件,你会遇到语法错误,所以重申一下,要注意隐式连接语法。

但是使用显式语法编写所有的连接。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P24:L24- 外连接 - ShowMeAI - BV1Pu41117ku

哦。在这一部分我之前告诉过你,在SQL中我们有两种连接:内连接和外连接。目前你只看到了内连接的例子,我还告诉你这个内关键字是可选的,所以每当你输入一个连接时,你都是在使用内连接。在本教程中,我们将讨论外连接及其解决的问题。

😊,所以让我们开始写一个使用内连接的查询,然后将其转换为外连接。所以选择。😊。从客户表中选择所有内容。将其与订单表连接。客户ID应该等于订单ID。很基础,对吧?😊,现在,为了清晰起见。

让我们从这两张表中挑选几个列。所以从客户表中,我想挑选客户ID和名字。而从订单表中,我想挑选订单ID。😊。现在最后,让我们对结果进行排序,这样我们就能清楚地看到我们得到的内容,按客户ID排序。😊。让我们执行这个查询,看看我们得到什么。这里是结果。

对于客户编号二,名为InNs或Inus,无论怎样,我们有两个订单,订单4和订单7。同样对于客户编号五,我们也有两个订单,依此类推。现在这个结果中缺少了一些东西。我们只看到在系统中有订单的客户。这些是客户2,5,6,7,8和10。但如果你查看客户表。

你可以看到我们有其他客户,比如客户编号一,客户编号三等等。现在目前这些客户没有任何订单,这就是我们在这个结果集中看不到他们的原因。但是如果你想看到所有客户,无论他们是否有订单,该怎么办呢?

这就是我们使用外连接的原因,让我给你展示一下是怎么回事。所以回到我们的查询。😊。我们只看到有订单的客户是因为在连接这两张表时的这个连接条件。我们只返回匹配此条件的记录。因此对于某个客户,如果我们确实有订单。😊,那记录就会被返回。但是正如你刚才看到的。

我们的一些客户没有订单。因此对于那些客户,这个条件不成立。这就是他们在结果集中没有被返回的原因。为了解决这个问题,我们使用外连接。在SQL中,我们有两种外连接:左连接和右连接。当我们使用左连接时。

在这种情况下,左表中的所有记录,无论该条件是否为真,都会返回客户。因此,我们得到了所有客户,如果他们确实有订单,我们也会看到订单ID。让我们执行这个查询,看看我们得到什么。😊,所以。你看,客户编号一没有订单,这就是为什么我们在这个单元格中得到null。😊。

客户编号 2 有两个订单,4 和 7。客户编号 3 也没有订单。因此我们对订单 I 为空。这是左连接的结果。所以回到我们的查询。当我们使用左连接时,左表中的所有记录都会被返回,无论这个条件是否成立。现在,如果我们使用右连接会怎样?😡 在这种情况下。

从订单表中返回所有记录,无论这个条件是否成立。让我们执行这个查询,看看我们得到了什么。我们得到的结果与之前使用内连接时相同,因为我们正在选择右表中的所有记录。

这是订单表,所以我们不看到所有的客户。我们现在看到的是所有的订单。如果你想使用右连接并且仍然看到所有的客户,你需要交换这些表的顺序。所以。😊 我们将订单表放在第一位。这将是我们的左表,然后我们将客户放在右侧。

所以现在使用这个查询,我们将返回来自右表的所有记录,也就是客户表。让我们执行这个查询,得到了。所有的客户,无论他们是否有订单,真美好。在结束这个教程之前,最后一件事。我看到开发者在这里使用外部关键字,所以无论是右外连接还是左外连接。

但从技术上讲,外部关键字是可选的,就像内部关键字一样。所以你不必键入它。😊 所以我将去掉这个,以使我的代码更简洁、更易于理解。回顾一下,如果你使用了 join 关键字,你就是在进行内连接;而如果你使用了左连接或右连接,你就是在进行外连接。😊 这是我们本教程的练习。

我希望你写一个查询,产生这个结果。所以我们在这里有三列。产品 I 名称和我从订单项表中选出的数量。所以在这里我们需要将产品表与订单项表连接,以便我们可以看到每个产品被下了多少次订单。然而。

如果我们做内连接,我们只会看到已经被下过订单的产品。但在这里我在做外连接。所以。😊 产品编号 7 从未被下过订单,但它仍然存在于结果中,我们现在看到数量。所以请继续写一个外连接以产生这个结果。

好吧,首先我们从产品表中选择所有内容。😊 然后进行左连接与订单项表。我们的连接条件是 P.产品 ID 等于 Oi.产品 ID。所以因为我们使用的是左连接,我们将获得产品表中的所有产品。

无论这个条件是否成立。😊 如果他们从未下过订单,我们仍然会在结果中看到他们。现在让我们选择几个列以便于理解,比如 P。产品 ID。P.dot 名称和 Oi.dot 数量。就是这样。让我们执行查询。我们得到的结果与之前相同,所以所有的产品都在这里,产品编号 7 从未被下过订单。

所以我们看到数量为 null。😊

是的。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P25:L25- 多个表之间的外连接 - ShowMeAI - BV1Pu41117ku

哦。类似于内连接,我们可以在多个表之间使用外连接。让我给你展示一下。所以这是我们在上一个教程中写的查询。我们在客户表和订单表之间进行了左连接。当我们执行这个查询时。😊。我们会得到所有客户,无论他们是否有订单,如果他们有订单。

我们看到订单ID。😊,太美了。现在,如果你查看订单表。😊。你会看到我们的一些订单有发货人ID。这些是已经发货的订单。现在让我们将订单表与发货人表连接,以在结果中显示发货人的名称。所以回到查询。😊,在这个左连接之后,让我们在这里写另一个连接,我正在进行内连接。

所以让我们把订单表与发货人表进行内连接,连接发货人。😊。我们称之为SH,连接条件是什么呢?发货人ID应该等于S。发货人ID。好的,所以在这个查询中我们有一个左外连接和一个内连接。😊。让我们看看我们得到什么。😊,好吧,我们只看到五条记录,但我们还有更多的订单。

所以在这里我们遇到了之前同样的问题,我们的一些订单没有发货人,这就是为什么它们没有在这里返回。换句话说。😊,这个连接条件对我们的一些订单来说不成立,所以回到订单表。作为一个例子,这个第一个订单没有发货人,发货人ID是null,这就是为什么它没有在查询结果中返回。😊,所以要解决这个问题。

我们应该使用左连接。我们想确保所有订单都返回,无论他们是否有发货人。所以回到查询。😊。我们需要将这个内连接替换为左连接。😊。让我们执行查询,看看会发生什么。现在我们应该有更多的订单。

来吧。😊,现在为了让这个例子更有趣,我将把发货人名称添加到这里。😊。回到我们的选择子句。我们添加一个新列,像是shipper.dot.name。我们可以给它一个别名,比如shipper。让我们执行这个查询,看看结果。所以我们得到了所有的客户,无论他们是否有订单,而对于那些有订单的客户,我们得到了所有的订单。

无论他们是否有发货人,这就是外连接的力量。在上一个教程中,你学到了使用左连接或右连接都可以得到相同的结果,你只需交换表的顺序。然而,作为最佳实践,避免使用右连接。因为当你连接多个表并且有左连接、右连接和内连接时。

事情会变得非常复杂。其他人阅读你的代码时,会很难想象你是如何连接这些表的。例如,如果你在这里有一个右连接,然后再进行一个左连接,想象这些表是如何连接的就会变得更加困难,因此作为最佳实践,避免使用右连接,改用左连接。😊。

这是本教程的练习。我希望你写一个查询,产生这个结果。所以这里我们有这些列:订单日期、订单 ID、客户的名字、发货人。我们可以看到我们的一些订单尚未发货,所以这里有 null,最后是这个状态。花两到三分钟做这个练习,完成后继续观看。

😊 嗯。好的,让我们从订单表中选择所有内容。😊 现在我们应该将其与客户连接。条件是客户 ID 应该等于客户 ID。在这里我使用内连接,因为每个订单都有客户,所以这个条件总是有效,无论我们在这里使用左连接还是内连接。好的,现在在继续之前。

让我们选择我们的列,从订单表中我想选择订单 ID。😊 接下来是订单日期,然后是客户的名字。我们可以选择性地将其重命名为客户。好的。接下来,我们需要选择发货人。😊 我们将结果与发货人表连接。条件是发货人 ID 等于发货人的发货人 ID。不过,如果你在这里使用内连接。

由于我们的一些订单没有发货人,我们只会看到已发货的订单。让我展示给你。为了清晰起见,我将添加发货人的名字,所以发货人名称为发货人。让我们执行查询。你看,我们只看到已发货的订单,但我们想看到所有订单,对吧?

所以我们需要将第二个连接更改为左连接。😊 这样所有订单都会返回,无论它们是否有发货人。让我们再执行一次查询。你看,现在我们看到从第一个到第十个的所有订单,美丽。最后,我们需要在这里添加状态列。所以我们需要再进行一次连接,连接订单状态。

我们将其缩写为 OSs,在 O 的状态上。等于 O 的订单状态 ID。你可以看到我设计这个数据库时,有时我们的列名是完全相同的,但在其他情况下则不匹配。因此在订单表中我们称这个列为状态,而不是订单状态 ID,这是故意的,因为许多真实数据库都是这样的。

好的,现在让我们添加状态名称,所以订单状态为名称。作为状态。执行查询。我们可以看到这里所有的订单,对于每个订单我们都有日期、客户、发货人和状态。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P26:L26- 自外连接 - ShowMeAI - BV1Pu41117ku

哦。早些时候我们讨论了 SQL 中的自连接,所以在 SQL HR 数据库中,我们有这个员工表。😊 我们写了一个查询来获取所有员工及其经理。所以这里有这一列 reports2,指定了每个员工的经理。让我们回去重写这个查询,以获取所有员工及其经理。😊

回到我们的查询编辑窗口。首先,让我们使用 SQL HR 数据库。然后选择所有内容。😊 来自员工表。我们给它一个别名,然后与自身连接。😊 这就是我们所称的自连接。现在我们将使用一个不同的别名,例如 M 代表经理。😊 现在,连接条件是 E.dot reports to 应该等于 M.dot employee ID,目前为了清晰起见。

让我们只选取三列,E.dot employee ID,E.dot first name,和 M.dot first name,我们将其重命名为经理。好的,让我们执行这个查询,看看我们得到什么。所以这是结果。正如我们所看到的,所有这些员工都有同一个经理。然而,这里缺少了一些东西。我们没有这个人的记录,也就是这个经理本人。

所缺少的是我们可以看到这个人的员工 ID、姓名和经理的记录,而经理应该是 null,因为这个人是 CEO 或公司的负责人。但为什么会这样?这是因为我们的内连接。因为我们这里的条件只会返回有经理的人。

我们可以通过使用左连接来解决这个问题,所以我们进行左连接,因为我们想要获取这张表中的每一个员工,无论他们是否有经理。😊 好的,现在我们再执行一次查询。😊 来吧,现在我们有这个人的记录,经理,正如你所看到的,这个人没有经理,这就是我们这里有 null 的原因。😊

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P27:L27- USING表达式 - ShowMeAI - BV1Pu41117ku

哦。

回到我们的 SQL 存储数据库,这里有一个简单的查询,将订单表与客户表连接在一起。这是我们的连接条件。你之前见过几个这样的例子。随着查询变得更加复杂,这些连接条件会造成困扰。它们使得我们的查询难以阅读,但好消息是,在 MySQL 中。

我们有一个强大的功能可以简化这些查询。😊。如果这两张表中的列名完全相同,我们可以用 using 子句替换 on 子句,这样更简单更短。让我给你演示一下。所以我要注释掉这一行,而是输入 using。😊,在括号中。

我们键入的列名是客户 ID。第 7 行的内容与第 6 行完全相同,但更短且更易读。所以让我删除这一行。我们可以在这里添加另一个连接语句,将订单与发货人连接,因此连接发货人。😊。使用。这两个表中都有的发货人 ID,我们有一个完全相同的列名。好的。

现在让我们执行这个查询。这是我们得到的结果。我们有订单 ID,后面跟着客户的名字。让我们在这里添加一列。因此。我将添加。SH。那个名字是发货人的名字,所以发货人。现在显然因为我们的一些订单没有发货。我们需要将这个内连接替换为左连接。😊。

所以我们可以在内连接和外连接中使用 using 关键字。让我们再执行一次查询。现在我们在每个订单旁边都有发货人名称。很棒。😊,然而,我们不能使用这种技术将结果与订单状态表连接,因为在订单表中我们有一个名为状态的列,但在订单状态表中,这一列有不同的名称。

它是订单状态 ID,让我给你演示一下,所以订单状态列。看,这里有订单状态 ID。所以只有当不同表中的列名完全相同时,using 关键字才有效。现在,如果我们的连接条件中有多个列,例如,之前。

我们谈到这个订单项目表。😊,我告诉你在这个表中我们有一个复合主键。这基本上意味着一个由多个列组成的主键。因此,这两列的组合唯一标识这个表中的每条记录。如果你想将这个表与订单项目备注表连接,在我们的连接条件中,我们应该将这两列与订单项目备注表中的对应列进行比较。

所以让我们快速编写这个查询,然后用 using 关键字简化它。😊,所以选择所有内容。从订单项目。现在将其与订单项目备注连接。在这里,我们需要比较 Oi。订单 ID 与 OI。订单 ID。还有。OI dot 产品 ID 等于 OIN dot 产品 ID。这个连接条件有点混乱。这条查询很难阅读。

现在我们可以用 using 关键字简化这个查询。因此我们谈到使用。😊 在括号中,我们添加两个列并用逗号分隔它们,所以是订单 ID 和产品 ID。

这样不是更好吗?嗯。

现在进行练习,回到我们的 SQL 开票数据库。写一个查询,从支付表中选择支付记录,生成类似这样的内容。因此在这个表中,我们有日期、客户、金额和支付方式,我们可以看到在什么日期谁支付了多少,使用了什么支付方式。

好的,我将使用 SQL 开票数据库。😊 然后选择所有内容。😊 从支付表中。将其与客户表连接。使用客户 ID,因为在这两个表中,我们都有客户 ID 列。接下来,我们需要与支付方式连接,然而这两个表之间的列名不同。

所以在支付表中,我们有一个叫支付方式的列,但在支付方式表中我们的列叫支付方式 ID。😊 所以在这里我们不能使用 using 关键字。我们必须使用 on 子句,因此 on P.dot.payment 方式等于 PM.dot.payment 方式 ID。

现在让我们选择我们的列,支付日期、客户姓名,我们将其重命名为客户。接下来,我们选择金额,最后是支付方式,所以让我们将其重命名为支付方式,并执行查询。这样就得到结果了。😊 日期、客户、金额和支付方式。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P28:L28- 自然连接 - ShowMeAI - BV1Pu41117ku

哦。在我的技能中,我们还有另一种更简单的方法来连接两个表。它叫做自然连接,更容易编码,但我不推荐,因为有时会产生意想不到的结果。但让我快速向你展示一下它是如何工作的,以防你在某处看到过,至少你对此有些了解,所以回到之前的例子,让我们选择订单表中的所有内容。

现在我们应该与客户表进行自然连接。现在通过这些自然连接,我们不明确指定列名,因此数据库引擎将查看这两个表,并根据具有相同名称的公共列进行连接,这就是为什么这个查询写得很简短的原因。

为了清晰起见,我们选择这里的几列。O的订单 ID D,并看一下名字。😊,让我们执行查询,看看吧。😊。所以我们看到所有订单和客户会下的单。因此,自然连接确实很容易编码,但它们可能有点危险,因为我们让数据库引擎来推测连接。

我们无法控制这一点。正因如此,自然连接可能会产生意想不到的结果,这就是我不鼓励你使用它们的原因。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P29:L29- 交叉连接 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我们将查看 SQA 中的交叉连接。我们使用交叉连接将第一张表中的每一条记录与第二张表中的每一条记录组合或连接。这里有一个例子。让我们选择所有内容。😊,来自客户表。现在我们在这里进行交叉连接。与产品表。因此,客户表中的每一条记录将与产品表中的每一条记录组合。

这就是为什么我们这里没有条件。好的,这就是我们所说的交叉连接。为了清晰起见,我们选择几列。比如看到这个名字。我们将其重命名为客户,然后是产品名称,我们将其重命名为产品。此外,让我们按客户的名字对结果进行排序。现在执行查询。😊

这是交叉连接的结果。所以首先我们有 Amber 作为客户。然后是所有与不同产品的组合。接下来,我们有 Barbara 或其他的。再次,我们有这个客户与所有产品的组合。在这个特定的例子中,使用交叉连接并没有太大意义。

使用交叉连接的真实例子是当你有一个包含小、中、大的尺寸表和一个包含红、蓝、绿等颜色的表时。然后你想将所有尺寸与所有颜色结合起来。这就是你使用交叉连接的时机。😊现在,我们所拥有的被称为交叉连接的显式语法。

我们还有隐式语法,这样看起来就不是输入交叉连接。我们在 F 子句中输入多个表,所以是客户和订单。这两个查询产生相同的结果,但我个人更喜欢使用显式语法,因为它更清晰。

这里有一个简单的练习给你。对运输商和产品做一个交叉连接。首先用隐式语法,然后用显式语法。这个过程相当简单。我只希望你在代码中动手,熟悉这种语法。😊

好的,首先,我将使用隐式语法,然后我将向你展示显式语法。让我们开始选择两个表中的所有内容,运输商。😊和产品。为了清晰起见。让我们选择两列,运输商的名字,我们将其重命名为运输商。产品名称,我们将其重命名为产品。最后,让我们按运输商的名字对所有内容进行排序。

让我们执行查询。这是我们得到的结果。所以所有运输商和所有产品的组合。太美了。现在让我们使用显式语法。所以我们从基础表中选择所有内容,在这种情况下,是运输商,然后与产品进行交叉连接。😊这产生了完全相同的结果。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P3:L3- 备忘单 - ShowMeAI - BV1Pu41117ku

嗨,大家好,我是Mosh。我想让你们知道,在这门课程中,你真的不需要记住任何东西,因为我为你们准备了一份完整的备忘单和总结笔记。你可以在视频下方的描述框中找到它。因此,我尽力为你们创造了一门尽可能全面的SQL课程。如果你能通过点赞和分享这个视频来支持我的努力,我将非常感激。

非常感谢你。现在,让我们继续。😊。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P30:L30- 联合 - ShowMeAI - BV1Pu41117ku

哦。我们已经涵盖了所有关于连接的内容。你将了解到,通过连接我们可以组合来自多个表的列。但在SQL中,我们也可以组合来自多个表的行,这个功能极其强大。让我给你展示一下它是如何工作的。😊,首先,让我们快速查看我们的订单表。所以从订单表中选择所有内容。现在,如果你查看数据。😊。

我们可以看到第一个订单是在当前年份2019年下单的。所有其他订单都是在之前的年份下单的。现在假设我们想创建一个报告,获取所有订单,并在每个订单旁边添加一个标签,如果订单是在当前年份下单,标签将是active,如果订单是在之前的年份下单。

我们想将其标记为归档。所以。😊,让我们更改查询并在这里添加一个条件。首先。我们想获取当前年的所有订单,所以条件是。订单日期大于或等于2019年01月01日。现在我只是想强调,这不是获取当前年订单的理想方式,因为这里我们硬编码了2019。所以如果我们在明年执行这个查询,我们不会得到正确的结果。

但现在不用担心,稍后在课程中我会告诉你如何在不在这里硬编码日期的情况下获取当前年的订单。😊,所以让我们执行这个查询。😊,现在我们只得到一个订单,让我们挑选几个列。比如订单ID。还有订单日期。并且,我想在这里添加一个字符串字面量。😊,比如active。对吧。让我们执行这个查询。这就是我们得到的结果。我们有三列,订单ID,订单日期。

还有一个active,在这一列中我们目前有这个字符串值active。😊。现在让我们也把这一列重命名为状态。并执行查询。😊,这更好了。现在我们想写一个类似于这个的查询,返回前几年的订单,但有一个不同的标签归档,所以为了节省时间。😊,我将复制这几行。

然后将它们粘贴在我们的第一个选择语句后面。请注意,这里我们有一个语法错误,因为我们没有用分号终止第一个选择语句。但现在不用担心,我们马上会回到这个问题。所以对于第二个查询。

我们想返回一个不同的标签归档。😊,而且我们想将条件更改为小于2019。现在。只需选择这几行并通过点击这里的图标或使用你在课程中学到的键盘快捷键来执行这个查询。

看!这里是所有来自前几年的订单,带有归档标签。这个查询返回了九条记录,而之前的查询返回了一条记录。现在使用联合操作符,我们可以将这两个查询的数据结合在一起。在我们的选择语句之间,输入union。现在让我们再执行一次查询。

所以这是我们当前年份的第一张活动订单,下面是之前年份的所有订单。因此,通过使用union运算符,我们可以合并多个查询的记录。在这个例子中,我们的两个查询都是针对同一张表,但我们也可以对不同的表进行查询,然后将结果合并成一个结果集。😊 让我给你展示另一个例子。我要把这里的所有内容删除。😊

让我们从客户表中选择名,然后我们可以将其与。😊 发货人表中的姓名进行union。让我们执行查询。这样在一个结果集中,我们可以看到所有的客户和所有的发货人。据我所知,这个特定查询在现实世界中没有实际应用案例。

但我想指出的是,通过union你可以合并多个查询的结果。😊 这些查询可以针对同一张表或不同的表。在你的数据库中,你可能会有一张类似“归档订单”的表,和另一张“订单”表。然后你可以将所有归档的和活动的订单合并成一个结果集。

只需记住,每个查询返回的列数应该相等。否则你会得到一个错误。例如,让我们从客户中选择名和姓,然后将其union。😊 用发货人姓名来做,让我执行这个查询,我们会得到一个错误,因为这个查询的第一部分返回了两列。

但第二部分返回了一列。因此我的技能不知道如何合并这些记录。在我们完成这个教程之前还有最后一件事。如果你查看这里的结果,这一列的名称基于第一个查询,所以第一个查询返回了名。也正因如此,这一列被称为名。如果我们改变这些查询的顺序。

并把这个union放到这里。现在让我们运行这个查询。😊 如我们所见,我们的列叫做姓名。因此,我们在第一个查询中的内容用于确定这些列的名称,我们也可以将列重命名为“全名”。

有一个。

好的,这里是你本教程的练习。写一个查询来生成这个报告,这里我们有四列:客户ID、名、积分和类型。正如你所知,我们在客户表中没有这个列,所以我们根据每个客户的积分计算了这一列的值。

如果他们的积分少于2000,他们的类型是青铜;如果他们的积分在2000到3000之间,他们是银客户;如果他们的积分超过3000,他们是金客户。同时请注意,我们在这里是按名对结果进行了排序。那么现在请花两分钟时间来写这个查询。好的,首先。

让我们获取青铜客户。所以从客户中选择所有记录,条件是😊,积分少于2000。现在我们要选择三列:客户ID、名字和积分。最后,我们添加一个新列,内容为字符串字面量😊,Fronance。让我们运行这个查询,看看结果。这里是所有的青铜客户。

但是这个列的名称是青铜。我们不想要这个名称。所以让我们把它重命名为类型。现在这部分超出了屏幕范围。所以我会把它分成多行,使我们的查询更清晰、更易读。😊。好吧,让我们再运行一次查询。现在这个列叫类型 Beai。

现在我们应该进行一次合并。并重复这个查询,但提取白银客户。所以我会把这个查询粘贴到这里。😊,然后进行一些更改。我将把青铜替换为白银。并将条件改为在2000到3000之间。让我们运行查询,看看结果。我们首先得到了所有的青铜客户。

接下来是所有的白银客户。这些记录的顺序是根据我们的查询结果。在第一个查询中,我们得到了青铜客户,所以它们排在最前面。但这不是我们想要的。我们想要按客户的名字对结果进行排序。所以让我们在最后添加一个排序。按照名字排序。现在还有一部分内容没有处理。

我们应该再进行一次合并。我准备查询以获取黄金客户。所以我将选择这几行并😊,把它们粘贴到这里。现在将白银改为黄金。并将条件更改为积分大于3000。最后我们再做一次排序。让我们再运行一次查询。😊,这是最终结果。

我们的客户按名字排序。我们可以看到所有的青铜、白银和黄金客户。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P31:L31- 列属性 - ShowMeAI - BV1Pu41117ku

哦。在这一部分,我将教你如何插入、更新和删除数据。在开始之前,让我们仔细看看我们的客户表,所以请点击这个中间图标,以设计模式打开这个表。你看到的内容一开始可能看起来有点吓人,但相信我,这其实很简单,在本教程中我将准确解释这些列中的内容。

😊所以在左侧,你可以看到列名,旁边是每列的数据类型。因此,我们的客户ID列只能接受整数值。整数是像1、2、3、4这样没有小数点的整数。名字是varchar,代表可变字符,现在这里的括号中。

我们可以看到50,这基本上意味着在这一列中,我们最多可以有50个字符。现在如果客户的名字只有五个字符长,我们只存储这五个字符。所以即使这一列的最大长度是50,我们也不会浪费空间,如果客户的名字少于50个字符。

这就是为什么我们这里有varchar,代表可变字符。相反,我们还有另一种数据类型是字符。😊如果这里是字符50,而客户的名字只有五个字符长,my skill会插入额外的45个空格以填满这一列。这会浪费空间。因此,作为最佳实践,大多数时候我们使用varchar来存储字符串或文本值。

现在在右侧,我们有这一列PK,代表主键,因此客户ID被标记为主键,这就是我们这里有这个黄色钥匙的原因。这一列中的值唯一标识每位客户,旁边是NN,代表非空,这决定了这一列是否可以接受null值。在这种情况下,每个客户记录必须具有客户ID、名字、姓氏以及其他属性,但出生日期和电话是可选的,因此在这些列中可以有null值。现在我们还有另一列AI,代表自动递增,通常与主键列一起使用,因此每次我们在这个表中插入新记录时,我们让myql或我们的数据库引擎在这一列中插入一个值。因此,基本上它获取最后一行的客户ID,并在我们插入新记录时将其递增1。因此,如果你查看数据。

三?你可以看到目前我们这里只有10位客户,所以如果你有一位新客户,myQ会给新客户分配11,好的。😊最后这里还有另一列,指定每列的默认值。例如,对于我们的出生日期和电话列,默认值是null。因此,如果我们不提供值,myQ会对这些列使用null值。同样。

我们为积分列设置了另一个默认值。因此,如果我们没有为客户提供积分,我的技能将使用零。现在我们有几个其他列,在这个阶段并不重要。你将在课程的后面学习它们,所以现在你了解了这个表中每列的属性,接下来我们来向这个表中插入数据。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P32:L32- 插入单行 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,你将学习如何向表中插入一行。为此,我们将使用插入语句。😊 我们要将这一行插入到 customers 表中,所以我们在这里输入表的名称,后面跟上值子句。在这里的括号中,我们为这个表的每一列提供值。

所以回到我们的表定义,这些是所有的列。首先,我们需要为客户 ID 列提供一个值。然而,在这一列中,启用了自增属性,正如我之前告诉你的。如果我们不提供一个值,MySQL 会为我们生成一个唯一的值。😊 所以我们可以回到我们的语句,显式赋值或者使用默认值,让 MySQL 来生成这个值。

这是首选的方法,因为如果你使用像 200 这样的显式值,可能会有另一个客户拥有相同的 ID。所以当你执行这个语句时,你会得到一个错误,因为这一列中不能有重复值,每个值都应该是唯一的。因此,我们将使用默认关键字,让 MySQL 为客户 ID 生成一个唯一的值。

现在,在此之后,我们需要为名和姓列提供一个值。假设是约翰·史密斯。请注意,我用引号括住这些值,因为正如我之前告诉你的,在 SQL 中,我们应该始终用引号括住字符串和日期值,可以使用单引号或双引号。😊 现在,还有什么?回到我们的 customers 表。姓之后是出生日期,不过。

正如我们所看到的,这一列是可选的,因为这个复选框没有被选中。所以在这里我们可以使用 null 或显式值,null 表示没有值。😊 所以回到我们的语句。我们可以输入一个出生日期,比如 1990 年 1 月 1 日,或者我们可以使用 null 关键字在这个演示中,我将使用一个有效的日期。现在。

为了让这段代码更简洁易读,我将把它分成多行。😊 这样更好。现在回到我们的表。接下来,我们有电话,而电话也是可选的,因为这个复选框没有被选中,而 null 是这一列的默认值。

所以在这里,我们可以显式传递 null 或使用默认关键字,让 MySQL 将 null 放入这一列。这是完全相同的。所以回到我们的语句,我们可以传递 null 或默认。这两种方法都会有相同的结果。在这个例子中,我将使用 null 关键字。😊 好的,我们再看一下我们的表。😊 接下来,我们还有更多的必需列。

所以地址,城市,州和积分,并注意积分的默认值是0。因此,我们可以使用一个显式值,比如200,或者使用默认关键字,让MySQL生成0。回到我们的语句,输入一个地址。实际上无所谓,接着是一个城市。😊。还有一个州,我们说,加州。最后是积分。再次。

我们可以使用显式值或默认值。😊,所以这就是我们如何向表中插入一行。然而,在这个例子中,我们只为名字,姓氏,出生日期,以及这个地址字段提供了值。所以我们忽略了电话号码,客户ID和积分。还有另一种写语句的方法,我来给你演示一下。😊,所以在表名后。

在这种情况下,我们可以选择性地提供我们想要插入值的列列表。名字。😊,姓氏。生日。现在,我将再次把这个语句拆分成多行。😊,所以还有三列,地址,城市,和州。这六列是我们将要提供值的列。通过这个改变,我们不必使用这些默认或空值。

我们只为这些列提供值,所以我将从这里删除默认值,然后是空值,最后是这个最后的默认关键字。因此,我们在这里提供的这六个值用于这六列。现在通过这个改变,我们也可以重新排列列的顺序。我们不必按客户表中定义的顺序列出它们。😊

例如,我们可以先放姓氏。😊,然后显然,我们也应该交换这些值的顺序,因此我们可以以任何顺序列出它们。现在,让我们执行这个语句。😊,现在如果你看底部的输出窗口,你应该会看到语句后面跟着一行受影响。不幸的是。

我无法调整这个窗口的大小来给你显示这个消息,但如果你看下面,你可以看到一条记录受到了影响,这基本上意味着一条记录被插入到这个表中。现在让我们看一下客户表中的数据。😊,好的。所以最后一行是我们插入的那一行。

你可以看到我的技能自动生成了值11。这是自增属性的效果。因此,它取最后一行的值并将其加一。😊,所以这里我们有名字,姓氏,生日。我们没有为电话属性提供值,这就是为什么我们没有值。

我们还有地址,城市,州,以及积分的默认值0。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P33:L33- 插入多行 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,您将学习如何一次插入多行。为了这个演示,我们将使用这个shippers表。让我们快速查看一下表的定义。😊。在这里,我们有两个列,shipper ID和名称。😊,Shiper ID是主键,它不能为空,并且是一个自增列,因此我们将让MySQL为此列生成值。

😊,我们只需要为名称列提供一个值,所以回到我们的查询编辑窗口。😊。我们输入,插入到shippers。在括号中,我们指定要插入值的列名称。在这种情况下,名称后面跟着值子句。这里我们添加一对括号,值为shipper1。现在要插入多行,您只需添加一个逗号,后面跟着另一对括号。

所以Shiper二,再来一次,逗号,括号,Shiper3。😊。这就是您如何一次插入多行。现在让我们执行这个语句。😊,好的。然后检查shippers表中的数据。看吧。因此,最初我们只有五个发货人,这里是我们插入的三个新发货人。

请注意,我的SQL自动生成了发货人ID列的值,因此我们得到了6、7和8。😊,嗯。好的,这是您本教程的练习。编写一个语句以在产品表中插入三行,这很简单。您可以在一分钟内完成。😊,所以这是我们的产品表,我们只有四列。

我们将省略第一列,因为它是自增列。因此,我们只需要提供名称、数量和单价的值。😊。回到我们的查询编辑窗口。😊,让我们插入到产品中。列是名称、库存数量和单价。值将是,假设是product1。

股票将达到10,单价将为1.95。现在,我要选择这些值,复制。来吧。粘贴。像这样。相应地更改值。最后,最后一行是product3。好了,让我们执行这个语句。😊,好的。然后验证结果。所以在产品表中。现在我们应该有三条新记录。现在。

你看到的这些值是15、16和17,因为在录制这个视频之前,我实际上在这个表中插入了一些记录,然后将它们删除了。所以我有产品111213和14。现在,尽管它们实际上已从此表中删除,但我的技能仍记得它们的ID。因此,而不是将10递增到11,它递增到了14。这是之前的最后一条记录,这就是为什么它生成了15。 在你的电脑上。

这些值将是1112和13。😊,哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P34:L34- 插入分层行 - ShowMeAI - BV1Pu41117ku

哦,到目前为止,你只学会了如何在这个教程中向单个表插入数据。我将向你展示如何向多个表插入数据。这里有一个非常好的例子。看看订单表。我们这里有什么列?我们有订单ID,我们有客户ID,所以我们知道是谁下的这个订单。我们知道订单的日期。

我们知道这个状态、评论以及运输信息。但此订单的实际项目不在此表中,它们在订单项目表中。所以在这个表中我们有四列,我们有订单ID,所以我们知道这个项目属于哪个订单。我们还有产品ID。

所以我们知道什么产品被订购,数量和价格。因此,一个实际订单可以有一个或多个订单项目。这就是我们所说的父子关系。在这个关系中,订单表是父表,订单项目表是子表。所以订单表中的一行可以在订单项目表中有一个或多个子项。在这个教程中,我将向你展示如何插入一个订单及其所有项目。这样你将学习如何向多个表插入数据。

😊 好的,回到我们的查询编辑器窗口。首先,我们需要插入订单。所以插入到。让我关闭导航面板。好的,我们想在订单表中插入一条记录。😊 现在,这里有什么列?我们有这些列,但只有前四个是必需的,实际上第一个我们不需要担心,因为这是一个自增列。

所以我们只想提供客户ID、订单日期和状态的值,回到我们的查询。😊 我们在这里指定这些列。客户ID、订单、日期和状态。现在让我们应用这些值。在客户ID列中,我们需要添加一个有效的客户ID。让我们快速查看一下我们的客户表。😊 好的,那里有11条记录。

这些是有效的客户ID。现在回到我们的查询,让我们用一个作为客户ID。然后2019年1月2日作为订单日期,状态再次为1。在这一列中,我们需要插入一个有效的订单状态ID。如果我们不提供有效的ID,系统将会警告我们。所以我们在这里插入一个订单。现在我们需要插入项目。

现在回到我们的订单项目表。在这个表中,我们有这个订单ID列。所以这是一个棘手的部分。我们一旦插入一个订单,我的技能将为我们的新订单生成一个ID。现在我们需要能够访问这个ID,以便在此表中插入项目,我们该如何做到呢?

返回到我们的查询编辑器窗口。😊 在MyQ中,我们有一堆内置函数,函数基本上是一段我们可以重用的代码。就像电视中的功能,每台电视都有一堆内置功能,比如开机。

关闭电源,调整音量,更改频道等等。因此,Myq 和其他数据库引擎提供了一堆内置函数,我们可以在程序中使用。其中一个函数是 last insert ID。我们可以通过在这里添加括号来调用或执行此函数。这将返回当我们插入新行时 Myq 生成的 ID。因此在进一步之前。

让我们选择这个,确保我们得到正确的结果。😊现在我们这里有一个语法错误,因为我们没有用分号终止第一个语句。好的,现在让我们执行这个查询。😊好的,新的订单 ID 是 12。让我们验证一下,所以回到订单表,看看我机器上的数据,我这里有 12 条记录。

实际上我在录制这个视频之前刚创建了一个。因此在你的机器上,你将有 11 个订单。😊现在回到我们的查询窗口。现在我们知道如何获取新插入记录的 ID。我们可以使用该 ID 来插入子记录。因此,我们将编写另一个插入语句。

插入到订单项中。让我们再看看这个表中的列。我们有四列,所有列都是必需的。所以实际上没有必要在我们的插入语句中指定列名。我们只需提供订单 ID、产品 ID、数量和单价的值。

在值子句中,我们有括号。我们的订单 ID 是什么?这是调用此函数返回的值。所以我将从这里剪切这个并放到这里。接下来我们需要提供一个有效的产品 ID。假设是 product1。数量,假设是 1,单价为 $2.95。现在让我们删除这个选择。

我们其实不再需要它。让我们再添加一组值。所以再次,我们将调用 last insert ID 来获取新订单的 ID。😊我们将把产品更改为产品编号 2,价格也不同。就这样。现在让我们执行这些语句,看看我们得到什么。😊好的,回到我们的订单表。

让我们在这里刷新记录。好的,我们有一个新的订单,订单号为 13。太好了。现在让我们查看订单项表。😊这里是订单项,让我们打开表格。对于订单号 13,我们应该有两个项目。太棒了。这就是如何在 MySQL 中插入层次数据。😊

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P35:L35- 创建表的副本 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我将向你展示如何将数据从一个表复制到另一个表。例如,在我们的订单表中,目前大约有十几条记录。现在假设我们想创建一个名为订单归档的表,并希望将该表中的每一行插入到新表中,如果我们有10个订单,我们不想编写一个包含10组值的插入语句,这样非常耗时,因此我将向你展示一种快速从一个表复制数据到另一个表的强大技术。

😊,首先,我们需要创建这个新表订单归档,为此我们将使用创建表作为语句,因此创建表。订单归档作为。现在。紧接着,我们编写一个选择语句以获取所有来自。😊,订单表的内容。现在让我们看看执行这个查询时会发生什么。看看,回到导航面板。

我们需要通过点击这里的图标来刷新这个视图。现在我们有了一个新表订单归档,让我们看看数据。所以你可以看到所有的订单都在这里,并且我们有与订单表完全相同的列。然而,如果你在设计模式下打开这个表。😊。

你可以看到在这个表中我们没有主键。因此,订单ID列没有标记为主键,而且也没有标记为自增列。因此,当我们使用这种技术创建一个表时,MySQL将忽略这些属性,这意味着如果你想明确地将记录插入到这个新表中。

我们必须为订单ID提供一个值,因为这个列不再是自增列。好的。因此,使用创建表作为语句,你可以快速创建一个表的副本。现在我们将这个选择语句称为子查询。子查询是另一个SQL语句的一部分的选择语句。现在。

我们还可以在插入语句中使用子查询,这是一种非常强大的技术。它允许我们做一些非常酷的事情。让我来给你展示一下。所以首先,让我们右键点击订单归档表。😊,然后点击截断表,因为我们想删除这个表中的所有数据。好的,它在询问确认,让我们截断这个表。因此现在回到这个表。😊。

让我们刷新表,我们这里没有任何记录,好的。现在回到我们的查询编辑器。假设我们只想将订单表中的一部分记录复制到这个表中,比如2019年之前的所有订单。因此首先让我们选择订单表中的所有内容,条件是。😊,订单日期早于2019年1月1日。好的。😊,这些是所有的订单,订单编号2到10。

美妙。现在我们想将这些订单复制到订单归档表中。😊。我们可以在插入语句中将选择语句作为子查询使用。写下插入。进入订单归档。现在我们不需要提供列名,因为我们将在这个查询中为每一列提供值。😊,所以。我们做到了。这是将选择语句作为插入语句中子查询的一个例子。

让我们执行这个。好的,现在回到表中。😊,让我们刷新记录。我们只拥有2019年前下的订单。好的,这里有一个非常,非常。非常酷的练习给你。回到我们的 SQL 发票数据库。查看发票表。😊。所以在这个表中我们有这些列:发票 ID、号码、客户 ID。

它与客户表中的客户 ID 列相关,后面还有一些其他列。现在假设我们想在这个表中创建记录的副本,并将它们放入一个名为发票归档的新表中。然而,在那个表中,我们想要的是客户名称列,而不是客户 ID 列。因此,你需要将这个表与客户表连接,然后将该查询作为子查询用于创建表语句。为了让练习更有趣,我希望你只复制那些确实有付款的发票。所以如果你看看这里。

这个付款日期列决定了是否对这张发票进行了付款。因此只选择那些确实有付款日期的发票。这是一个非常非常好的练习。花两到三分钟在这上面,然后继续观看。

嗯。

好的,我首先要使用 SQL 发票数据库。现在让我们选择所有内容。😊。从发票表中,并与客户表连接。在这里我将使用 using 语句来简化我的连接,我们将用哪个列来连接客户 ID 列呢?😊,让我们执行到目前为止的这个查询。好的。

首先我们看到客户 ID 列,这个列用于连接这些表。😊,然后我们有来自发票表的列,如发票 ID、号码等等,接着是来自客户表的列,如姓名、地址等等。显然,我们并不想要所有这些列。我们只需要来自发票表的列。

但我们应该用客户名称列替换客户 ID 列。所以让我们快速看一下发票表的设计。这里我们有发票 ID、号码、客户 ID,我们想用客户名称替换这一列。😊,所以回到我们的查询中。我将选择发票 ID、号码,然后是客户名称,我们把它重命名为客户。

我们还有哪些其他列?我们有发票总额和付款总额,所以让我们也添加这些。发票总额,以及付款总额。我们还有三列日期:发票日期、到期日期和付款日期。那么,让我关闭导航面板。发票日期、付款日期和到期日期。现在,技术上讲。

因为这些列仅存在于发票表中,我们不需要用表别名来前缀它们。所以我们可以简化代码。但我个人更喜欢前缀,因为这让我更清楚如何连接这些表。这只是个人偏好。其他开发者可能不同意,这也完全没问题。

所以无论你喜欢什么,这都完全没问题。让我们执行查询,确保得到正确的结果。😊 所以我们有发票 ID,编号,客户,漂亮,然后是其他这些列。😊 现在我们想要过滤结果,只返回有付款的发票。😊 所以我们可以返回有付款日期的记录,或付款总额大于0的记录。

这些都完全没问题。那么回到我们的查询。底部,让我们添加一个词条。付款日期不明时,这更好,让我们再执行一次查询。现在我们只得到这一小部分发票,非常好。最后,让我们将查询作为子查询使用在创建表格的语句中。😊

所以在选择之前,我们输入创建表格“发票归档”的语句,来吧。让我们执行查询。非常好,现在回到导航面板,刷新视图。😊 这就是我们的新表格“发票归档”。让我们看看数据。看吧。我们只有已付款的发票,以及每张发票的客户姓名,非常好。现在。

只需注意,如果你再执行一次这个查询,你会得到一个错误,因为我们已经有一个名为“发票归档”的表。在课程后面,我会告诉你如何删除表格。这非常简单。但现在你可以右键点击,选择删除表格。😊 然后确认。

好吧,然后你可以再运行一次查询。😊 是的。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P36:L36- 更新单行 - ShowMeAI - BV1Pu41117ku

哦。在这个教程中,我将向你展示如何在 SQL 中更新数据,所以回到我们的发票表。😊。看看这里的第一条记录。该记录的付款总额为0,显然没有付款日期。现在,让我们想象系统记录这些信息时出现了问题。假设客户为这张发票支付了$10。所以我们应该在这个表中更新这一记录。

这非常简单。回到我们的查询编辑器窗口。我们使用更新语句来更新表中的一条或多条记录。这个案例中的表是发票。接下来,我们添加设置子句,在这里我们指定一列或多列的新值。在这种情况下,我们想要更新付款总额,将其设置为$10。

我们还应该更新付款日期,所以我们使用逗号来添加更多列。我们将其设置为日期值,比如说,2019年3月1日。然后我们输入一个条件。通过这个条件,我们识别出需要更新的记录。在这种情况下,我们想要更新发票编号1,所以回到我们的查询。😊

我们输入发票 ID 等于1。让我们执行这个。😊,漂亮,现在回到我们的表格。让我们通过点击这个图标刷新数据。😊,好的。你可以看到付款总额已更新为10,我们也有了付款日期,真漂亮。😊,现在。假设我们实际上更新了错误的记录。也许我们应该更新发票编号3。

所以我们应该再更新一次这个表,将这一列中的原始值恢复到查询。我们可以将付款总额设置为零,付款日期设置为无。所以我们可以使用空值关键字在接受空值的列中插入空值。现在回到导航面板。让我们以设计模式打开这个表。你可以看到付款总额列的默认值为0。

😊,而付款日期列的默认值为无。所以回到我们的查询。我们还可以将付款总额设置为默认值,我的 S 将为这一列使用默认值,在这种情况下是0。所以我们再执行一次这个语句。漂亮。现在回到表格,让我们刷新数据。😊,所以付款总额被设置为零,付款日期为无。

漂亮,现在让我们继续更新第三笔付款。看看发票总额。是$147。在这个例子中,假设客户在到期日支付了总金额的50%。所以回到我们的查询窗口,这里不使用像$70这样的字面值,我们可以写一个表达式,我们想要计算发票总额的50%,即发票总额乘以0.5。

现在让我把这段代码分成多行,这样我们可以看得更清楚。😊。现在我们应该设置付款日期,正如我告诉你的,这个客户在到期日进行了付款,所以我们可以将其设置为到期日。此列中的任何值都将用于设置付款日期。显然,我们现在需要在表中更新发票ID编号三。😊,让我们刷新数据。

好的,看,付款总额已更新,接近发票总额的50%。然而,这个数字被截断了,所以我们没有小数点后的数字。现在不必担心这个,我们稍后在课程中讨论数据类型时再回到这个问题。此外,你可以看到付款日期与到期日期列中的相同值。

是的。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P37:L37- 更新多行 - ShowMeAI - BV1Pu41117ku

哦。在上一个教程中,你学习了如何使用更新语句更新单条记录。现在,如果你想更新多条记录,语法是完全相同的,但你在这里输入的条件必须更通用。例如,回到发票表,我们可以看到客户编号为三的客户有多条发票,我们可以写一条语句来更新这个客户的所有发票,因此回到我们的核心编辑窗口,我们将条件改为客户ID等于3。然而,如果你在MySQL Workbench中执行此语句。

这是我们在本课程中一直使用的软件。你将会遇到一个错误,因为默认情况下,MySQL Workbench以安全更新模式运行。因此,它只允许你更新单条记录。如果你使用其他MySQL客户端或在你的应用程序代码中编写这条语句,就不会有这个问题。这仅限于MySQL Workbench。现在让我告诉你如何解决这个问题。

所以在顶部,我们转到MySQL Workbench菜单,然后选择首选项。😊在这个对话框的左侧,点击SQL编辑。😊然后,向下滚动到底部。取消勾选这个复选框以保存更新。这可以防止你不小心更新或删除表中的一堆记录。现在我们继续这个操作。现在我们需要重新连接到这个MySQL实例。

让我们复制所有代码并关闭这个本地实例窗口。好了,现在在主页上,双击这个连接重新连接,看看吧。😊 然后粘贴所有的SQL代码。现在让我们执行这个操作,客户编号为三的所有发票都在这里更新了,我们还可以使用in运算符。假设我们想更新客户编号为3和4的所有发票。😊

所以你在where子句中学习的所有运算符也适用于这里,但技术上来说,这个where子句是可选的,因此如果你想更新表中的所有记录,只需省略它。😊现在这是你本教程的练习,回到我们的SQL数据库。写一条SQL语句,为任何在1990年之前出生的客户增加50分。

嗯。

好的,我先使用SQL存储。😊然后写一条更新语句来更新客户表。将分数设置为分数加50,因此这里我们使用一个表达式来更新分数列。对于任何在1990年之前出生的人,所以条件是出生日期小于1990年1月1日。好的,让我们执行这个查询。😊好的,现在让我们再打开一次客户表。

所以,任何在1990年之前出生的人现在都有额外的50分。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P38:L38- 在更新中使用子查询 - ShowMeAI - BV1Pu41117ku

哦。在这个教程中,你将学习如何在更新语句中使用子查询,这非常强大。所以我们将继续上一个教程的例子,但我们会让它更有趣。这里我们正在更新客户编号三的所有发票,但如果我们没有客户的ID,只有名字怎么办?想象一下,你有一个应用程序,在那个应用程序中用户输入客户的名字。所以首先我们应该找到该客户的ID,然后用那个ID更新他们所有的发票。我们该怎么做呢?

让我们快速看一下我们的客户表。😊这里有这个客户,我的工作。假设我们有名字,我们想找到ID。😊所以回到我们的查询编辑器窗口。😊在这个更新语句后,我将写一个选择语句来选择客户ID列。😊来自客户表,条件是名字等于我的工作。

现在这里出现了语法错误,因为我们没有用分号结束最后一个语句。但不用担心,我们马上会回到这一点。让我们选中这几行并执行这个查询。😊这个客户的想法太美妙了。现在我们可以在更新语句中将这个选择语句用作子查询。

正如我之前所说,子查询是在另一个SQL语句中的选择语句。😊所以,我们不再在这里硬编码,而是将这个选择语句用作子查询,但我们需要将其放在括号中。😊所以,我的学校会首先执行这个查询。它会返回客户ID,然后在这个条件中使用它。😊为了清晰起见。

让我们去掉换行并缩进这几行。😊这是最终结果。现在我们执行这个查询,这更新了该客户的所有发票。现在,如果这个查询返回多个客户,比如,回到客户表。让我们想象一下,我们想更新所有位于纽约或加利福尼亚的客户的发票。

所以我们需要像这样更新我们的子查询。😊在,加利福尼亚和纽约。现在,在执行整个语句之前,让我们先选择我们的子查询并执行它,看看我们得到什么。所以我们得到了两个客户ID,一个和三个,太美妙了。因为这个查询,这个子查询返回多个记录,我们不能再在这里使用等号了。

所以我们需要将其替换为in运算符。😊现在这个语句更新了位于这两个州的所有客户的发票。让我们执行它。😊太美了,一切都正常。作为最佳实践,在执行你的更新语句之前,运行你的查询以查看你将要更新哪些记录,这样你就不会意外更新不应该更新的记录。现在这里有一个子查询。

但是即使没有子查询,我们仍然可以查询要更新的记录,让我给你演示一下。所以假设我们要更新所有支付日期为null的发票。😊,在执行整个更新语句之前,我会运行一个这样的查询。

选择开始从发票中支付日期为空。现在,让我们执行这个查询。😊。这两条记录没有支付日期。因此,一旦我们确认更新了正确的记录,我们就会回到这里。去掉这个选择语句,只需将字词子句附加到我们的更新语句上。😊。

好吧,这是本教程的练习,回到我们的 SQL 商店数据库。查看订单表。😊,如您所见,一些订单没有评论。我希望您编写一个 SQL 语句,更新积分超过3000的客户的订单评论。所以积分超过3000的客户被视为黄金客户。如果他们下过订单,请找到他们的订单,更新评论列并将其设置为“黄金客户”,这是一个很好的练习。

首先,我们需要找到黄金客户,因此从客户表中选择所有记录,条件是积分大于3000。顺便说一下,因为当前数据库是 SQL 发票,我们要么在顶部输入使用语句,要么在执行此查询之前双击此数据库。好了,我们有三个黄金客户。现在。

我们需要获取这些客户的信息以便在更新语句中使用。所以我们只选择客户ID。然后将此选择语句用作子查询和更新语句。😊,更新订单,设置评论为黄金客户。条件是客户ID。因为我们正在处理多个客户ID,我们需要使用 in 操作符。😊。

然后要将其用作子查询,我们需要将其放在括号中。这就完成了。让我们缩进代码。这样更好。这里是最终解决方案。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P39:L39- 删除行 - ShowMeAI - BV1Pu41117ku

哦。所以你已经学会了如何插入和更新数据。在这节课中,我们将通过学习如何删除数据来完成这一部分,这非常简单。我们使用 delete from 语句从表中删除记录,比如说发票表。现在可选地,我们可以添加搜索条件来识别我们想要删除的记录。如果你不写这个条件,这个语句将删除表中的所有记录,显然这是非常危险的,所以在执行这个语句时一定要小心。

😊,现在这里,假设我们想删除 ID 为 1 的发票,所以发票 ID 等于一。我们也可以使用子查询,假设我们想删除所有名为“我的作品”的客户的发票。首先我们找到这个客户。所以从客户表中选择所有字段,条件是名称等于“我的作品”。😊。现在执行第二个查询。这里是我们的客户。

现在我们可以获取这个客户的 ID,并在搜索条件中使用它。所以客户 ID 等于。这是我们添加子查询的地方。😊,就像之前一样。很好。这就是我们如何在 SQL 中删除数据。😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P4:L4- 在Mac上安装MySQL - ShowMeAI - BV1Pu41117ku

哦。在这个教程中,我将向你展示如何在你的电脑上安装MySQL。现在我使用的是Mac,所以首先我会展示如何在Mac电脑上安装MySQL,然后我会展示如何在Windows上安装它。如果你是Windows用户,可以跳过这个教程。😊,现在,打开你的浏览器,访问MySQL.com。然后进入下载页面,向下滚动到底部。

在这里,你应该能看到MySQL社区版。这是完全免费的。我们将在整个课程中使用它。所以我们继续吧。😊,现在在这个页面上,点击MySQL社区服务器。然后,在这个页面上,你应该能看到Mac OS的可用版本。所以在这个列表中,下载第一个项目,即DMG归档文件。好的,现在在下一个页面。

点击“我不需要”,然后开始下载。😊,好的,如你所见,我们正在获取一个DMG文件。这基本上是一个安装向导。😊,好了,现在DMG已经下载完成。我们来打开它,然后双击这个包。这将启动一个安装向导,使用起来非常简单,所以只需不断点击继续。

我同意许可协议。😊,并安装我的技能。它会要求你输入密码。这是你用来登录电脑的密码。所以我们在这里输入。😊,好的。现在这里我们需要为root或管理员用户设置一个密码,所以点击下一步,在这个框中输入一个复杂密码。😊,好的,现在让我们完成安装。

然后再输入一次你电脑的密码。嗯。我们完成了。这真是太简单了,太棒了。😊。好的,我们安装了MySQL社区服务器。现在我们需要一个图形工具来连接到服务器并管理我们的数据库。所以回到下载页面。😊,再一次,向下滚动到底部。然后去MySQL社区版。在这个页面上,你应该能看到MySQL工作台。

这是一个图形工具,我们用它来连接到我们的数据库服务器。所以我们也下载这个。😊,现在再次在这个页面上。等待下载一个DG归档文件。下载。再一次,我们必须说,不,我们不想登录或注册。所以我们继续下载DMG。

然后,打开它。好的,你会看到这样的东西。所以只需将MySQL工作台拖动到应用程序文件夹中。我们就这样做吧。😊,现在我要把这个复制到应用程序文件夹。😊。

很好,所以我们安装完成了。这非常简单。现在,按下命令和空格键,搜索my Sql workbench。来吧,打开它。😊,现在。第一次我们收到这个消息,因为这是我们从互联网下载的应用程序。所以我们需要告诉Mac我们信任它。继续吧。这就是我的SQl workbench。

现在默认情况下,您应该在这里看到一个连接。如果您看不到,您需要创建一个。让我给你演示如何做。为了这个演示,我将右键单击并删除这个连接。😊,好的,现在我们从头开始创建一个连接,点击这个加号图标。😊,在这个页面上,给这个连接起个名字,比如说本地实例。

现在我们将使用的连接方式是TCpiIP,默认设置。主机名是127.0.0.1,这是本地机器的地址,端口是3306,这是MyQ服务器的默认端口,管理员的用户名。现在我们需要输入密码,这是安装时设置的密码,所以点击存储在钥匙串中,然后在这个框中输入密码。

对于MyQ服务器,好的。最后,让我们测试一下连接。好的,我们成功连接到本地机器上的MyosQl服务器,Beai。点击确定,这里在MyosQql Workbench的主页上有一个连接。每次我们打开MyosQql Workbench时,我们使用这个连接来连接到本地服务器。😊,好的。

我们已经在Mac上完成了MyosQ的安装。接下来,我将讲解如何在Windows电脑上安装MyosQl,所以请随意跳过这个教程。😊。

是的。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P40:L40- 恢复课程数据库 - ShowMeAI - BV1Pu41117ku

哦。好的,我们完成了这一部分,但在进入下一部分之前。我希望你恢复所有这些数据库到它们的原始状态,因为在这一部分我们添加了一些数据。我们更新了一些数据,我们删除了一些记录,所以如果你不恢复这些数据库,你可能会看到不同的结果。因此,在MyQL工作台中恢复这些数据库非常简单,顶部去文件菜单,打开SQL脚本,然后导航到你存储这个课程SQL脚本的目录。如果你忘记了那个目录,可以回到第一部分,我们有一节课是用来下载补充材料的。

所以在这个目录中打开,创建数据库。sQL。现在。执行脚本以重新创建我们所有的数据库。太好了,真美。现在让我们打开导航面板。你可以看到这里的数据库消失了。只需点击这个刷新图标。😊,真美,好吧。我们完成了这一部分。

下一个部分见。😊。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P5:L5- 在 Windows 上安装 MySQL - ShowMeAI - BV1Pu41117ku

哦。在这个教程中,我将向你展示如何在Windows上安装MySQL。打开你的浏览器,访问Mysql。co。😊,然后去下载页面。现在,在这里,向下滚动到底部。我们将使用My SQL Community Edition,这是完全免费的,所以让我们选择这个。😊,现在选择My SQL Community Server。😊,然后,向下滚动。

在这里,你应该看到类似于Windows的My Sql安装程序。这是推荐的在Windows上安装My Sql的方法。所以点击这个。好的。在下一页,向下滚动。然后下载这里的第一个安装程序。在下一页,向下滚动并点击“不,谢谢”。只需开始我的下载。否则。

你需要在登录时创建一个账户,这对学习本课程并不是必要的。所以让我们继续。然后将此文件保存到我们的电脑。😊。

然后,运行它。

我们将使用这个设置向导在我们的电脑上安装My Sql。这非常简单。你只需点击下一步,但有几个地方需要输入密码。让我给你展示一下。在设置类型的第一页,我们将使用开发者默认设置。😊,去到下一页,这里我们收到一个小警告,因为这个安装向导想要安装Python 3的连接器。

7,但我在这台机器上没有Python,所以我收到了这个警告。现在在你的机器上你可能会或可能不会收到这个错误,这并不重要,只需点击下一步,再一次。😊。所以这里是将要安装的产品。第一个是mySql服务器。

第二个是mysql workbench。这是我们用来连接数据库服务器和管理数据库的图形工具。你很快就会看到这一点。所以点击执行。😊。现在这大约需要五到十分钟,所以我会暂停录制。

好的,所有产品都已安装,太棒了。让我们去下一页,这里在组复制页面上也点击下一步。😊。在下一页,关于网络设置,保留所有默认设置。所以让我们去下一页。现在我们应该为root或admin用户设置一个密码。

所以点击下一步。😊,在这个框中,为admin用户输入一个密码。好的。然后我们再次进入下一页,保留所有默认设置,点击下一步,再次执行。好的,现在让我们完成安装。再次,我们必须点击下一步,然后完成。😊,再一次,有这么多步骤。现在这是你需要输入admin密码的页面。

这个页面叫做连接到服务器。你可以看到用户名是root,代表管理员用户。😊,在这个框中,输入你之前设置的密码,然后点击检查。好的,连接成功,太好了。让我们进入下一页并点击执行。😊,最后,完成。好了。

我们还有一步。现在,经过所有这些步骤,安装完成。接下来,这将启动我的Sql工作台,这是我们用来管理数据库和运行SQL查询的图形工具。所以点击完成。😊。

现在我们有一个命令提示窗口,可以在这里输入指令与我们的MySQL服务器对话。我们其实不需要这个,所以关闭它。😊。

这是我的SQL工作台。现在,第一次打开这个页面时,你应该会看到一个连接,如果没有看到,点击这个加号图标。😊,在这个页面上,给这个连接起个名字,比如本地实例,将所有设置保持为默认值。但在密码这里,点击存储在保管库。😊,在这个框中。

输入你为管理员用户设置的密码。所以我将把它放在这里。好的。现在点击测试连接。好的,我们成功连接到了这台电脑上的MySQL服务器。😊,然后点击确定。现在我们点击这个连接以连接到我们的数据库服务器。好的。这里是你在本课程中将使用的界面,左侧是导航面板,中间是查询编辑器。

我们可以调整大小。😊,这里是我们将编写SQL查询的地方。右侧是SQL附加功能。😊,我们已经完成了在电脑上安装MySQL。接下来,我将向你展示如何为本课程创建数据库。😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P6:L6- 为本课程创建数据库 - ShowMeAI - BV1Pu41117ku

哦。!

在本教程中,我将向你展示如何创建本课程的数据库。所以我打开了我的 SQL Workbench。让我快速给你介绍一下这个界面,因为第一次打开时,它可能看起来有点吓人,但实际上并不难。所以在顶部我们有一个工具栏,里面有用于创建新标签以编写 SQL 代码以及打开 SQL 文件的按钮。

😊,接下来我们有一堆用于创建数据库和新表等的按钮。在左侧,我们有导航面板,包含两个选项卡:管理和模式。我们使用管理选项卡进行管理工作,比如启动或停止服务器,导入或导出数据等。😊,模式选项卡显示我们在当前数据库服务器中拥有的数据库。

目前我们只存在一个数据库,这个数据库是我的 SQL 内部使用的。现在在中间是查询编辑器窗口,这是我们编写 SQL 代码的地方。在本课程中,我们大部分时间都会在这个窗口中度过。在右侧,我们还有一个包含两个选项卡的面板,内容帮助和代码片段。这个界面在 Windows 上可能看起来略有不同,但我展示的几乎和 Windows 上的是一样的,所以如果你的机器上看起来略有不同也没关系。现在,在这里我们有这些按钮用于显示或隐藏这些面板。为了清理这个界面,我将隐藏右侧的面板以及底部的面板。

现在创建本课程所需的数据库是更好的选择。请下载我在视频下方附上的压缩文件。😊!

当你解压缩压缩文件时,会看到一堆这样的 SQL 文件。所以在本教程中,你将使用的主要文件叫做 create databases do SQL。这个文件包含了创建本课程所需所有数据库的 SQL 代码。现在我们还有用于创建单独数据库的文件。

我添加这些文件是为了以防你将来需要重新创建其中一个数据库。但现在,不用担心它们。😊!

现在,回到 My SQL Workbench,让我们打开创建数据库的主 SQL 文件。这是一个 SQL 代码的示例,起初可能看起来复杂,但相信我。随着你深入学习,你会准确理解这里的一切工作原理。你将能够像这样编写 SQL 代码。😊

我们想要执行此操作以创建本课程的所有数据库。😊,为此,我们点击这个图标,也就是工具栏上的黄色闪电图标。这将执行选定的部分或整个代码,如果没有选择任何内容。例如,如果我选择这一行并点击这个图标,这只会执行这一行。

我们想要执行整个代码,所以不应该选择任何内容。现在,让我们执行这个美妙的代码。😊,所以在底部,我们有一个叫做输出窗口的面板,它显示我们数据库服务器上执行的所有操作,这样我们就可以检查所有操作是否成功完成或者是否出现了问题。如我们所见,每个操作旁边都有这个绿色的勾。

我将关闭这个面板。😊,这样更好。现在在左侧的架构标签中,目前我们看不到新数据库。因此我们需要刷新这个视图。美妙的地方是,我们有这些以SQL或SQL为前缀的数据库。我决定将它们以SQL为前缀,这样我们就知道这些是本课程的数据库。

这样可以避免与数据库服务器上同名的其他数据库意外冲突。录制此视频时,这里只有四个数据库。但在课程进行过程中,我会更新创建数据库的脚本。因此,当你观看这门课程时,你可能会看到更多的数据库。

不用担心这些区别。😊,现在作为示例,让我们探索其中一个数据库,顺便说一下,我们不再需要这个标签了。所以让我们关闭它,这样更好。让我们展开SQL存储数据库。😊。在每个数据库中,我们都有这些对象,我们有表,这就是我们存储数据的地方。

我们有视图,这种视图就像虚拟表,可以将来自多个表的数据组合并放入一个视图。这在创建报告时特别强大。你将在未来学习到它们。我们还有存储过程和函数,这些是我们存储在数据库中的小程序,用于查询数据。例如。

我们可以有一个存储过程,用于获取某个城市的所有客户。所以我们调用那个过程并说:嘿,给我所有在旧金山的客户。这将返回所有在旧金山的客户。好的,现在让我们展开表。😊,在这个数据库中,我们有客户、订单、产品、运输商等。现在,选择这个客户表,每当你将鼠标悬停在这个项目上时。

你应该在右侧看到这三个图标。点击最右侧的图标,它看起来像一个带有闪电的表。这样,我们就可以看到这个表中的所有数据。这是我们的客户表。😊。在这个表中,我们有这些列,比如客户ID,我们用它来唯一标识客户。

我们还拥有名字、姓氏、出生日期、电话、地址等等。这些就是这个表中的列,每一行称为记录。每一行代表一个客户,这些是我们对每个客户所知道的信息。😊现在,让我们看看另一个表。打开订单表。

在这个表中,我们有这些列,如订单ID、客户ID、订单日期、状态等等。这里的客户ID是什么?我们使用这一列来识别每个订单是由谁下的。现在有趣的是,你是通过他们的客户ID来引用这些客户,这唯一标识了他们。换句话说,如果约翰·史密斯下了一个订单。

我们这里不存储约翰·史密斯的记录,我们只存储约翰的客户ID。为什么呢?原因是约翰·史密斯可能在我们的系统中下过多个订单,每次约翰下订单时,我们需要查找他的地址和电话来发货。现在,可能这些信息将来会发生变化。

约翰可能会搬到新地方或更改他的电话号码,甚至可能会更改他的名字。如果我们在每个订单旁边重复所有这些信息,那我们就得回来在多个地方进行修改。相比之下,通过这种设计,我们只需存储约翰的信息。所以每当我们想要更改约翰的任何信息时。

而不是在这里进行更改,我们返回到客户表。😊让我们看看客户ID为6的客户,实际上叫ElLca。以下是关于ElLca的所有信息,这是她的电话号码,这是她的地址。顺便说一下,这都是我使用工具创建的虚拟数据。

所以如果关于ElLca的信息将来有任何变化,这就是我们需要修改的唯一地方。这就是这些数据库的工作原理。我们称这些数据库为关系数据库。基本上,这种数据库中有多个表,它们通过关系相互关联。

所以在内部,客户表和订单表之间存在关系。客户表中的客户ID列与订单表中的客户ID列相关或链接在一起。😊这是订单表,我们有客户ID列。这是对关系数据库的简要介绍,你了解了数据库、表、列。

行和关系。在下一部分,我将向你展示如何从这个数据库中的单个表中检索数据,但在进一步之前,作为练习,我希望你探索发票数据库,查看所有表,查看所有数据,以了解我们在这个数据库中拥有的数据类型,我们将来会经常使用这个数据库。😊所以我们花几分钟来探索这个数据库。

是的。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P7:L7- SELECT 语句 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我将向你展示如何从单个表中检索数据。现在看看导航面板,目前没有我们的数据库以批量方式显示,这意味着这些数据库都没有被选中用于查询。因此,编写从数据库获取数据的查询的第一步是选择一个数据库。我们将写的查询将针对该数据库执行。

在这个演示中,我们将使用这个SQL存储数据库,所以我们输入使用SQL在线商店。使用是SQL语言中的一个关键字,这就是它显示为蓝色的原因。现在SQL不是大小写敏感的语言,这意味着我们可以使用大写或小写字符。其实没有关系,但作为最佳实践,我们应该将SQL关键字大写,其他内容小写。

😊,所以现在让我们继续执行这个查询。好的,看看。这个SQL存储数据库现在在批量中显示。现在,在我的技能工作区,你也可以通过双击来选择一个数据库。所以现在我双击SQL发票,它就是当前数据库。现在,如果我们再次运行这个查询。

😊,SQL存储数据库已被选中。好吧。现在让我们写第一个查询,以检索该数据库中的所有客户。😊。在使用语句之后,我们将使用选择语句。以下是选择语句的基本语法或基本结构,我们在前面输入选择,指定我们要检索的列。例如,我们可以检索客户ID列和名字列,或者我们可以使用星号检索所有列。

现在,在此之后,我使用了F子句,这是我们指定要查询的表,在这种情况下是客户表。所以这是选择给定表中所有客户的最简单查询。😊。现在,每当你有多个SQL语句时,你需要用分号终止每个语句。看看,我们这里有一个红色下划线,表示错误。

如果你将鼠标悬停在这里,你会看到这个工具提示说选择在这个位置无效,因为我们没有用分号终止第一个语句。现在让我们再执行一次这个查询,我们可以点击这里的按钮,或者使用快捷键。

😊,所以请看顶部的查询菜单。😊,第一个项目是执行。现在,这个命令在Mac上的快捷键是shift命令和enter,而在Windows上会有所不同。老实说,我不太确定。所以无论是什么,使用那个。现在我将按shift命令和enter。😊。这里是所有客户和一个表格。所以这个选择语句有两个子句。

select 子句和 f 子句,但我们还有其他子句可以用来过滤和排序数据。例如,我们可以使用 where 子句来过滤结果,获取 ID 为 1 的客户,所以我们可以写出这样的表达式 where customer_underline ID equals one。

现在,当我们执行这个查询时,我们只会得到 ID 为 1 的客户。😊,这就是 where 子句。我们也可以对数据进行排序,所以。😊,在 where 之后我们使用 order by 子句。在这里,我们指定希望根据其名字排序的列。假设我们想按客户的名字排序。

所以我们在这一行输入 first name。那是这个表中其中一列的名字。现在如果我们执行这个查询,这个 order by 实际上没有任何影响,因为结果中只有一条记录。所以让我暂时去掉 where 子句。为了做到这一点,我们可以在这一行前面加上两个短横线。现在这一行被视为注释。

这意味着 SQL 引擎将不会执行这个。好的,所以让我们再执行一次这个查询。😊,现在我们获取的所有客户都是根据他们的名字排序的。这就是基本的想法。在接下来的几个教程中,你将详细学习每个子句。

但在这个教程中你需要记住的是,这三个子句 from、where 和 order by 是可选的,正如你在这个例子中看到的,我没有使用 word clause。我们也可以注释掉 order by 子句,我们也可以注释掉 from 子句,所以我们可以选择某些值,比如一和二,而不是选择给定表中的所有列。现在,如果你再次执行这个查询,结果中会有两个名为 one 和 two 的列,在这些列中我们有这些值。

😊,所有这些子句都是可选的,但在现实世界中我们经常使用它们。现在你需要明白的是,这些子句的顺序很重要。因此我们总是先有 select,然后是 from,再是 where,最后是 order by,我们不能改变这些子句的顺序。否则我们会得到一个语法错误,这基本上意味着我们的 SQL 语句的语法或结构不正确,因此无法执行。在结束这个教程之前,还有一件事需要提到。在这个例子中,你可以看到我将所有这些子句列在新的一行上,实际上你不必这样做,因为换行是被忽略的。

在执行 SQL 语句时,空格和制表符会被忽略。因此,我们可以回到这里,将 from 放在 select 前面。所以 select star from customers 全部写在一行,这对简单查询来说是完全可以的,但随着查询的复杂性增加,最好将每个子句放在新的一行上。

😊,所以这就是本教程的全部内容,下一个教程将详细探讨 set 子句。😊。

哦。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P8:L8- SELECT 用法 - ShowMeAI - BV1Pu41117ku

在本教程中,我们将详细查看选择子句。因此,由于我们当前的数据库是SQL商店,为了清理,我将删除第一条语句,你现在真的不需要它。😊,另外,我将删除这两条注释,我们只想关注选择子句。好的。

那么我们可以用这个选择子句做什么呢?在上一个教程中你学到了,如果我们使用星号,这将返回所有列。相反,我们可以指定我们想要的列,这在你有一个包含许多列和可能数百万条记录的大表时是很有帮助的。如果你想要返回所有这些数据,那将给数据库服务器和网络带来很大的压力。因此这时我们明确指定我们想要获取的列。

😊,假设我们想获取名字和姓氏的列,执行查询,如我们所见。😊。我们只得到了这两列,并且它们的顺序与我们在这里指定的相同。因此,如果我们更改顺序,把姓氏放在前面。😊。再执行查询,现在你可以看到姓氏列在前面。现在。

让我们在最后添加一个新列。😮,让我们也获取每个客户的积分。我们正在查询中。所以这些是每个客户的积分,根据他们的购物情况计算得出。现在。假设我们想要将这个积分放入一个数学公式中,以计算我们可以给予每个客户的折扣。

在这里我们可以使用一个算术表达式,比如说分数加10。这是一个算术表达式。因此,现在如果你执行这个查询针对第一条记录。你会看到他们的积分最终是2283。我们再运行一次查询。😊。好了。现在为了清晰起见,我们可以把原始分数列放在这里,作为子分数。

comma points plus 10。我们再运行一次查询。现在我们可以看到原始分数,旁边是我们将用于计算折扣的值。现在这里我们使用的是加法运算符,也有乘法、除法、减法和取模,即除法的余数,所以我们把这个改成更复杂的,比如说如果我们想要将分数乘以10,然后加100。

😊,现在你可以立即看到这一行变得太长,无法在屏幕上显示。在这种情况下,你可以通过将每个列放在新行上来分开选择子句,所以选择姓氏,然后是名字、积分,最后是积分乘以10。😊,加上100。我们再执行一次这个查询。所以这是我们的新列,包含新的计算值。现在在这个算术表达式中,你需要理解的是运算符的顺序,这基于数学中的运算符顺序。

😊,乘法和除法运算符的优先级高于加法和减法。因此在这个表达式中,首先分数乘以 10,然后结果加上 100。如果这不是你想要的,你可以始终通过使用括号来改变顺序。例如,让我们将这个乘法改为加法。😊,然后把那个乘法放在这里。😊。

在这个表达式中,首先,10 乘以 100,然后结果加到分数上。现在。假设这不是我们想要的,我们可以通过在这里使用括号来改变顺序。使用这个括号,首先,我们得到分数,加上 10,然后将结果乘以 100。因此,这些括号对于改变运算顺序和增加代码的清晰度非常有用,以便其他人阅读这段代码时可以轻松理解运算的顺序。现在让我们再执行一次这个查询。

😊,好的,现在看看这列的名称。😊。它与第5行的表达式相关,但并不完全合理。我们希望有一个清晰的描述性名称。因此,我们可以使用as关键字给这列起一个别名。于是,我们就可以给它一个像“discount”的名称。😊,这个计数是基础因素。我们再运行一个查询。现在这列的名称已经改变了。

这就是使用别名的好处,我们可以给列和结果集赋予描述性名称。现在如果你想在列名称中有空格,你需要用引号把它包围起来。可以是单引号或双引号。所以你在这里放一个引号。然后我们可以在这两个词之间加一个空格。让我们再执行一次查询。

现在我们得到了“discount factor”。那么让我们快速回顾一下你在select子句中学到的所有内容。我们可以使用星号返回所有列,或者我们可以明确指定要返回的列。😊,我们也可以在这里使用算术表达式,并且可以选择性地给结果集中的每一列起别名。现在。

还有一件事你需要知道关于select子句。所以让我们删除这个查询。😊。并选择。客户表中的状态列。看看。这些是我们的客户所在的州。目前在这个示例数据中,我们没有任何重复。换句话说,我们在这些州中没有多个客户。

但为了这个演示,我想将第一个客户的州改为弗吉尼亚州,这样结果集中就会出现重复。所以让我们打开导航面板。😊,这是我们的客户表,看看所有的数据。我们的第一个客户,如你所见,位于马萨诸塞州。现在我想把这个改为弗吉尼亚州。双击V代表弗吉尼亚,输入完成。现在在屏幕的右下角。

你应该看到两个按钮,应用和还原。不幸的是,我不能给你展示这些按钮,因为录制窗口比MySQL Workbench稍小,但请查看右下角,点击应用。你会看到一个对话框,询问你是否审核更改。

所以继续点击应用按钮一次。😊好的,太美了。现在让我们回到第一个查询窗口,再执行一次这个查询。😊如你所见,前两个客户位于弗吉尼亚州。如果你想在结果集中获取唯一的州列表,那就是我们使用distinct关键字的时候。所以选择distinct州,通过这个查询我们将检索客户表中唯一的州列表,因此使用distinct关键字可以去除重复项。

让我们再执行一次查询。现在你可以看到弗吉尼亚州没有重复。这里有一个练习给你。我想让你写一个SQL查询,返回我们数据库中所有产品的结果集。我想看到三列:名称、单价和一个新的列叫做新价格,这个新价格基于这个表达式:单价乘以1.1。假设我们想将每个产品的价格提高10%,通过这个查询我们想要获取所有的产品。

原始价格和它们的新价格,所以暂停视频,花一两分钟做这个练习,完成后再回来看看我的解决方案。😊!

是的。

好的,这很简单,所以我们从select开始。😊现在,你想选择哪些列?名称?单个底线价格。然后在这里我们将使用一个算术表达式来计算新价格,所以我们输入单价乘以1.1,然后给它一个别名。

所以作为新的底线价格,或者我们可以将其放在引号中,并在“新”和“价格”之间留一个空格。😊现在,我们想从哪里选择这些列?从产品表中,所以从产品那里。请注意,我对所有SQL关键字使用了大写字母,对其他所有内容使用了小写字母。😊那么让我们继续执行这个查询。😊这就是我们得到的结果。

所以这些都是你可以看到的所有产品,它们的原始价格以及新的价格,比原来的贵10%。

SQL常用知识点合辑——高效优雅的学习教程,复杂SQL剖析与最佳实践!<快速入门系列> - P9:L9- WHERE 用法 - ShowMeAI - BV1Pu41117ku

哦。在本教程中,我们将查看SQL中的WHERE子句,所以之前我告诉过你我们使用WHERE子句来过滤数据。例如,假设我们只想获取积分大于3000的客户。那么在WHERE子句中,我们可以输入这样的条件。😊 积分大于3000。当我们执行这个查询时,我的技能中的查询执行引擎将遍历客户表中的所有客户。

对于每个客户,它会评估这个条件。如果这个条件为真,它将返回该客户的结果集。所以让我们继续执行这个查询。😊 这是结果,如你所见,我们只有两个积分大于3000的客户。这就是我们所称的“大于”运算符,它是SQL中的比较运算符之一。

让我给你展示完整的比较运算符列表。😊 我们有大于、大于等于,还有小于、小于等于。这里是等于运算符,和不等于运算符。我们可以使用一个感叹号后面跟一个等号,或者像这样。

所以这两个都是不等于运算符。让我给你展示一些这些运算符的例子。所以我将删除所有内容,恢复到之前的查询。假设我们只想获取弗吉尼亚州的客户。那么我们可以将条件更改为这样的形式,即状态等于弗吉尼亚。注意我把弗吉尼亚放在引号中,因为这就是我们所称的字符串。

字符串是一串字符,所以每当你处理一串字符或基本文本数据时,你需要用单引号或双引号括起来,但通常习惯上我们使用单引号。所以让我们执行这个查询。😊 这是结果。你可以看到,我们只有这两个位于弗吉尼亚的客户,ID为1和2。

而且不管我们使用大写字母还是小写字母,所以如果我们以小写输入VA并执行查询,我们会得到完全相同的结果。那么,如果我们想获取所有不在弗吉尼亚州的客户呢?我们可以使用不等于运算符,因此我们可以在前面加上感叹号。😊 或者使用。

这种表示法。无论如何,我们得到相同的结果。所以这些是未位于弗吉尼亚的客户。现在我们也可以将这些比较运算符与日期值一起使用。例如,假设我们想获取只在1990年1月1日之后出生的客户。

所以我们再次将条件2更改为出生日期大于,我们使用引号来表示日期值。尽管日期实际上并不是字符串,但在SQL语言中,我们应该用引号括起来。因此这里我们输入1990-01表示一月,-01表示日期。

所以这是在MySQL中表示日期的标准或默认格式:年份4位,月份2位,日期2位。我们来执行这个查询。其实我这里犯了一个错误,所以我们看不到结果,反而看到了操作输出或输出窗口。如果你滚动到底部,可以看到错误的详细信息。

所以这里我用了错误的列名。😊,我们应该用下划线分开这两个词。这就是我们的列名。所以我们再执行一次查询。我们只有三位客户是在1990年1月1日后出生的。所以这些是SQL中比较运算符的例子,在下一个教程中,我将向你展示如何在过滤数据时结合多个条件。

好的,这是你的练习,我希望你写一个查询,获取今年下的订单。所以查看订单表,看看我们有哪些列,并基于此写出带有条件的查询。😊,这里是订单表,我们有这个列“订单日期”。我们可以用这个列来查看今年下的订单,所以我们的查询是。

select star from orders where order_unalign_date is greater than or equal to January 1, 2019,假设这是当前年份,所以2019-01-01。😊,现在,由于我们当前在2019年,这个查询将返回今年下的所有订单,但明年这个查询将不会给我们正确的结果。

但别担心,在课程后面,我会教你如何写查询以获取当前年份的订单。所以为了这个练习,这是一种有效的解决方案。现在我们来执行这个查询,看看我们得到什么。😊,所以我们只有一个订单,订单ID为1,是在当前年份下的。

哦。

哦。

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P1:[讲座] Python、Keras和TensorFlow深度学习课程以及深度神经网络的应用 - ShowMeAI - BV15f4y1w7b8

深度神经网络之所以成为令人惊叹的技术,是因为它们可以接受几乎任何格式的输入,包括表格数据、图像、文本,甚至音频。然后它们处理这些信息,进行各种数学魔法,然后输出决策或评分,但它们也可以输出与接收到的数据相同类型的数据。

它们可以输出表格数据、图像、文本或音频。😊,在我的课堂上,深度神经网络的应用,我会展示如何将这些神经网络应用于日常问题。这个课程中的一切都是通过 Python 的 Jupiter notebooks 教授的。如你所见,你可以看到你的代码与我课程中的信息交织在一起,并在运行程序时看到实际结果。

现在,一些创建我们视频游戏的应用将需要视频。因此,这些将实际在 Jupyter notebook 外部直接从 Python 运行。

一切都确保与 Google colab 兼容,这样你就可以使用免费的 GPU 运行它。如果需要的话,GPU,相信我,可以为你的训练时间节省数小时。这个视频中我会展示很多图形和其他酷炫的东西。一切都来自我们在课堂上的内容,所以没有视频魔法。现在,让我加入进去。

我确实需要一点绿幕魔法。但相信我,神经网络不需要任何处理就能看起来很棒。😊。

GN 是我们在这门课程中要研究的一种神经网络。GN 代表生成对抗神经网络。GN 通常用于生成面孔,尽管它们可以生成任何类型的假数据。一个 GN 通过两个神经网络工作。第一个神经网络是生成器。

它本质上是将随机数字生成面孔。第二个神经网络是判别器,它本质上告诉我们生成器是否在生成正确的面孔。这两个网络交替进行,进行对抗性战争。一旦它们完成,你就会得到一个能够接受许多不同随机数字并持续生成相当真实面孔的生成器。

强化学习,特别是当通过深度学习应用时,是一种非常强大的技术,使得 Google AlphaZero 能在短时间内击败 Stockfish,基本上掌握所有国际象棋。在这个课程中,我们将利用 AI gym 查看 Atari 视频游戏,并创建通过观察游戏中实际视频图像学习如何玩这些游戏的强化程序。

实际视频游戏的内存状态。

谁是乖孩子,希克里?就像训练宠物一样,当你使用强化学习时,你会为神经网络提供奖励,以便它们表现良好或做出有利的结果,神经网络在生成广告的潜在信息方面也非常擅长。

好吧,抱歉。我必须尝试。还记得我说神经网络可以接受任何类型的输入吗?好吧,猜猜看,它们实际上可以同时接受多种类型的输入。这就是图像捕捉的工作原理。为了创建一个能够为图像编写标题的神经网络,你需要创建一个接受两种不同类型输入的神经网络,一个是照片。

另一个是一个序列,而那个序列是一组不断增长的单词。首先,你用一个空数组和一个起始标记传入,然后它会添加描述那张图片的词汇。Yolo,你只需看一次。这是一项你可以在我周围看到的惊人技术。

它正在高效地对多个对象进行分类,因为它只需查看一次。我们将看到如何将这项技术转移到你的Python程序中,并获取实际坐标和类别。😊,你周围发生的事情。黄色在这里可能会被欺骗。它无法区分我的狗和一个填充玩具。

它在识别广告牌和带有人物的东西时也有困难,并且认为它们是人类。这个广告牌可能会让自驾车感到担忧,以为它即将遭遇侧撞。但是,等等,还有更多。这段视频只能向你展示这门课程的亮点。以下是我们将要覆盖的一些其他主题的完整列表。

感谢观看这段视频。如果你对这门课程有任何问题,请在评论中留言,欢迎订阅这个频道,以便在有新视频添加到此课程时获得更新。所有信息都可以在播放列表和GitHub中找到。

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P10:[讲座] 使用 Google CoLab 进行深度神经网络课程应用 - ShowMeAI - BV15f4y1w7b8

嗨,我是Jeff Heaton。欢迎来到华盛顿大学的深度神经网络应用。在这段视频中,我将介绍Google CoLab,并展示如何使用Google CoLab运行本课程的各种模块,以及如何使用它提交作业。😊,大多数功能在Google CoLab中都能正常运行。事实上,由于它为你提供GPU,本课程的大部分内容在Google CoLab中运行会快得多。

现在,你的本地机器可能有比Google CoLab更强的GPU,如果是这样的话,我确实鼓励你在你的电脑上安装Tensorflow的GPU版。然而,在TensorFlow中让GPU工作可能有点复杂。要了解我AI课程和项目的最新信息,请点击旁边的铃铛订阅,以便收到每个新视频的通知。

Google CoLab可以是完成这门课程的好方法。你可以完全在云中使用Google CoLab完成整个课程。只需注意一些事情。这就是我将在这个视频中向你展示的。首先,为了进入Google CoLab,我建议你在Google上搜索Google CoLab,它会直接带你去。

这是Coab研究,Google CoLab,我在我的课程网站上也有相关链接。现在,当你进入Google CoLab时,你会看到许多事情在进行中。我用这个做了很多不同的事情。所以这里的文件可能会比你拥有的多得多。

你将要使用的所有笔记本都会存储在你的Google Drive中。那么我们来展示一下如何获取第一个模块的第一个课程。点击Github,你会输入Jeff Heaton所有。😊。

ord是我Github代码库的名称。现在,你可能会看到这样的内容。这实际上是我第一次看到这个。显然,我已经足够频繁地将Github与CoLab结合使用,以至于他们想让我授权API访问。这没问题,我会点击这个。

并授权Google CoLab要求我登录。好吧,现在我们已授权。起初可能不会问你,但如果问了,请务必继续授权,以便你可以访问相关内容。现在会显示Jeff Heaton,并给你我的所有代码库。这些库有相当多。这是你需要的,T81,558深度学习。

这是华盛顿大学的课程编号。你会首先看到作业,稍后我们会详细讲解这些作业。现在我们就打开第一个模块的第一个课。这个是一个笔记本,所以它在这里打开,你现在基本上可以看到这个。

它没有保存到你的G驱动。如果你想将其复制到G驱动,这是个好主意。你需要在提交作业时这样做,但我们先复制它。所以它会创建一个副本。你会看到这里的名称。它说是T 81的副本。这实际上直接进入你的G驱动。如果我们进入G驱动。再一次。

我在我的Google驱动中有各种各样的东西,你可能没有。但你会有一个叫做Coab笔记本的目录。这是Google Coab放置所有笔记本的地方。所以这是这个副本。我建议将其重命名为其他名称。所以我们现在在Google Coab中。

我要浏览这个。我有一个完整的视频讲解。

关于这门课的介绍,但这里有一小段Python代码可以运行Python版本。现在,请注意,这里是2.0.0。Google,至少在录制时,还没有将Coab更新到TensorFlow 2.0,我怀疑这学期会发生。所以这就是为什么我几乎每次都要重新录制这个视频。

我将运行这个,我们将看到它将去到它的某个版本之一。是的,所以1.14,这是一个相当新的版本。我已经确保这里的所有代码,或者至少大部分与Coab兼容。那些不兼容的部分,可能不到课程的10%,我会警告你为什么会这样。

我也没有让任何作业需要Google Coab不支持的功能。现在,请注意,这里说GPU不可用。这是Google Coab一个很酷的特点。我们去运行时。更改运行时类型。我们保持不变。但我们放入一个GPU。现在它说GPU可用。稍后,这真的会为你节省一些执行这些程序的时间。

所以这向你展示了如何基本上将课程模块转移到Google Coab,如果你想运行它们。不幸的是,你需要像这样一个一个地复制。你可以下载,这将是一个快速的方法。你可以下载整个Github库,基本上只需将文件复制到你的G驱动,然后它们就会显示出来并可用。

现在让我们看看如何使用Google Coab提交作业。所以如果我们回到Coab,我们基本上尝试打开一个笔记本。我们会像之前一样回到Github。这很烦人。它希望我不断重新授权。它默认为作业。

这只是因为作业以一个开始,所以我们。

我将快速完成class1作业,我已经打开它,我们绝对必须将其复制到你的Google驱动,否则它将无法工作。你会想要更改它的名称。不要用副本,只称其为作业,我将命名为J Heaton作业。

把你的名字放到这里,替换为你的名字和class1。这是指令。一些常见问题会出现。你将基本上使用这个提交功能。所以继续运行这个,以构建提交功能。这只是我为你提供的一个功能。我们不会详细讨论它的工作原理。

这更多是用于使用这个课程的工具。这是一个重要部分。你需要这样做,以便基本上可以在你的笔记本中使用来自Google CoLab的文件。这将让你能够提交作业,还有一些课程要求你下载一个Cv文件作为输入数据,或者是图像或其他东西。

你需要把那些文件复制到你的Google G驱动器,然后通过这个访问。所以让我们看看这怎么运作。我们将继续运行这个,它也会要求我进行身份验证。我需要一个来自Google的授权码。我点击这个。这里是我的授权码。我不认为你能用这个做什么坏事,因为我认为它们持续的时间不长。

不过我会模糊处理这个,以确保安全。把它放到这里,按回车,现在它已经挂载。它挂载在这个位置。所以你需要用那个路径前缀你的文件,以证明它确实在那里。我可以运行感叹号L。所以这是Unix的ls命令。我在这里列出文件。

这是我创建的文件。你还会在这个课程中获得一个API密钥。我发给这些信息,实际上只是给参加课程的学生。如果你是普通互联网用户,可以在我的Patreon链接上查看,有些等级可以让你获得访问权限,如果你对此感兴趣的话。

但这个API密钥,我里面的那个实际上并不是真正的密钥。曾经是一个真实的密钥,但我基本上把它们换掉了,以免所有人都用我的演示密钥提交。所以在课程开始时,当你观看这个视频时,这将不再是有效的密钥。我将运行这个程序,作业一非常简单。

这只是证明你能够进行操作,并实际运行一个Python程序并提交它。我在这里运行,现在你可能会遇到这样的错误,这是重要的。所以它在说用户Jheton文件,我发现它需要知道你的笔记本文件在哪里,以便能够发送它。这更多是针对Mac和Linux。所以切换到这个用于CoLab。现在,你需要修改这个。

也许。所以你不会有你的名字。它将是你的名字,比如J Heaton_underbar class 1。所以不管这个文件叫什么,它应该会与这个非常相似。但确保把你的名字放进去。现在我们可以再试一次提交,它成功了。成功,你已提交作业1。这只是一个演示账户,实际上是我妻子的名字。

你已经提交了这份作业四次,这很好。所以你可以随意提交这些。如果下方有警告告诉你有问题,一定要修复这些警告,因为这肯定会导致你失分。现在,有时它会说你的值与我的值相差某个数字,如果是像0.0123这样的小数。

像那样,数字非常少。可能没关系,但再说一遍。对你实际成绩的自动评估没有保证。这只是为了帮助你,给你一个不因容易纠正的问题而失分的机会。这些每周都有截止日期。确保你按时提交。如果你迟交,会失去分数。

这就是运作的方式。如果你提交得太晚,你将根本得不到分数。所以确保你能掌握这些。这是一个混合课程,因此每周跟上进度非常重要,而不仅仅是在课程最后一天提交所有内容。你也可以检查你的提交情况。

这只是一些额外的代码。你把你的密钥放在这里,你可以确保我是否收到了作业。现在在我实际评分之前,你不会看到这些出现在canvas上,然后它就成为你实际课程成绩的一部分。好的,这就是你如何使用Google Colab。这是一个很好的选择,如果你不想麻烦地在电脑上安装Python和各种工具。

这让你可以访问相当不错的GPU。这些内容经常更改。所以订阅频道,以便随时了解这门课程和其他人工智能主题的最新动态。

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P11:[讲座] 如何提交深度学习应用的作业 - ShowMeAI - BV15f4y1w7b8

嗨,我是杰夫·海顿,欢迎来到华盛顿大学的深度神经网络应用课程。我的课程有10个模块作业,这些是短小的Python作业,你将完成这些作业来证明你对每个模块所涵盖内容的理解。

现在,当你提交作业到我正在运行的API时,会有一个自动检查程序运行,并在我实际评分之前,让你知道你在作业上做得如何。这给你一个机会来提交和重新提交,确保没有简单的错误。最终的成绩将会在我实际评分时录入到Canvas。

当截止日期过后,这也是一个半自动的过程。但是,这就是你的成绩实际进入Canvas的时间。现在,我会向华盛顿大学的学生发送这些API密钥,如果你在我的课程中注册,你应该已经从我这里收到了一份API密钥。如果没有,请联系我,我一定会给你发送一个。

通常,我会在课程实际开始前大约一周发送这些。如果你没有在华盛顿大学注册,只想使用自动检查功能,那么你可以点击我YouTube频道关于页面上的Patreon链接,我在某个级别提供这个服务。这是我为华盛顿大学以外的任何人提供的唯一评分服务。

你可以查看所有视频,看到所有作业。但我只实际评分那些积极注册我的课程的学生。

要查看我关于Cale、神经网络和其他AI主题的所有视频,请点击订阅按钮及其旁边的铃铛,并选择所有,以便接收到每个新视频的通知。好的,让我们开始使用Coab,看看我们如何仅用此提交作业。虽然有很多不同的方法,但这只是一个有效且相对简单的方法。如果你访问课程的Github仓库Jeff Heaton T81 558D学习,进入作业部分,实际上我们提交作业1。作业1非常简单,你只需将你的API密钥放入其中,这会识别你作为学生,并让我追踪是谁发送了什么。你应该从我这里收到过那封邮件,如果你没有收到,请给我发邮件让我知道,这样我可以重新发送给你。我只向华盛顿大学的学生发送这些邮件,如果你不是华盛顿大学的学生,但想使用这个课程内置的自动评分功能,那么有相关选项,如果你查看Patreon支持。

与我YouTube频道相关的网站。现在这是作业1。这是Python代码。你会注意到每个笔记本都有这个打开和coabab的链接。我们将点击它。这将在coab中打开,现在你可以实际运行代码,但你必须更进一步,你必须将其复制到你的Google Drive。它显示正在创建副本,现在在这里。现在我会说在这个时候让它属于你自己。所以作业的副本命名为Jayton,写上你的名字,我会保留Jayton,因为这是我。我已经重命名,如果你去你的Google Drive,在Google Drive使用coab时,你会得到这个coabab笔记本,如果你进去,你应该看到它似乎没有完全重命名。我们看看保存之后,你做了保存,现在它已重命名。现在这是一个问题,我见过一些学生卡在这里,Google Drive并不总是立即更新。

所以你需要像我那样进行保存。确保你能在Google Drive中真正看到它,并且名称正确。有时候在你保存之后,你可能需要等几分钟才能真正提交你的作业,通常情况下你不会立即下载,然后五分钟后提交,除非你真的。

这些我做得很快,但这是第一个作业。我列出了一些你可能会遇到的常见问题,以及你可能需要采取的解决措施。在这里的第一部分,你需要运行,这将使coab在线,并实际将你的Google Drive映射到coab,以便你可以访问它。我将继续运行这一部分,看看这里说的“注意:不使用Google Coab”,这应该在此通过后切换为使用coab。好的,你还需要做这个,这非常重要。

这是将coab连接到你的G Drive。不幸的是,在学期期间你会频繁这样做,他们会让你不断重复这个过程。相信我,我大概做过100次。点击那个。你点击允许。这不是你的API密钥。不要对此感到困惑。这并不是你用来提交的内容。这只是为了将coab连接到你的G Drive。

我们回到这里,我们必须回到你可能需要的那个副本。所以是的,就是这个。我会将其粘贴到那里,按回车,它正在进行身份验证。这只需要片刻,应该会显示这个“注意:使用Google coab和Tensorflow 2”。这是我给你的一个方便命令,我只在第一个作业中放了它。

但如果你愿意,可以将其复制并粘贴到其他地方,我要运行它。这个感叹号意味着要运行一个unx命令L,这是一个名为list的unx命令,有点像目录和dos。我们基本上只是列出我的笔记本目录的内容,这实际上与去Google Coab做的事情基本相同,抱歉。

这实际上和进入Google Drive查看它在这里是一样的,所以我们将回到这里以便查看。我们需要这个名称,所以我先复制它。但本质上就是上面那个。你也可以复制那个。这是我提供给你的提交功能。你并不需要真正了解它是如何工作的。它基本上是一个通过网络的API调用,它调用我主服务器上的一个网址,跟踪所有这些作业提交。所有的Https都是加密的,只需运行这个,如果你得到一个错误,显示找不到提交。

这意味着你可能忘记在这里运行这个,你需要放置你的密钥。这是我发给你的API密钥。我将神奇地将我的密钥移动到剪贴板中。你可能实际上会从你的电子邮件或你记录下来的地方复制并粘贴它,但我将选择这里的那个。顺便说一下,如果我只运行这里的那个。

我会得到一个错误。实际上我会得到几个错误。让我用这个来演示一下。让我们运行这个,不会运行得很好。没有目录用户J Heaton项目,等等。这是因为这里的文件名,即你尝试提交的文件名无效。那是因为我使用的是Mac Linux,但我想使用这个。

这是Google Colab的那个,你还需要更改它以便填上你的名字。好的,现在里面有我的名字了,现在让我们运行它。如果你收到另一个消息说找不到它,请查看并确保它完全和现在一样。

确保这与上面的内容匹配,确保你已经进行了文件保存,也许使用我之前给你的那个列表命令,以确保一切都正常。如果都没有问题,给它五分钟。有时候Google需要一点时间来同步。好的,这就是给Bennon的。让我在这里放入我的API密钥。这是我的密钥。

也不要使用那个。它将在课堂开始前被删除。这些只是我使用的临时密钥。而这一切只是提交这个硬编码的CSV文件,这基本上是异或运算符的真值表。但这就是这个作业所期望的。所以我会点击这个,运行需要一点时间。

这基本上是在将作业发送给我。你还没有得到你的成绩,但它会为你检查。这是一个相当高级的检查器,合理地说。如果你改变了一些东西,比如说这一列的名称是Z而不是A,现在它会生气,立即显示数据没有警告。你可能会……但是没有保证。最终成绩在Canvas中,你提交后在Canvas中没有成绩。

我会手动输入你的分数,或者我有一个每天早上运行的自动化过程,如果检查到你的代码没有问题,除了自动检查器检查的内容,它会给你满分,如果你没有迟交。

如果你在截止日期后提交,将会失去分数,所以不要这样做。如果你提交的时间超过一周,将会得零分,所以也不要这样做。现在我来运行一下,并重命名那个列。自动检查器会检测到问题,解决方案标题是AB,但你的标题是B和Z,这不好,所以你会收到警告,可以随时重新提交。

你可以提交直到完美。这十个作业的目的是让你尝试这一点,不用担心,你可以提交十次。我是说,不要做拒绝服务攻击或其他什么,但你可以提交十次。如果你的第101次完全正确,你将获得A分。这就是它的运作方式。继续运行,只要第101次不是迟交。

好的,它甚至会跟踪,我提交了13次,运气不好。如果你想稍后检查,可以使用下面的代码。我只在作业1中放了这个代码。如果你用那个相同的API密钥运行这个,嗯,那只是定义了它。

然后在这里运行。输入我的密钥,它会显示我在所有这些作业上的进展。那是我可能在测试提交。如果我想检查某个作业,可以点击这个,这样就能具体看到我在某个特定作业上收到的警告,这就是如何使用Google Colab,我想大多数人可能都会这样做。

如果我们从Windows电脑本地执行这一步,过程会与Mac非常相似,这里不单独展示Mac。首先更改为。

确保你已激活Tensorflow环境,以激活Tensorflow Jupyter Notebook并启动它。进入作业文件夹,如果你还没有在那的话。但这是作业,我们会进入作业1,把它放入Python 37 Tensorflow中,重命名,以免在Colab中打开。这部分是Colab的指令。

你可以运行这个,或者你可以完全根据自己的选择来运行。它不会像我们在Colab时那样提示你任何东西。它只会说没有使用Google Colab,这个命令在Windows上不起作用,所以不要运行它。我们会定义提交功能,现在准备提交了。我已经神奇地将我的密钥复制到了剪贴板。确保更改这个,使文件名与实际文件名匹配,路径正确,然后运行,这有助于将其格式化为正确的格式。

这是Windows、SeQL和用户,而这台机器上我实际上并没有使用项目目录。所以这必须与你自己的计算机匹配。所有的作业都匹配,然后Jheaton这是一个很好的例子。如果你遇到那个错误,去命令提示符或在用户Jheaton中检查,确保这些部分逐一都是正确的T81作业,作业Jheaton1,IPy和B。如果你能执行Dr并看到你的命令和文件,那么它确实存在。我将复制并粘贴,将其覆盖在这里,我们必须做这两个s,因为这就是如何正确编码一个backf。尽量不要像我刚才那样犯任何错误,结果是成功的。所以那里有一些小的错字,但这就是我验证路径的方式,因此这实际上是一个很好的例子。我希望我能说这是我故意做的,但显然不是。

就我而言。所以现在你已经提交,数据上没有警告。这会检查你的数据。我重复这一点是为了防止你快速跳过了这部分。如果我在这方面做错了,它将会告诉你你的头部有问题。这是一个自动检查。

你将在Canvas中看到你的实际成绩,通常在第二天。我有一个自动处理程序,每天早上运行,检查提交情况。如果它检测到你的提交没有问题,它看起来是完美的分数,那么它将会在Canvas中给你全额学分。

这是我需要更具体地检查的内容,如果你希望我查看你在代码中所做的事情,如果你搞错了,我会看它,因为自动更正器无法解决它,然后会将其发送给我。但如果你想让我提供关于你的编码技术或其他方面的任何意见,请告诉我。

我会很高兴。请查看这些内容,如果自动更正器将其标记为完美,并且如果截止日期已过一周,那么如果你没有提交,就意味着你得了零分。我会逐一发布我的解决方案文件,你将看到我实际是如何做的,并且在接下来的每周Zoom会议中会讨论这个问题。感谢你观看这个视频,如果你是WasU的学生并且在提交作业时遇到任何问题。

请联系我,所有成绩将会在只有WasU学生可以访问的Canvas系统中。

这就是提交作业的全部内容,祝你学期顺利。如果你有任何问题,请务必告诉我。如果你想及时了解我在这门课程和其他人工智能项目上的所有动态,请订阅我的YouTube频道。非常感谢。

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P12:L2.1- 深度学习数据处理工具库Pandas 简介 - ShowMeAI - BV15f4y1w7b8

嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将开始这个模块的一系列内容,接下来的五个视频将讨论 pandas。现在,神经网络可以接受表格数据,这种数据就像你在 Microsoft Excel 中看到的一样。许多传统数据科学问题都是这样设置的。

Kagle 上的许多比赛都是这样设置的。我们将在本课程的后面深入探讨图像和音频处理以及文本自然语言处理,而不会使用 pandas。但在开始时,当我们处理一些传统数据集时,情况则不同。

pandas 对处理可以分为列的数据集非常有用。关于我最新的 AI 课程和项目,请点击旁边的铃铛订阅,以便收到每个新视频的通知。神经网络接收多种数据进行预测。

一种你将要读取的数据是 CSV 文件,这与表格数据有关。我们将在几节课上花时间讨论表格数据,几个模块。但我们还将深入研究神经网络擅长处理的图像和其他更高级的输入。不过现在,我们要看看 pandas,看看如何处理表格数据。

在这里我们使用 pandas 读取 CSV。你将在读取不同数据集时看到很多这一点。我是从网络读取的,所以在 collab 和本地运行时都应该有效,它会打印出数据框的输出。至少是前五行。我们也可以使用 display 函数,使其打印得更好看。这显示了每加仑英里数数据集,这是一个经典的数据集。

在许多机器学习文献中你会看到,我们会使用它,但不太多。它显示了这些不同车型的每加仑英里数,特别是1970年代的车型。你试图用这里看到的其他值来预测每加仑英里数。这个展示了一种打印该值基本统计信息的方法。

并且它展示了你如何与 pandas 一起工作。如果你运行这个,它基本上会给你每个字段。因此,字段被命名为每加仑英里数。下一个字段被命名为气缸,依此类推。这会给你一些统计信息,均值、方差、标准差等等。稍微有点难读。

但我们稍后会让它更易读。让我们看看我们实际上是如何做到这一点的。我们正在使用数据框,只使用整数和浮点数类型的数据。这实际上是丢弃了名称。然后我们获取这些值的标题,并创建一个名为 fields 的空列表。我们将循环遍历列中的每个字段。

所以我们将遍历每一列,并将一个我们动态构建的字典附加到字段中。这个字典有四个元素,分别是条目名称、我们当前处理的字段的均值。数据框就是这样计算某一列的均值:.mean.variance.standard deviation

你可以使用中位数,许多统计值都可以使用。然后我们将它们打印出来。这是构建字典列表的一个好例子,这是一种非常常见的结构。这就像一个数据库表格。这也是你可以将数据放入的确切格式,以便直接加载到数据框中。

在这里,我们可以看到我们可以将这里创建的数据转换为 pandas 数据框。这非常方便,因为现在我们可以很好地展示它。因此,我们基本上是从头开始创建了一个数据框。所有这些均值、标准差和方差的值我们都放在了 NA 中,这个字典是我们一个个添加的。

这些就像我们正在创建的这个特定表格中的行。现在,缺失值的现实是,作为数据科学家,你处理的数据总是有问题。😊。如果数据完美,我几乎会担心我没有发现的问题。我们将在这里加载每加仑的汽车英里数,这就是那个相同的数据集。但我们在这里说 NA 值是 NA 和问号,因为在这个特定数据集中有几个问号,其中有一个马力值缺失。所以如果你运行这个,它会显示是的。

如果马力确实有 NA 值,那么我们填充缺失的值。我们取中位数,现在中位数通常比均值更适合用于填充缺失值,因为中位数对离群值的敏感度较低,而均值则较高。如果你有一个巨大的离群值,这会影响你的均值。

但这并不会真正影响你的中位数。因此我们采用马力,并用那个中位数填充缺失的 NA 值,如果你愿意,也可以直接删除 NA 值,这会删除整个包含 NA 值的行,现在我们打印出马力确实没有 NA 值。

有 NA,因为我们填充了它。离群值是你可能需要处理的另一件事。你可以删除它们或以其他方式处理它们。我在这里向你展示如何删除它们。我们将离群值定义为高于或低于均值两个或更多标准差的值,两个可能有点近,但也许是三个或更高。

但这向你展示了如何删除,我们想删除大量数据,因此我们将删除任何高于或低于均值两个标准差的值。我们做的第一件事是计算要删除的行。因此我们基本上是在要求一个绝对值的列表。

对于每个单独的值,name 是我们正在计算离群值的列。我们从均值中减去它,并确保它不超过该标准差的数量。然后我们删除这些行,这些行的索引已获取。我们使用 axis 等于 0,因为我们处理的是行和列。我们并没有删除列。

就地意味着它修改实际的数据框,而不是返回第二个数据框。运行函数。因此它在内存中。这将加载相同的数据集并创建特征向量。它通过将马力替换为中位数来实现。我们将删除 name,因为我们不需要它,这在这个例子中并不重要。

然后我们查看每加仑的英里数的长度,看看在删除这些值之前和之后,我们看到数量从 398 变为 388。我在这里展示了一些数据,你可能真的看不到明显的不同。在 pandas 中删除字段非常简单,如果我们想删除 name 字段,只需这样做。

它告诉你列的数量在前后或实际的列,你可以看到 name 之前在那里。能够从数据框中删除整个列是非常方便的,我们也可以将东西连接在一起,这在我们开始生成虚拟变量和其他变量时变得非常有用,我们需要将它们添加到数据框中。

这将创建一个新的数据框,仅包含两个值,因此这是仅创建 name 和马力。我们提取马力,提取 name,然后将这两者作为列连接在一起,axis 1 总是表示列,你会得到这个漂亮的结果,我们只显示前五行。

但这就是你可以选择其中一个的方法,无论你如何选择。并从头开始构建数据框,有些作业会要求你做非常类似的事情。因此,能够将这些列或系列放在一起以构建全新的数据框是非常有用的,你还可以将行连接在一起。这是将前两行和最后两行连接起来,因此我们从零到二取数据框,然后从负二开始,这意味着从末尾往回数两行到末尾。

现在一起处理 catatum。这是访问零,因为我们处理的是行。你经常会使用 pandas4 进行训练。将训练数据分割为训练集和验证集,甚至进行 k 折交叉验证,在后面的模块中会深入讨论 k 折交叉验证。但你基本上可以将数据分割为训练集和验证集,这样你就可以在这里拥有整个数据集。

但你取80%作为训练,20%作为验证。你通常会在训练集上训练和拟合你的模型,并在验证集上评估从训练集中创建的模型。这是一段简单的代码,展示了如何做到这一点。我们基本上是在这里使用掩码来创建一个。

一组值的掩码,这只是一组真和假的列表。真是会被包含的,而假则不会。因此,由于我们取了80%的训练数据框。基本上,得到应用掩码后的数据框,反向掩码,我们能够打印出我们的训练集为312,而验证集为86。

这非常重要,你不能直接将数据框发送到Kras,你需要能够使用nuy来实现。Numpy的do values正是这样做的,所以在这里你可以看到,它基本上是提取了值并创建了一个矩阵。现在你可能不想要所有这些值,比如这里的名字不是数字,这可能会导致问题。

你现在可以传入一个列表,这在Python中经常会引起一些混淆,当你看到数组的双大括号时。这不是双大括号。这只是意味着你传入的索引是一个列表。因此你是在说,我想要数据框中的所有行,但我只想要这些列。如果你现在运行这一段,没有名字,那样你就没有了那个丑陋的字符字符串,它是纯数字的。

这就是你想要的。当我们学习如何为神经网络准备特征向量时,我们会看到更多的内容。你可以将创建或修改的数据框保存为CSV文件,这允许你在Jupyter Notebook外部使用Excel或更高级的CSV文件查看工具查看它。你必须小心使用Excel,它往往会修改CSV文件,甚至会通过删除前导零和其他方式来破坏它,并且它对文本编码如UTF-8的支持也有限。仅使用Excel查看内容是可以的,但要注意它可能会重新格式化某些数据并破坏它。现在,当你将其保存为CSV文件时,这很有用,因为我通常会让你以这种形式提交这些文件作为一些作业。

当你参加CAgle竞赛时,你通常会提交一个CSV文件。我会在我们到达那个点时发布本学期CAgle竞赛的确切要求。保存CSV的命令简单如下to CSV。我们基本上只是在洗牌这个数据框,然后写回去。

索引等于 false,通常你希望索引等于 false,因为这会告诉它不要在每一行上放置行号。现在,当你运行这个时,它只是显示完成,并生成我们所说的路径中的 CSV,点表示当前目录。如果你正在使用 Google Colab,可能需要将你映射的 G 盘路径放在那里,然后它会将输出放到你可以获取该文件的地方,你可以在 Google Docs 或其他地方查看它。Google Docs 是查看 CSV 的非常好用的程序。将数据框保存为 pickle,pickle 是一种二进制文件格式,因此当你保存为 CSV 时,实际上是将其写入文本文件中,这通常可以读取,但在 CSV 文件之间来回传输时可能会遇到非常小的精度问题,通常这不是问题,只有在你试图比较两个文件时才会出现。

Pickle 将确保你获得文件的准确渲染,并且它还存储在数据框中不适合存入 CSV 的其他元数据,比如行号。如果我运行这个,它只是告诉我我已经完成了,再次进行了这个重新索引的操作。我们将重新加载 pickle 文件,使用 pickle dump 来保存,而这会将其加载回去。现在,有一点很重要要注意,这是文件。

这些是所有列和内容,但这里是你可以区分加载 pickle 文件和加载 CSV 文件的方法,注意行号不对齐,因为我们进行了重排,而且我们没有重建索引。因此,存储在 pickle 文件中的内容在 CSV 文件中将会丢失,通常你并不在意丢失这些。

但是你实际的行号是从最初加载时来的。这些行号只是因为我们进行了洗牌而不按顺序排列,但这并不是会存储到 CSV 文件中的内容。

感谢观看关于 pandas 介绍的视频。我们将在本模块的其他部分深入探讨如何进行更高级的处理。该内容经常更新,因此请订阅频道以获取有关本课程和人工智能其他主题的最新信息。😊

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P13:L2.2- 使用Pandas为 Keras 编码类别型数据 - ShowMeAI - BV15f4y1w7b8

嗨,我是杰夫·伊顿。欢迎来到华盛顿大学的深度神经网络应用课程。在这段视频中,我们将看看如何处理分类值。分类值是指文本型而非数值型的内容。这些需要特别处理才能输入到神经网络中。

有许多经典的方法来处理这些,比如虚拟变量。然而,我们将查看一些不同的方法来实际编码这种类型的值,以便用于神经网络。有关我的AI课程和项目的最新信息,请点击订阅及旁边的铃铛,以便在每个新视频发布时收到通知。分类值和连续值是你会频繁遇到的两种数据类型,尤其在表格数据集中。

我们实际上可以将你会遇到的数据类型分为四类:名义型、序数型、区间型和比率型。字符数据。所以字符串你可以看作是名义型或序数型。名义型只是纯粹的分类值,比如红色、绿色、蓝色、橙色、靛蓝。

像颜色这样的东西。现在,颜色,你可能会将其编码为RGB值或其他值,而不是虚拟变量。但通常情况下,名义值只是没有特定顺序的东西。你应该尽量想出一个排序,如果可以的话。

然后,这使得名义值变成了序数型。序数型也是你数据集中的文本数据,但它们是可以排序的。现在你可能偶尔会有一些没有界限的文本,比如备注列或产品名称。这些既不是名义型也不是序数型,我想它们会是名义型,但你会有太多虚拟变量。因此,当我们处理自然语言处理时,会看到其他处理自由文本的方法。

还有区间型和比率型。这两种类型在处理上很少有所不同。但区间型基本上是没有定义起点的数值,你可以想象成温度。在我下面的例子中,你不会说昨天的温度是今天的两倍,因为其实没有,除非是开尔文。

对于数值数据而言,温度的最低值并没有明确的起点。华氏度最初假设零是绝对零度,而这显然是错误的,但这本可以是一个很好的比率的例子。所以比率是一个有明确起点的数值。

你可以说一辆车的速度是另一辆车的两倍,因为是以英里每小时来计。车速,最低可以是0。因此它有一个明确的起始点。我是说,从技术上讲,负10可以倒退10英里每小时,但我们不考虑这个例子。所以首先我们来看如何对连续值进行编码。

对于连续值,有时你需要对它们进行标准化。现在,为什么你可能需要标准化值呢?想象一下,你在校园里遇到一个朋友,他们说:“哦,我昨天参加了这场考试,得了60分。”那么,这个分数是好是坏?完全没有标准化。他们告诉你他们得了多少分。

整个考试可用的分数有多少。如果总分是100,那么60分并不算好;如果那场考试只有60分,那么60分就是满分。Z分数让你可以这样做。因此,Z分数对数据进行标准化,Z分数为0意味着你恰好在均值,-1的Z分数意味着你低于均值一个标准差。同样,+1的Z分数意味着你高于均值一个标准差。这就像将某种东西以百分比的形式表达,但它让你知道是否包含了标准差,使其在标准化时更具适用性。现在让我们看看如何在每加仑英里数据库中进行标准化。

低于平均每加仑英里数的偏差。这让你很快知道哪些高于和低于均值。这样做的另一个好处是,当我们想要屏蔽数据,使其变得困难以保护隐私时,你仍然可以在其上构建模型,Z分数可以很好地实现这一点,比如人的年龄,如果你把年龄转化为Z分数。

看你数据的人可能不会猜到这实际上是某人的年龄,因为他们会看到类似的值,如每加仑英里数。然而,如果你看到的值在18到21和85之间,你可能会猜测这是某人的年龄,隐匿私人信息(例如年龄)是有用的。因此,Z分数在某些情况下被用于此。但好的一点是,如果我们将这些列的每一个都转化为Z分数,它们在某种程度上会变得不那么可读,因为你看不到这些实际的权重。

类似的事情,但你会很快发现哪些值高于或低于均值。此外,这些值往往会在零附近均匀分布,这在某些情况下会帮助神经网络预测功率。同时,你会发现所有这些值的范围相似,因此汽车的重量可能会大大超过气缸的数量,这个数字要小得多,所以使用Z分数对连续值进行编码有一些优势。现在来看看分类值。

你经常会听到的经典方法是虚拟变量,如果我们加载之前看到的示例数据集。这个数据集包含工作代码、区域和收入,用于预测一个人将要购买的几种产品。如果我们查看这个数据集,可以创建虚拟变量,之前在课程中也见过,我们基本上可以查看区域的数量,总共有四个,可以创建虚拟变量。

对于虚拟变量,这实际上是为这些变量展示查找表。所以对于第一个区域,如果它是一个虚拟变量,第一个虚拟变量将为真,其余为假。同样地,对于第二个,以此类推。如果我们想使用这种查找表对数据进行编码,就这样做。

这些是创建的虚拟变量。因此前几行可能全是值C。然后我们有一个值D。我们可以通过运行这些数据看到,所有这些第一行的值都是C。同样,C填充了D,区域也为C。现在我们已将虚拟变量实际添加到其中。

我们的最终目标是将数据完全转化为数字格式。因此,我们需要从中去掉区域一。我们这样做后,可以看到区域已被移除。这是我们将数据转化为可以呈现给神经网络的一步。我们仍然需要对工作类别进行类似的编码。

对于虚拟变量,还有其他编码方式。除了虚拟变量,还有其他分类方法。你可以使用称为目标编码的方式。目标编码是一种更高级的技术,常用于Kaggle竞赛。因此,它可能非常强大,但也可能非常危险,因为你很容易导致过拟合。

容易导致过拟合,因此要非常小心。你应该始终使用某种留出法或交叉验证技术,以确保结果的准确率不是人为提高的,因为你可能会过拟合。让我们快速创建一个示例数据集。我们查看这个数据集,有一个连续值,我们实际上不会使用,然后是两个类别变量。

类别变量0和类别变量1,然后是目标变量y,我们试图预测的变量。我们可以为狗、猫、狼和虎创建虚拟变量。再次提醒,每个类别都有两个类。因此,猫1是虎和狼,猫0是狗和猫。如果我们在这里运行这一行,将按猫0进行分组。

在y上查看均值。所以它会告诉你狗和猫的目标y的平均值是多少。我们运行这个,猫是0.2,狗是0.8。当你评估这些目标编码时,这是你希望看到的情况。幸运的是,这两个是可以区分的。这告诉你一些事情。这一输出,猫或狗非常具有预测性,如果这个值更接近两个目标之间的中点。

所以目标是0和1,如果这个值更接近0.5,目标编码可能不会对这个特定类别有帮助。类似地,狗是0.8。所以这些目标的总和应该等于目标值。因此,基本上你可以认为目标编码做的就是非常简单的总和。

我们将猫保持为cat 0作为一个单列。我们不会像用虚拟变量那样拆分成两列。我们基本上会给所有的猫赋值0.2,给所有的狗赋值0.8。我们现在已经将其转化为一个数字,这个数字将有助于预测y。

这违反了数据科学的绝对基本规则。你现在在实际训练之前就使用了目标进行预测。这是潜在的危险,所以在使用这个技术时要非常小心,我会向你展示如何降低这种风险,而这种风险的出现是在你有非常小数量的一个类别时。我们只有一只老虎,而老虎的值是零。所以老虎的平均值将是零。

所以在任何地方我们用零替换老虎时,这一行将绝对正确。仅仅基于这一列,所以它与目标的相关性将达到100%。当你有低基数或特定类别的数量很少时,这种情况就更加危险。我们处理这个问题的方法是统计每个类别的数量,并指定一个权重,表明在这些低案例中我们将有多大程度上趋向于y的整体平均值。

我们计算y的整体平均值,这可以在这里计算出0.5。因此每个类别的数量正好是一半。对于像ti这样的情况,我们会更倾向于0.5而不是0。所以你有这两个因素作为这一部分。你有Wolffer的ti的平均值,但你也有y的整体平均值。

所以我们计算一个平滑的均值,尝试将其平滑化,平滑因子在这里传递。你将传递两个需要修改的数据框。之所以有两个数据框,是因为你可能会有一个训练集和一个测试集。你甚至可能需要更多。你可以修改这个函数。

这是我从Max Halford复制的原始函数所做的更改,我在这里提供了他的原始链接。我修复了一些问题,并进行了修改。你需要传入将要修改的分类变量的名称、目标的名称以及权重,如果权重为零。

然后,过拟合的风险将会显著增加,因为它更接近于每个单独类别的平均值。如果没有第二个数据框DF2,可以传入空值。

所以在设置权重时,重要的是要记住,传入的权重值越强,值较少的类别会更倾向于y的整体平均值,这意味着过拟合的机会更小。较弱的权重则有更大的过拟合潜力。现在,将分类值编码为序数是一种非常强大的技术。

没有真正的过拟合机会。假设你有所有这些教育水平,从幼儿园到博士后。你可以为这些创建虚拟变量,但你实际上是在失去一些信息,因为这些是有序的。你不会在博士后之前上五年级,因此可以为每个级别分配一个0到20的数字,并用该数字代替虚拟变量,这样你就只会有一个值而不是21个。

另外,你可能还想改变权重,因为例如研究生的情况。你可能在研究生阶段的时间比在六年级的时间更长,一年与谁知道多少年的研究生经历。感谢观看这段关于分类值的视频。

在下一个视频中,我们将学习如何使用pandas进行其他预处理,如数据集的分组、排序和打乱。该内容经常变化,因此请订阅频道,以便及时了解本课程及其他人工智能主题。

T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P14:L2.3- Python Pandas 中的数据分组、排序和改组 - ShowMeAI - BV15f4y1w7b8

嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将讨论如何在pandas中对数据集进行分组、排序和打乱。这使你能够像在SQL中进行group by那样,对数据进行汇总和聚合,以便以其他方式处理数据,准备好输入神经网络。如需了解我最新的AI课程和项目,请点击订阅并点击旁边的铃铛,以便收到每个新视频的通知。Pandas数据框也可以进行分组、排序和打乱。

我们将讨论如何在数据中进行打乱,这是非常有用的。你要确保没有多个相同的目标靠得太近。我是说,最糟糕的情况就是按目标对你的数据集进行排序。

然后将其平均分配,以获得你的训练集和测试集,因为你的测试集可能有所有低值,而你的训练集可能有所有高值或类似的东西。因此,打乱是一个非常好的做法。我在这里运行的这个命令使用了autompg数据集。如果你想要一致的打乱,这也是不错的选择。

这通常是比较可取的,因为你可能需要重新打乱数据集以添加列或其他类似操作。你可能不希望顺序发生变化,因为你已经建立了一些基准。你确实希望它是随机的,但又希望它始终保持随机,因此你可以在这里选择一个种子数字。我选择42,这个数字来源于《银河系漫游指南》,这是一本虚构的书,你可以查阅。

但这基本上是将这行进行资源化。这一行使得这些数字在这个列表中有序。即使你省略第二行也没关系,注意如果我在这里运行它。这些数字现在没有被恢复到零到一之间或零,1,2,3等。

我喜欢将它们按这种方式排列。因此,我通常会这样做。如果你不读取,可能会导致一些其他奇怪的现象。我们设置了这些。你也可以对数据集进行排序,这里我们将使用汽车每加仑的行驶里程数据集,我们将对其进行排序。我们将按汽车名称以升序排序。

然后我们可以打印出第一辆车的名称,即AMC大使。布里汉姆,现在你有了一个排序的数据集,注意这些数字再次是无序的,因此你可以知道原始位置在哪里。你可以使用上面一样的重置索引命令将这些恢复。再次强调,你可能在打乱之前是否关心原始排序顺序,我通常不在乎。

我几乎总是会重置这个。你也可以分组数据集,分组与SQL中的group by命令非常相似。它通常使用一个分类值来对数据进行分组。然后你可以计算每个类别中有多少个值,基于第一个分组的类别对另一列进行平均。那么让我们来看这个。这是CARS数据库。

我们将按缸数分组并报告每加仑行驶里程的平均值,所以是均值。我们将运行这个。我们看到这是每加仑行驶里程的平均值。所以八缸车毫不意外地获得了最差的每加仑行驶里程,6。6缸更好。5缸甚至更好,4缸。然后是这三款三缸车。

因为我们的五缸车有点例外。它们非常罕见。所以这可能是那三款车每加仑行驶里程下降的原因。它们可能实际上是性能车。我不知道。我得研究数据并解释一下。但不管怎样。

这就是你如何快速遍历所有这些并获取平均值。你可能希望将这些作为字典。这样,你可以很快在字典中查找,并找到其中任何一个的均值。例如,如果你想知道六缸车的均值,你可以运行这个,它会告诉你19。这一点很重要,要意识到这是6。

那不是索引,而是键,所以这里的键。它返回值19.98。你还可以计算每个类别中有多少辆车,这一点相当重要。你可以看到为什么三缸车如此特殊。只有四辆,而四缸车则有2044辆。

至少在创建这个数据集时,这是最常见的。那时也有很多V8车型。我怀疑在今天,这种分布会有所不同。这就是你如何对数据进行排序和分组的,这种分组特别是在特征工程中你会非常常用。你通常想要将数据集分组,查看这些值如何根据这一点变化。

例如,假设你有缺失的MPG值。你可以直接插入MPG的中位数。或者你可以做。我怀疑这会与均值非常相似。大多数情况下,所以你可以使用中位数,假设你有一个缺失的MPG,而不是仅仅将整个数据集的整体中位数放入,你可以查看缸数,并插入该车的缸数对应的中位数的缺失值。

这给你提供了一种更智能的方式来填补缺失值。与简单地放入整体中位数不同,你可以使用与另一个字段强相关的中位数。在这种情况下,缸数和每加仑行驶里程是高度相关的。这将是一个非常好的技术,适用于我们在学期后期的Kaggle竞赛项目。

感谢观看这个关于在pandas中进行分组排序和其他技术的视频。在下一个视频中,我们将讨论如何使用apply和map。这使你可以使用Lambda函数对pandas数据框进行更复杂的修改。该内容经常更新,因此请订阅频道以便随时获取该课程和其他人工智能主题的最新信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机做智能宠物狗项目

目录STM32单片机做智能宠物狗材料外壳模型 STM32单片机做智能宠物狗在短视频里面看到有人用单片机做了一个宠物,让我兴趣浓厚做一个出来,我想在这里记录一下我学STM32的单片机做智能宠物的学习过程。材料 外壳模型、5个舵机(4条腿+1条尾巴)、OLED显示屏、电池、充放电模块、语…

【续】《英雄无敌》3完整版complete(英文)——免CD修改(完美版)

在前一篇文章中,介绍了《英雄无敌》3的complete(英文)版的免CD制作,但那是一副仓促之作,破解得很粗糙,留下了很大的不足!由于《英雄无敌》3的一些过场动画,是放在光盘上,通过程序加载时,再把这些资源加载到内存的,因此,程序中对光盘信息的处理远较其它游戏复杂,而…

数据结构 - 队列

队列是先进先出数据结构,分顺序和链式队列。顺序队列容量固定,易浪费空间;链式队列无限扩容,高内存利用率。队列按功能特性分多种,如阻塞、优先、延迟、循环和双端队列,不同场景有独特效果。队列也是一种操作受限的线性数据结构,与栈很相似。01、定义 栈的操作受限表现为…

rocketmq 单机版安装及可视化

配网ping www.baidu.comnmcli connection delete eth1nmcli connection add con-name eth1 type ethernet ifname eth1nmcli connection up eth1ip route showip route del default via 192.168.88.200 dev eth0下载JDKwget https://download.oracle.com/java/17/latest/jdk-17…

空间大数据的数据变换与价值提炼

在数字化时代,空间大数据正成为推动社会经济发展的关键因素。空间大数据不仅体量巨大,而且具有高速流转、多样类型和真实性等特点,它们在获取、存储、管理、分析方面超出了传统数据库软件工具的能力范围。地理信息系统(GIS)作为处理和分析空间大数据的重要工具,其在数据变…

MySQL 建立了唯一索引的字段允许多个 NULL 值存在吗

原文:MySQL 唯一索引的字段值允许多个 NULL 值存在吗结论:MySQL innoDB 引擎,设置了唯一索引的列,不仅允许 NULL 值存在,而且允许多个 NULL 值存在。 示例:字段 userCardNum 添加了唯一索引。证实是允许存在的多个 NULL 值数据的:解释:因为 NULL 表示未知值。多个 NULL…

如何构建高效数据流通交易体系

在数字化时代,数据已成为关键生产要素,其高效流通和交易是推动数字经济发展的核心。构建一个高效、安全、合规的数据流通交易体系,对于释放数据价值、促进经济社会发展具有重要意义。 一、建立合规高效的数据要素流通和交易制度《数据二十条》提出,要建立合规高效、场内外结…

文献阅读

一:文献管理软件——小绿鲸 1:文献乱码问题 一个很容易遇到的问题是一些期刊下载的论文pdf导入小绿鲸会使得划词翻译时出现乱码于是我想着先通过wps打开,用扫描件识别这个功能再导入后,乱码问题解决