ShowMeAI-人工智能工具笔记-十五-
ShowMeAI 人工智能工具笔记(十五)
用Pandas进行数据处理与分析!真实数据&实时讲解,学完就能上手做数据分析了!<实战教程系列> - P5:5)更新 - 修改Dataframe内的行列数据 - ShowMeAI - BV1M64y187bz
嗨,大家好。你们好吗?在这个视频中,我们将学习如何更改数据框中的现有行和列。在上一个视频中,我们学习了如何筛选特定信息,我们可以在这里使用那些技术来修改我们的数据。
所以我们将学习如何更新行和列的数据。接下来在下一个视频中,我们还将学习如何从数据框中添加和删除行和列。现在,我想提到的是,我们确实有这个系列视频的赞助商,那就是Brilliant Org。因此,我非常感谢Brilliant赞助这个系列。
如果大家能通过下面描述部分的链接查看他们并支持赞助商,那就太好了。我会稍后详细讲述他们的服务。所以说完这些,让我们开始吧。好吧,让我们看看如何更新我们行和列中的数据。在最近的几个视频中,我们已经看到如何筛选特定数据。
但现在让我们看看这些相同的概念,并用它们来对我们的数据进行更改。所以我们先看看更新列,然后再更新一些行。我目前在这里打开了我的片段文件😊,这是我们在之前的视频中看到的,以便在查看如何在更大的数据集(即堆栈溢出调查数据)上执行此操作之前,了解它在较小数据集上的表现。现在,在修改列之前,让我们先看看这些列,使用我们在之前的视频中看到的列属性。
所以让我在底部添加一个新单元。我们可以通过说Df.columns
来查看列,我们可以看到这里只有三列。所以我们的列名是“first”,“last”和“email”。所以假设我们想要将列更新得更具体一些。
假设我想把这个改为“first name”而不是“first”。所以我们可以用几种方法来实现这一点。首先,如果我们想重命名所有列,我们可以简单地使用我刚才用过的列属性进行赋值。为了做到这一点,我可以在这里使用赋值,并传入一个列表。
所以我可以传入一个我想要的所有不同列的列表。我将其称为“first name”,“last name”,并将“email”保持不变。所以如果我运行这个,现在再看看这些列,现在我们可以看到这些列名已经改变。如果我实际查看这里的数据框,它们在数据框中也显示为已更改。
现在,我几乎从不使用这个,因为这是在传递不同名称给所有列时使用的,我通常只需要更改少数不同列的名称。现在,更常见的一件事情是需要更改数据框中每列的特定内容。
比如说,也许你的列都是大写的,你想把它们改成小写,反之亦然,或者也许你的列名中有空格,你想用下划线替换列名中的空格。在这种情况下,我们可以使用列表推导式。比如说,假设我想把所有的列名变成大写。那么为此,我可以使用列表推导式。
我可以直接说Df的列等于,然后我们就说像x.upper(),对于Df的列中的每个x。所以如果我在做完这个更改后打印出数据框,那么我们可以看到现在所有的列名都已转换为大写。另一个你可能想做的事情是去掉空格,用下划线替换。
特别是如果你喜欢使用点表示法来访问列名,那在列名中有空格时就不起作用,因为这不符合语法。所以如果你想用下划线替换空格,可以做类似的操作,直接说Df的列等于Df的列进行替换。
我们在这个列序列上使用STR方法。然后我们可以使用来自该序列类的replace方法。所以我可以直接传入一个空格,说明我们想要替换,把所有这些空格替换为下划线。现在这不会对我们的具体数据框做出任何更改,因为我们所有的列名中已经有下划线。如果我反转这一点,使用下划线和空格,那么我们可以看到我们将所有的下划线替换为空格,这可能不是你想要的,我更希望用下划线代替空格。
所以如果我们这样做,那就是如何替换所有这些。但让我先把这些列设置回它们之前的样子,我喜欢小写字母。所以我将把它们改回小写。到目前为止我们看到的所有内容都适用于我们的每一列。
但如果我们只想更改某些列呢?在这种情况下,我们可以使用重命名方法,并传入一个我们想要更改的列的字典。所以如果我想把名字和姓氏恢复到之前的样子,我可以说Df进行重命名。
现在我们可以传入列,并传入我们想要的字典。键将是旧值。所以我将把名字恢复为first。值将是该列名的新值。所以我们将名字映射为first,然后将姓氏映射为last。我只需要将其作为值放入,现在如果我运行这个。
这可能看起来像是成功了,但如果我查看我的数据框,那么这些更改实际上并没有生效。这是另一种方法,如果我们确实想让更改生效,我们必须说in place等于true,因为它只会让我们看到如果成功的话会是什么样子。
但实际上它不会改变。所以说in place等于true将使该更改生效。因此,现在如果我再次运行这个,那么我们可以看到那些列名被设置回原来的样子。好吧,这就是更新我们列的快速查看。现在让我们看看如何更新我们行中的数据。
我们将在视频的大部分时间里学习如何更新我们行中的数据,因为这里还有更多我们可以做的事情。所以首先,让我们看看如何更新一个单一的值。现在,在之前的视频中,我们看到如何使用lo和i Lo查找值,我们也将以此作为设置值的起点。
所以让我们抓取John Doe的这一行,它是行号2。让我们抓取这一行并将姓氏改为Smith。为了抓取这一行,我们可以简单地用索引标签2来抓取,所以我们可以说Df do lo of2。如果我运行这个,那么我们可以看到我们得到了这一行,名字是John,姓氏是Doe。
如果你想使用像我们在上一个视频中看到的条件来抓取那一行,那也是完全可能的。你可以这样做。现在,我们可以说,😊,Saaiid,你知道的。如果我们想作为一个条件,可以给我第一名为John且姓氏为Doe的行。那么现在,为了更新这些信息,我们可以有几种方法来做到这一点。
我们可以通过传入一个列表来传入所有的新值。因此,我可以说这一行我想设置为,并传入所有的新值。我会说我想保持John不变,我想让他的姓氏等于Smith,然后我们也来改变一下他的电子邮件。
所以John Smith的电子邮件是email co。所以如果我运行这个,然后我们查看我们的数据框,我们可以看到,现在最后一行有了新的姓氏和新的电子邮件地址。那么如果我们有很多列,但只想改变几个值会怎么样?想象一下,我们的调查数据有85个不同的列,所以如果我们想改变一行的单个列,而必须传入这个庞大的列表,那会很麻烦。
有85个不同的值。知道仅仅为了改变那几个值需要传入整个列表真的很糟糕。所以在这种情况下,我们可以仅使用Lo指定确切的列。同样,我们在学习如何使用lo过滤数据时见过这个。所以如果我只想改变姓氏和电子邮件,那么首先。
让我们抓取那些特定的值。我可以说Df do Lo,然后我可以传入2作为行。如果你记得,我们还可以将一个列表作为我们想要的列的第二个值传入。所以我会说,我想要姓氏和电子邮件。所以如果我运行这个,那么我们可以看到,我们只得到了姓氏和电子邮件。
现在我们也可以用上面使用的相同方法来更改这个。但我们不需要传入那些保持不变的值。所以我不需要再传入那个John的值,因为我们不再更改它。我们就把它改回Doe,以确保这有效。So John。Doe在email do com。
所以现在如果我运行这个,它应该完成赋值。现在如果我查看我们的数据框。我们可以看到那些已经被恢复。所以现在我们有John Doe和John Doe在email dot com。好吧,最后,让我们看看如何更改一个单一值。你可能能够猜到这怎么做。但我们可以做的就是传入一行中的一个列,并只更改那个值。
我们不需要传入一个列表。所以只需更改那个值。我会把这一行复制到这里。但现在我不想要这些列的列表。我们就改一下姓氏吧。所以这不再是一个列表了。现在我只是说我想要最后一列的行。我们就把它设置为Smith。哎,我得把那个放进字符串里。
如果我运行这个。那么我们查看我们的数据框。我们可以看到它只更改了那一个值。现在Pandas确实有另一个索引器叫at。这是专门用于更改或查找单一值的。老实说,我大多数时间都使用dot lo,但如果你需要的话,选项是存在的。我认为这是出于性能考虑。所以如果我想把这个改回来。
由于这只是一个单一值。那么我可以选择使用dot at,而不是dot lo。所以我在这里做同样的赋值。并且我会把它改回dough。但这次我会说dot at。我们就把它设置回去。如果我查看theta frame,那么我们可以看到这也有效。
我必须诚实地说,我得查看文档。我不太确定为什么我们在只需要获取或设置单一值时会使用dot at,而不是dot lo。也许是出于性能原因。但我个人发现即使对于单一值,我也常常使用lo和i Lo。我实际上在Pandas文档中查过,但上面只是说它存在。
这和dot Lo很相似。它并没有提供任何实际的理由说明为什么我们会使用它。但我想让你知道它是可用的,因为它显然是有原因的,并且还没有被弃用。好吧,现在让我给你展示一个非常常见的错误。那就是人们试图在不使用这些索引器的情况下更改一个值,而没有使用dot Lo或dot at。
让我给你展示一下这个错误或警告会是什么样子。假设我们有一个大的数据框,我们想找到这个John Doeper并将他的姓氏更改为Smith。我们可以使用过滤器来获取那个特定的行。所以我会下来到底部,在这里创建一个过滤器。
我会说数据框的邮箱列。等于等于 john.doe@email.com。这是我们要找的过滤条件。所以如果我把这个过滤条件应用到我的数据框中。就像这样直接传递到括号里。那么我们在上一个视频中看到,哎呀。这是过滤器,而不是 filter,因为 filter 是 Python 的内置关键字。
所以如果我把那个过滤变量直接传递到括号中。再次重申。我们在上一个视频中看到过。如果我运行这个,那么我们可以看到这对于查找这些值是有效的。所以实际上返回了一个只有一行的数据框。所以我们可以通过访问返回的数据框中的姓列来获取那个姓。
所以如果我运行这个,那么这也有效,我们可以看到我们得到了那个值。最后,你可能会认为为了将这个姓改为史密斯,我们可以直接上来这样说,好的。我们得到了那个值。现在我想把它设置为史密斯。所以如果我运行这个。
然后你可以看到这里弹出了一个大警告,如果我们看看这个警告。它说我们得到了这个带有复制警告的设置,所以我们得到了一个警告。但实际上,它并没有对我们的数据框进行更改。让我们看看我们的数据框。好的,我们尝试把那个姓改成史密斯,我知道我们在这些姓之间反复讨论过。
但那确实是这样。然后我们试着把它改成史密斯,但那并没有成功。所以当我们以这种方式进行赋值时,它并没有进行更改。现在,这里之所以不成功有点复杂。本质上是因为我们这样做的方式需要在后台进行多个操作,这会决定 pandas 返回我们的数据框的视图还是副本。所以当我们的值没有被设置时,是因为它被设置在一个临时对象上,而这个对象在之后立即被丢弃。
pandas 在解释这个特定警告方面做得更好,他们在警告本身中有一个小链接,直接指向文档。所以如果你想了解更多关于这个的内容,你可以点击那个警告或访问这个链接,它会详细解释。
但这个故事的核心是,当你设置值时,只需使用 dot loc 或我们已经看到的 dot indexers,你就不会遇到任何问题。因此我们可以在顶部重新运行相同的操作,实际上让我复制一下,这样如果有人想在我完成后查看这个笔记本,我会把它放在那里,如果人们想看到这个确切的错误,那么我会把那个单元留下来。所以我们可以重新运行这个确切的操作,但不直接使用这些括号,我可以说 df.loc。
然后我想将这些过滤器应用到我的行上,并且我还想抓取。姓氏列。所以如果我这样运行,然后查看我们的数据框。我们可以看到那个更改确实生效了。所以我们能够应用那个过滤器,然后在数据框中将姓氏设置为 Smith。如果你遇到这样的警告。
所以一定不要忽视它们,因为你知道,在这种情况下。它甚至没有设置我们认为我们要设置的值。所以你真的需要对这种情况小心。好的。这就是我们如何更新单行数据。那么我们如何更新多行数据呢?
嗯,我们有几种不同的方法可以做到这一点。因此,对于我们的第一个示例。我们假设我们想要更改所有的电子邮件地址,使它们都是小写的。这可能是你想要做的事情,以便使电子邮件地址更容易搜索。因此,为此,我们可以直接将那一列分配为它自己的小写值。所以首先。
让我抓取那些小写值,做到这一点,我们可以直接说 D F。然后我们可以访问。😊,那个电子邮件列。接着这将返回一个序列。然后我们可以在这个序列上使用这个 dot STr 类,并在那个字符串类上使用 lower 方法。所以如果我运行这个,那么我们可以看到返回的是所有这些电子邮件的小写版本。
如果我查看原始数据框中的内容。那么这些内容有混合的大小写。而现在这些都是小写的。现在,这只是返回这些电子邮件的小写值。它并没有实际进行更改。现在,为了进行更改。我们可以简单地将那一列分配为这个值。因此,我可以在这里说 Df email 等于 Df email dot string dot lowercase。
如果我运行这个,然后查看我们的数据框。现在那些更改确实生效了,我们的所有电子邮件现在都是小写的。这是我们一次性更改多行的一个方法。也许。我们想做一些更高级的事情。因此,我们可以通过几种方法来做到这一点,我们将逐一讨论所有四种流行的方法。
很多人对这四种方法感到困惑,所以我们逐一讨论每一种,并试着详细解释它们。人们会感到困惑确实是有原因的,因为它们在功能上非常相似。我将要讨论的四种方法是 apply、map、apply map 和 replace,让我正确拼写一下 replace。所以首先,让我们看一下 apply。apply 用于对我们的值调用一个函数,它可以在数据框或系列对象上工作,对于这两种不同的对象,其行为可能会与你预期的有所不同。
所以首先,让我们看看 apply 是如何在一个系列中工作的。所以当我们在一个系列上使用它时,它可以将一个函数应用于我们系列中的每个值。例如,假设我想查看我们所有电子邮件地址的长度。也许我们有一个网站,我们想确保没有电子邮件地址过长或类似的东西。
所以我可以通过做一些类似的事情,将 LN 长度函数应用到我们系列中的每个值。我可以说 Df 并访问那个电子邮件列,然后我可以说点 apply L。所以我们将应用这个 L 函数。当我运行它时,我们可以看到它在这里做的事情是,它在说,好的,第一行电子邮件地址的 L 值是 23。
所以我从未实际计算过我的电子邮件地址中的字符数,但它告诉我是 23。然后这个说是 17。然后它说这个也是 17。所以这是一个快速的方法,我们可以使用 apply 获取一些关于我们数据的信息。我们也可以用它来更新值。因此在这个例子中。
我只是想创建一个简单的函数来返回我们的电子邮件的大写版本,但这个函数可以复杂得多。所以让我在这里写一个简单的函数,做我想要做的事情。所以我会说,我们就叫这个函数更新电子邮件,它将接受一个电子邮件值,然后我只会返回那个电子邮件的大写版本。
所以电子邮件 dot upper,让我运行这个。现在再次,这只是一个超级基础的例子,如果我真的想将电子邮件地址转换为大写,那么我只需做我们之前将其转换为小写时所做的相同事情,但我只是把这作为一个例子。
所以当我们应用函数时,通常是为了进行一些比我们在这里所做的更高级的更新,但让我们将这个函数应用到我们的电子邮件列。为了做到这一点,我们可以说 Df 并访问那个电子邮件列 dot apply,然后我们可以传入那个更新电子邮件的函数。
我们刚刚写的函数现在我们不想执行这个函数。所以你不想在这里放括号。你只想传入函数而不带括号,这样我们传入的是函数本身,而不是其执行版本。
所以让我运行这个单元,我们可以看到现在我们得到了一个电子邮件地址大写的系列。现在如果这实际上并没有改变我们的值或像之前那样改变我们的行。那么为了做到这一点,我们可以将其分配给我们的列。所以我可以把我们在这里写的内容,然后我可以将那个系列设置为应用了那个函数的系列。所以如果我运行它,然后我们查看我们的数据框。
然后我们可以看到,现在我们的电子邮件地址都是大写的。现在再次,这只是一个相当简单的函数。我们所做的就是返回这个电子邮件 dot upper。现在,对于像这样的简单函数,你可能会看到人们使用 lambda 函数。如果你对 Lambda 函数不熟悉,基本上。
它们是匿名函数,可以有特定名称或没有特定名称,我们可以用来做这样的事情。那么在这个例子中它会是这样的。所以假设我想把这些转换回小写。所以我可以做的是,我将抓住这个。现在我要在这里传入一个 lambda 函数进行 dot apply,而不是传入我们写的那个其他函数。
所以我会说 Lambda。如果你不熟悉 lambda 函数。那么语法在这里可能会有点奇怪。但基本上我们这里有一个无名函数,然后我们想要返回的内容。所以我想返回 X dot lower 的那个传入的参数。如果我运行它,然后再查看我们的数据框。
然后现在我们可以看到我们的电子邮件的小写版本。所以如果你更喜欢写常规函数,那么你可以这样做。但如果你习惯写 lambda 函数,而你的函数不太复杂。那么你总是可以像我们在这里做的那样来做。现在我们正在处理字符串。
但是你也可以将其用于数字,我们可以运行任何我们想要的计算。好的,这就是 apply 在系列对象上的工作方式。所以现在让我们看看 apply 在数据上的工作。到目前为止,我们只使用这个与系列。每当我们像这样访问一列时。它返回一个系列。再次,当我们在系列上运行 apply 时。
它对该系列中的所有值运行了一个函数。现在,当我们在数据框上运行 apply 时。它对该数据框的每一行或列运行一个函数。让我们看看这是什么样子的,它应该更有意义。所以让我抓住上面我们运行 L 函数的例子。
让我复制这个并粘贴到这里。然后我们将看看在数据框中这是什么样子的。所以再次,这给我们的每个值在那个电子邮件系列中的长度。所以你可能会认为你可以对整个数据框运行这个相同的 apply 方法,它会给我们数据框中每个值的长度。但实际上并不是这样。所以让我们看看这会给我们什么。
所以, instead of 访问特定的列。我们就说 Df dot apply。并传入那个 L 函数。如果我运行这个,那么我们会得到一个你可能意想不到的响应。所以这里发生的事情是,它并没有将长度函数应用于数据框中的每个值。它实际上是将长度函数应用于数据框中的每个系列。
特别是列。所以基本上这告诉我们,名字列的长度是三。所以如果我们在上面查看,我们可以看到名字有三个值。告诉我们姓氏有三个值,电子邮件也有三个值。所以这只是每列中的行数。如果我们手动检查其中一个的长度,我们也可以得到相同的结果。
所以如果我说 Ly 并访问这些列之一,然后运行这个。我们可以看到,这给我们带来了三。所以这基本上是 apply 在数据框上所做的事情,但它是针对每一列的。如果你更改轴的话,也可以将其应用于行。因此,我们可以在这里更改轴并说不。
我想在行上做这个,哎,我放错了,应该放行。我运行这个时又犯了一个错误,实际上不需要放行,行是默认的。我本来想放列。所以如果我放列的话,我们现在也可以看到结果是三。但现在它的计算方式是这样的。
所以它说,好的,行 0 有三个值,但它说,好的。这些值是 Cory Schffer,然后是电子邮件,它没有向下计算。所以基本上,我们希望使用在整个数据框上使用 apply 时,对序列对象有意义的函数。例如,假设我们想从每一列中抓取最小值。那么。
序列对象有一个最小值方法。所以我们可以将其传入 apply,以查看每个序列的最小值。现在,在我们的示例数据框中,我们有所有字符串值。所以如果我们从字符串序列中抓取最小值,它只会返回按字母顺序排列的第一个。
那么我们来看一下这会是什么样子。我们可以到这里,并说 Df.dot.apply。现在让我传入那个序列最小值方法。所以我可以说 Pd 是我们导入的熊猫,Pd.dot.series.do.min。运行这个后,我们可以看到,好的,它说在第一个类别中按字母顺序排列的第一个是 Cory,姓氏中排在首位的是 do。所以这就是。
这是 D,这两个是 E,这很合理。然后我的电子邮件在这两个电子邮件之前。现在,可能用一系列数字数据来看看会更好,因为对于数字数据,这些东西显然更有意义。所以如果我们在数字数据上使用序列的最小值。
然后这显然会给出每个数字的最小值,我们也可以使用 lambda 函数。但你只需记住,lambda 将在序列对象上工作。所以如果我到这里,可以说 Df.dot.apply。现在让我们传入一个 lambda。现在,这里的 X。这个 X 将是一个序列,而不是一个值。那么,序列有哪些方法呢?
嗯,序列有一个最小值方法。所以让我们返回最小值并运行它。我们可以看到这给出了与上面这个相同的响应。现在,就像我说的,这算是一个人为的例子,因为我们可以通过使用数据框的最小值方法得到相同的结果。但我只是想指出这实际上是怎么工作的。
当数据框包含数值数据时,这更加有用。例如,我们可以使用 nupy 对所有系列对象应用平方根或任何类型的数值分析。好的,在系列上运行 apply 将一个函数应用于系列中的每个值。在数据框上运行 apply,就像我们在这里做的那样。
它对数据框中的每个系列应用一个函数。但你可能会想,是否有办法将函数应用于数据框中的每个单独元素。这就是 apply map 的用途,apply map 仅适用于数据框,系列对象没有 apply map 方法。让我给你展示一下这有什么不同。
让我们使用那个内置的长度函数,并将其传入 apply map。我将说 Df.dot.apply map。现在让我们传入那个内置的长度函数。如果我运行这个,那么我们可以看到这将长度函数应用于我们数据框中的每个单独值。因此,名字有这些字符。我的名字是 Cory。所以 C O R E Y。
那是五个字符。然后是 Jane 和 John。那是四个字符。我们之前看过电子邮件的长度是 231717。这就是它在这里的作用。它对数据框中的每个元素应用那个函数。所以这可能是你们一些人预期的 apply 方法在数据框上的工作方式。
但我们改用 apply map。现在我知道这可能有点令人困惑,但希望在看到这些差异后,何时使用哪个会更有意义。因此,例如,由于我们在这个示例中有一个充满字符串的完整数据框,如果我想让它们都变为小写,那么我可以这样做,我可以说 Df.do.apply map,然后我只需传入字符串的 do lower 方法。
所以如果我运行这个,那么我们可以看到现在数据框中的所有值都是小写。如果你的数据框中有数值数据,那么你会在这里遇到错误,因为你无法对数字运行字符串方法,所以你需要传入一个处理得当的更复杂的函数。现在我们已经了解了 apply 和 apply map,希望这些对你更有意义。
现在让我们来看看映射方法。映射方法仅适用于系列。因此,映射用于将每个值和系列替换为另一个值。例如,假设我们想替换几个名字。我可以说 Df 并访问那个名字列,它也是一个系列,然后我可以在此上使用映射方法。
现在我将传入我们想要替换的值的字典。假设我想将 Cory 替换为 Chris,而将 Jane 替换为 Mary。如果我运行这个,那么我们可以看到它返回了一个系列,其中这些名字被替换掉了。
所以科里是这里的第一个值。现在是克里斯,简现在是玛丽。现在我想指出的一点是,我们所替换的值被转换为N N值,而不是数字值。现在这可能是我们想要的,也可能不是。我会在查看一些真实的Stack Overflow示例时展示这个。
在这个例子中,我们可能不想去掉这些其他名字。所以你可能在想,好吧,如果我想保留约翰,但只是替换这些其他名字怎么办?如果是这样的话,那么我们可以使用替换方法,而不是使用映射。
我将把这个复制粘贴到这里,而不是使用映射,我可以使用替换。如果我运行这个,那么我们现在可以看到结果基本上是完全相同的,除了现在我们没有将约翰替换为N A N值。再说一遍,我们在这里所做的所有操作并没有实际改变数据框。
如果我们想将其设置为实际的列,那么我们需要做一些这样的事情。我们可以说Df的第一列等于数据框的替换版本。所以如果我运行这个,然后查看我们的整个数据框,那么现在我们可以看到这些值被替换了。好的。
现在我们已经看了很多更新行和列中信息的不同方法。接下来,让我们转到更大的数据集,看看如何在实际案例中应用我们在这里学到的东西。让我看看我的Stack Overflow调查数据。因此,我们在这里打开了我们的Stack Overflow调查笔记本。
在这个系列中我们一直在使用的。而且,如果你想下载这些笔记本或Stack Overflow数据以便跟随,那么所有这些链接都在下面的描述部分。好的,那么我们来将我们在这里学到的一些内容应用到这些数据上。在上一个视频中,我们讨论了过滤。我们查看了过滤超过某个金额的薪资。
工资的列名在这里某处。这是这个。Con comp。现在,我假设这是“转换补偿”的缩写,并且它是转换为美元的。所以假设我们想把这个列重命名为更清晰的名称。那么,我将把这个列重命名为salary USD,而不是converted comp。
如果我们还记得视频早些时候的内容,我们可以使用重命名方法。所以如果我下移到这里,我可以说Df.dot rename,然后我们只需传入我们想要重命名的列。所以我会在这里传入一个字典,但这只会有一个值。所以我们想要更改converted comp。
我们想将其设置为,我称之为salary USD
。所以如果我运行这个。让我去看看这是否看起来不错。好的,这看起来不错。那已经改变了。现在在你确保它进行了你想要的更改之后,并且这不是一个错误。然后我们可以通过将in place
设置为true
来实际应用到我们的数据框中。
这就是为什么在in place
等于true
时实际上是个好主意,因为有时你知道,当你在使用pandas时,我们总是在做不同类型的重命名和过滤,有时我们会做错事。因此,检查并确保你所做的更改是你想要的总是更好,然后再将更改应用到数据框中,以便真正巩固这些更改。现在让我们看看我们是否可以访问salary USD
列。如果我查看它。
然后我们可以看到这个数据框中确实有一个salary USD
列,所以那个更改是有效的。那么我们还可以做些什么来查看我们已经学到的内容呢?这里有一个例子。在这一系列中我们已经查看过这个hobbyist列几次。
这是一个人们在调查中回答的列,询问他们是否在空闲时间将编码作为爱好。让我们快速看看这一列。我们在这里可以看到一些是、是、否的值。让我实际在这里打印出来。因此,我将访问那个hobbyist列。
我们可以看到这里有一堆是和否的值。所以假设我们想要转换这些值,将所有的是响应映射为一个真正的布尔值,而否映射为假。那我们该怎么做呢?一种方法是使用我们刚学到的map方法。我们可以这样说。😊,D F hobbyist dot map。
然后在这里传入一个我们想要进行替换的字典。因此,对于是的值,我将其转换为布尔值true
。对于否的值,我将其转换为布尔值false
。所以如果我运行这个,然后如果我们比较一下。我们在这里得到的结果和我们在这里得到的结果。
我们可以看到所有的“是”都映射为true
,所有的“否”都映射为false
。现在,我不认为实际上有一个in place
参数用于map。因此,我们可以做的是将那个序列设置为映射后的版本。现在。
如果我运行这个并查看我们的数据框,现在我们可以看到整列现在是布尔值,而不是是、否的值。现在,记住,当我们使用map时,任何不在我们字典中的内容。所以任何不属于是或否的回答都会被转换为NaN
值。我认为在这项调查中还有其他列包含是。
没有和不确定的回答或者类似的东西。所以如果我们只想替换“是”或“否”的值,而保留其他值不变。那么我们可以使用替换方法。不过在这个例子中,使用映射也是可以的,因为我知道这一列只有“是”和“否”。好的,这是对我们在这个视频中所学内容的快速回顾。
我不打算再详细讲解一次,因为这个视频已经有点长了。但我确实想给你展示一些如何更新值的例子,以及这些如何应用于像这样的实际数据,比如这个调查。所以在我们结束之前,我想提到我们为这个视频找到了一个赞助商,而这个赞助商就是brilliant.org。
在这个系列中,我们一直在学习pandas以及如何在Python中分析数据,而Brilliant将是补充你在这里所学的内容的绝佳方式,他们提供一些出色的动手课程,有一些出色的课程和教训,深入探讨如何正确思考和分析数据的基础知识。
我真的推荐查看他们的统计课程,教你如何分析图表并确定数据的显著性。我也推荐他们的机器学习课程,它将数据分析提升到一个新水平,讲述了允许机器做出决策的技术,当变量过多时人类无法考虑。因此,为了支持我的频道并了解更多关于Brilliant的信息,你可以访问brilliant.org/cs进行注册。
此外,前200位访问该链接的人将获得年费高级订阅的20%折扣。你可以在下面的描述部分找到该链接。再次强调,访问brilliant.org/cs。好的,我想这就是本次pandas视频的全部内容。我希望你能对如何更新行和列中的信息有一个好的了解。
我们一开始比较简单,只是在特定位置进行更改,然后在学习apply map和apply时变得更高级。现在,我知道这些对某些人来说可能会有点困惑。但希望你能理解它们的工作原理。现在,最初。
我本来还打算在这个视频中展示如何添加和删除行和列。但这个视频有点长了。所以我会把这个内容留到下一个视频。在下一个视频中,我们将学习如何从数据框中添加和删除行和列。这应该会是一个更短的视频。不过,如果有人对我们在这个视频中讨论的内容有任何问题。
如果你有任何问题,请随时在下方评论区提问,我会尽力回答。并且如果你喜欢这些教程并想要支持它们,最简单的方法就是给视频点赞并表示支持。将这些视频分享给任何你认为会觉得有用的人,也是非常有帮助的。
如果😊,你可以通过Patreon进行支持,相关页面的链接在下方的描述部分。请确保订阅以获取未来的视频。感谢大家的观看。
用Python和Numpy实现最热门的12个机器学习算法,彻底搞清楚它们的工作原理!<实战教程系列> - P4:L4- 逻辑回归 - ShowMeAI - BV1wS4y1f7z1
逻辑回归。当然,我们再次使用nump。让我们导入Nmpy S N P。然后我们创建一个名为Lo regression的类。这将有一个初始化方法。所以我们有一个初始化。初始化与线性回归完全相同。我会在这里放入一些学习率,它将得到一个默认值。因此是0。
001通常学习率非常小,并且还会得到一个迭代次数。因此its和默认值为1000。这将决定我们用于梯度下降的迭代次数。然后我将存储它们。因此我会说self L R等于L R和self。然后its等于its。然后,我将简单地创建一些权重,但一开始将它们设置为none。因此我们的权重是none。
而我们的偏差是none,简单地说我们现在需要想出它们。然后我们定义一个拟合方法。因此这里我们再次遵循心理学习库的约定。这将需要一些训练样本和标签。因此这将涉及训练步骤和梯度下降。然后我们有一个预测方法。
在这里我们获得新的测试样本,想要预测这些是我们想要实现的方法。我们的输入在这里。因此x是一个大小为M乘n的nuy N D向量,其中M是样本数量,n是每个样本的特征数量。而y是一个大小为M的10向量。因此,对于每个训练样本,我们有一个向量。所以。
现在我们可以继续。所以首先,我们必须初始化我们的权重。让我们假设我们想要初始化参数。为此,我们获得样本数量和特征数量。所以这是x的形状,这将把第一个维度展开为样本数量,第二个维度为特征数量。然后,我们初始化我们的。嗯。权重。只用0。因此,我们创建一个仅包含大小为0的零向量。
特征数量。我们一开始将偏差设置为0。例如,你也可以使用随机数进行初始化,但0就很好。在此之后。我们使用我之前提到的梯度下降。因此我们迭代地更新我们的权重。我们使用一个for循环。因此假设4 I。实际上,我们不需要这个。因此对于下划线在范围内。
然后是self dot和its。因此,这是我们想要的迭代次数。现在让我们再看一下公式。
所以首先,我们用这个函数近似我们的y。因此首先。让我们应用这个线性模型,然后应用sigmoid函数。
所以,假设。模型等于这是w乘以x加上B。因此我们可以使用nuy dot函数来乘以我们的向量。将x与self dot weights相乘,加上self dot bias。然后,我们应用sigmoid函数,所以让我们创建一些帮助或方法,一些私有方法,sigmoid。获取一些X。嗯。所以,在这里。这是胸部。
如果你看看公式1除以1加上负x的指数函数。
因此,我们可以将其写成一行,返回1除以1加上N P点积。或者我们给它加上括号,1加上N P点积X。然后,减去x。这就是我们所需的全部。现在我们在这里应用sigmoid函数。因此,我们说预测的y等于self.dot。Sek可能减去。然后我们的线性模型。
这就是我们对y的近似。然后我们需要更新我们的权重。
所以,我们看看更新规则。我们首先计算这两个公式的导数。假设。
DW等于,且这是1除以n。然后求和。
两倍于x乘以预测的y减去实际y的差。
因此,我们有1。除以我们已经在这里得到的样本数量。然后乘以。接着我们有了。产品,然后对这个产品进行求和。这没有别的,还是向量的点积。因此,我们可以使用numpy.dot。但现在我们必须小心。现在我们想要沿着其他维度进行操作。
所以我们必须使用X的转置。然后将其与预测的y和实际的y进行点积。所以请自己检查点积。因此,这就是相对于W的导数,而相对于偏差的导数是相同的。
但没有X。因此这只是一个和。顺便说一下。我省略了2,因为这只是一个可以省略的缩放因子。因此,这是1除以n。然后这个差值的和。
所以,我们说D B等于样本数量的倒数。然后乘以N P点积和。然后这里我们简单地有预测的y减去实际的y,所以。这就是我们的导数。然后我们更新我们的参数。因此,我们说self.dot.weights减去等于self.dot.learning rate乘以导数,对于偏差也是如此。所以减去等于self.dot.learning rate乘以导数。
这就是我们的拟合方法的全部。这是梯度下降。现在让我们实现预测方法。因此,这里我们做了与这里相同的事情。因此。我们首先用线性模型来近似我们的数据,然后应用sigmoid函数来获得概率。
现在,我们想要的就是判断,如果是类别1或类别0。因此,我们查看这个函数。如果它大于0.5,那么就是类别1。如果它小于,就属于类别0。
比如说,我们预测的类别。这是对于多个样本的等式。然后我们使用列表推导,如果我们的值大于0.5,则结果为1,否则为0。然后我们对每个概率进行此操作。现在我们得到了0和1,然后我们就返回这个。也就是返回预测的类别。
这就是我们需要的完整实现。现在我们可以测试它了。因此,我已经写了一个小的测试脚本,使用心理学习模块加载一些测试数据。这是乳腺癌数据集。你可以在网上搜索一下。这是一个流行的二分类问题。然后我会将数据分为训练样本和测试样本。
然后我将创建一些逻辑回归模型,从我们刚刚在这里实现的类中提取,并拟合我们的训练数据和训练标签。然后我将进行预测,并预测测试数据的标签。接着我计算准确率。看有多少标签被正确分配。
如果你看过关于K和N算法的视频,那么你已经见过这个。现在让我们运行它。所以,在这里。出现了意外的关键字参数学习率。嗯。哦,抱歉。我将其称为L R。这是迭代次数。让我们再次运行它。然后我们看到我们的准确率是0.92,或者几乎93%的测试数据被正确分配。
所以我们看到它运行得很好。希望你喜欢这个教程,下次见,再见!
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P1:1)介绍 - ShowMeAI - BV14g411F7f9
欢迎来到另一个项目数据科学教程。这次,我们学习Maplotlib,Python中的基础数据可视化库。许多其他流行的Python数据可视化库都是建立在Maplotlib之上的,比如Seaborn就是一个立刻想起来的例子。
这就是为什么从Maplotlib开始是一个很好的选择。即使你还想学习其他库,Maplotlib也是一个非常强大的库,你想做的任何事情都可以做到,所以。😊在项目数据科学这里,我们相信你通过实践学习效果最佳。
这就是为什么我们所有的教程都是动手实践的。我们逐步引导你完成所有内容,但你绝对应该自己跟着做。所以如果你还不在电脑前,快去电脑前,准备好进行编码。好了,让我们走过今天你将学习的内容,我们将做什么。
第一步,我们将使用Conda创建一个虚拟环境,如果你还没有安装Python或者没有安装Maplotlib。这是我们将帮助你安装的地方。如果你不想在你的电脑上安装它,我们还会向你展示如何使用Google Colab,这是一种很好的入门选择。
我们将下载并加载一些示例数据到我们的Jupyter Notebook中,接下来的时间我们会在这个Jupyter Notebook中度过,以便让你轻松学习Maplotlib。😊!
然后我们将通过一些不同的部分。我尽量将其逻辑地分解给你。所以第一部分,我们将讨论Mapplotlib图形的基本组成部分。这对新手来说可能会有些困惑,所以我会在这里花一点时间。
帮助你理解图表的不同部分。第二部分,我们将进入一些基本图形,比如折线图、条形图、散点图等。😊第三部分,我们将看看如何在同一坐标轴上绘制多个图形,所以在同一图表上,实际上非常简单。
这非常简单,比如如果你想同时做散点图和折线图。第四部分,我们将看看如何添加和更改文本,比如标题、访问标签等。第五部分,我们将研究如何使用子图。什么是子图?它意味着在不同的小图表区域绘制多个图形。
所以我们将讨论如何做到这一点。而实际上,很多内容会在第6节中提到。因此,我们将在第1至第5节中覆盖基础知识。而第6节将涵盖一些初学者在使用map plotlib时常见的问题。我们也会讨论一些可能在开始时让你困惑的常见用例。
最后,第7节。我不想在视频结束时不给你一些未来学习的机会、资源和一些想法来实现这些目标。所以我们开始吧。😊。
绘图必备 Matplotlib,Python 数据可视化工具包!150 分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P5:5)Matplotlib 图形的组成部分 - ShowMeAI - BV14g411F7f9
运行这个。现在,我将在这里创建一个新的 Markdown 单元,添加一个新的一级标题,我将标注为第一部分。Matplotlib 的组成部分。为了开始,我想在这里明确一点,这样我们可以准确看到我们在绘制的内容。所以我将说 x,让我们创建一些数据来绘制。因此我将说 x 等于。
我将在这里创建一个列表:-3,-2,-1,0,1,2,3。我们也可以用 Python 的 range 函数来做到这一点,这完全没问题。并且我将导入 Numpy,作为 np,因为 Matplotlib 通常期望一个 numpy 数组,如果你之前没有太多使用 numpy,那么你会知道。
你可以基本上把它想象成一个列表或一个矩阵。因此,你可以有一个一维数组,这只是一个列表,或者你可以有一个二维数组,更像是一个有行和列的矩阵,你还可以有三维数组等等。
我将创建 x 等于 np.array,从 -3 到 3。现在,让我们为 y 创建 x 的平方。因此,我们只是在这里做一个简单的 x 和 y 的平方。查看 x,我们有我们的数组,从 -3 到 3。如果查看 y,我们只是将每个数字平方。因此,9,4,1,0,1,4,9,等等。
要在 Matplotlib 中创建一个图,这是我推荐的基本公式。你在刚开始时总是使用这个,虽然还有其他方法,但我们现在不谈那些。我们只是给你一个可以用于绘图的公式。
我建议你现在总是这样做。因此,首先你要说 fig 和 x 等于 PLT。subplots。然后你将在这里写下所有的绘图代码。所以在这里写下你的绘图代码。你知道,点点点,这就是你实际想要绘制的内容。
最后,执行 PLT.show。
这是公式。这是你的绘图公式。因此,我在这里创建一个小的三级标题,标注为你的绘图公式。
好吧。所以我们要做的是我们将说 fig x,这代表图形,而 aes,不是 ais,而是 aes。这有点令人困惑,我们稍后会讨论。fig x 等于 PLT.subplots。我们将做 PLT。how,现在我们要绘制的代码是 x.plot,x 和 y。
好的,来吧。我们的第一个mapte plot Lib图表。美丽吧,真的。实际上有点颠簸,实际上有点丑。但只需这些小代码,我们就能生成图表。这很酷。从这里开始,我们将逐层添加复杂性。😊。
但这是绘图和mapplotlib的基础。你总是要实例化你的图形和轴。除非你要保存文件,而不是在这里显示它,否则你总是要以Ptl.show结束。然后在中间,这就是你要进行所有绘图的地方。你可以有。
你知道,你可以在这里绘制一条线,或者你可以绘制100条线进行各种疯狂的格式化。所以这是告诉你这些术语实际上意味着什么的好地方。为此,我们将去便捷的Matt plot Lib。
图形的部分。图形的解剖结构。让我们看看。来吧。这正是我想要查看的。
所以这就是matte plot lib图表或map plotlib图形。如果你理解这是什么,这将帮助你进行绘图。让我们谈谈这里的主要部分。图形,图形。所以你知道,这个圆圈指向看起来像空白的地方。这是因为图形,maplalib图形就是整个图表。
所以你的图表多复杂都无所谓。无论这里有多少条不同的线和不同的点,你甚至可以在这里有很多不同的小图表。整体称为图形。现在,在图形旁边,你会注意到aes。A X,E,aes。这就是我们可能认为的图表本身。
所以图形是你将放置所有图表的地方。然后a Cs将成为图本身,带有x轴和y轴,以及一些线和点和所有这些东西。
为了让这个更清楚一点。我们再过来看看。我现在要给你展示一个单一图形的样子。一个带有两个轴的单一图形。所以subpls。在这种情况下,我将做一行两个列的轴。我稍后会解释这一点。
好吧。所以,现在我们有一个单一的图形。图形就像这里的这个图像。你看我怎么点击并拖动这个图像。这个就像一个你可以在这里下载的单一图像文件。整个就是你的图形。现在,你的轴,A X,E,S。这将是这个图表。所以这个图表就是一个轴。
这里的图是另一个坐标轴。因此我们有两个坐标轴。这就是我在这里创建的。我创建了一个,这是我想要的坐标轴的行数。还有两个,这是我想要的坐标轴的列数。然后我对每一个坐标轴进行了绘图。这就是上面的原因。
我们有一个坐标轴。我们在这个单一的坐标轴上绘制了X和Y。因此,x与y,负3,负2,负1。这就是你的x,然后是0。
到0,1,4,9等等。这就是你的y。
所以下面,我们仍然有一个单一的图形,但现在有两个坐标轴。好的。现在,在每个坐标轴中,这是非常令人困惑的。它们可能可以在命名上做得更好。
你有你的x轴和y轴。这可能是我们通常认为的一个轴。然后对于每个坐标轴,你可以有一个坐标轴标签,有坐标刻度标记,坐标轴上有网格线。然后上面的y轴也是如此。然后你有实际的绘图,所以你可以有一个线图。
你可以为散点图设置标记。在我们的例子中,在这里。
我们有X ses1,它有自己的X轴和Y轴。也许为了更清楚,让我们在第二个上绘制x的三次方。所以x的三次方现在将在这个坐标轴上。因此你会看到每个都有自己的x轴,x轴和自己的y轴。每个都有自己的线,自己的线对象在这里。这一切都被封装在一个单一的图形中。好的。
所以我希望这对你有所帮助。我们首先创建图形,然后创建坐标轴,接着在坐标轴上绘图,最后,无论何时完成所有的绘图,我们展示它,展示图表。好的,希望这对你来说有点清楚,至少我认为人们诚实地使用Matplotlib多年而从未查看过这里的图形,看看所有不同的部分。
所以请记住,这个图表,整个图形被称为一个图,在每个图中,你可以有多个坐标轴,这就是你实际进行绘图的地方。
每个坐标轴都有一个x轴和一个y轴,然后这就是你进行线图和散点图的地方,等等。为了真正强调这一点。
所以,我要在这里复制这个,而不是制作一个一行两列的子图。我将制作一个两行两列的子图。让我们先绘制这个。在我们对坐标轴本身进行任何绘图之前,先展示一下。所以我要在这里创建一个注释,创建一个图,包含四个坐标轴。嗯,2。
让我们看看。两行两列的图表。在每个。行。
好了,我们来了。你会看到我们有一个单独的图形。所以如果我想拖动这个,你知道的。你会发现这看起来就像一个单独的图像。我们有四个不同的坐标轴。我们有一个两行两列的坐标轴网格。每一个坐标轴都有它自己的 x 轴和 y 轴。我们可以在这些坐标轴上绘制任何我们想要的东西。
在这种情况下返回的坐标轴,由于我们有一个两行两列的网格,实际上也是一个二维数组,用于绘图。所以为了绘图。我会在这里使用二维索引,向你展示我们该如何做。
可以在这些图形上绘制东西。所以我在零行、零列上绘制东西。所以这个,然后第一行和第一列,这个在这里。我们也可以在。0,1 和 1,0 上绘制东西。顺便说一下,我做的所有这些。让我们。也许做一个 x 的四次方。你觉得像是。
像是 x 的对数或者类似的东西。让我们,试试这个。好的,我们。我们必须在对数中除以 0。
让我们来做。让我们做一个指数函数。也许可以这样。
所以你看,我们现在有四个不同的图形。在四个不同的坐标轴上。它们都在一个单独的图形内。所以。所有东西都在一个单独的。图形内。好吧。我真的想强调这一点,因为你在 Matplotlib 中做的其他一切。将依赖于你理解这些坐标轴对象以及你在这些坐标轴对象上绘图的事实。
如果你想绘制。某些,你知道的,两个图像并排。好吧。你现在明白这些是在一个单一图形上的两个不同坐标轴。如果你想在相同的坐标轴上绘制两个不同的图形,嗯,现在,你知道。即使我们还没有这样做,你可能会在想,好的。
我知道我会使用相同的坐标轴来进行绘图。这其实是我们马上要进行的内容。所以在我们继续之前。我想在这里给你展示最后一件事。那就是。你可能会注意到这些图形相当不平滑,对吧,你在想,哦。
嗯,这看起来不是一个很美的抛物线。它有点不平滑,所有图形都会这么丑吗?答案是,不。答案是这些图形之所以不平滑,是因为我们给 Matplotlib 绘图的只是这些点。所以,为了让这一点变得非常清晰。
我将介绍一些我们尚未查看的东西。这就是散点图。这就是散点图。因此,使用散点图,你现在可以真正看到,因为我们只定义了x和y点。记住,我们只定义了x和y点x。和y总共4,7个数据点。因此我们在负值中有3个。我们有0,然后在正值中有3个。
所以这就是为什么我们有这么少的数据点。然后当你用一条线连接这些点时。
好吧,那么你最终得到的是一种看起来有点碎的图。因此,为了展示这一点。让我们看看需要什么来创建一条平滑的线,而要创建一条平滑的线。我将使用nuy。
nuy方法或者对象,这里是一个范围。如果你从未使用过范围,你可以用我最喜欢的Python技巧之一,这里是问号来获取文档。
所以N P点a范围,这里是操作,这里是文档字符串。你给它一个开始,你给它一个停止,然后你给它一个步长,然后它返回。
在给定区间内均匀分布的值。
所以开始数字,停止数字,以及数值之间的间隔。因此,比如说。创建一个从负5到5的范围。并让它们之间的间隔为0.01。如果我运行这个。你会看到,哇,很多值。这真是很多值。这是多少值呢?
好吧,那是1000个值。完美。因此让我们把这个作为我们的X。现在让我们做和之前一样的事情。Y等于x平方。
现在。如果我们绘制。
x与y,就像我们之前做的那样。现在,你看,我们有一张非常平滑的图。那是为什么呢?好吧。那是因为。
这是因为,如果我们绘制。
散点图,再次是x与Y。你看,每一个都是一个点。因此,我们现在有1000个数据点在这里定义这张图,而不是可怜的7个。
这可能是让人困惑的事情,尤其是当人们第一次开始使用Matplotlib时。你知道的,他们会想,嘿,为什么我的图看起来是这样的。好吧,那是因为这个。那是因为你传递了多少点。你传递给matplotlib要求它绘制的点。因此在这个例子中。我们只传递了7个点。在这个例子中,我们传递了1000个点。
我们得到这张非常美丽的图。其实,我来给你展示一下。😊。
让我给你展示一下。让我们创建一个原因。让我们创建一个 Y 阻尼。阻尼振荡,我拼写为 oscillation。我认为那是 ocill。Leicn。你总是忘记你的拼写和这样的事情。阻尼振荡。所以我只是因为这很有趣而这样做,而且它很美丽。所以我将快速向你展示一个好看的。😊,美丽的图形是怎样的。
所以我们做 E 的负 x 次方乘以 N 点 pi,随便吧。你不必了解这些。顺便说一句,这只是为了好玩。所以我们增加我们的 y。现在让我们做 fig Ax 等于 Pl T 点子图。让我们做 AX 点 Plate。X 对 Y,阻尼振荡。PL D 点 show。看看这个,难道不是很美吗,难道不是很好吗。
我们这里有 1000 个数据点,帮助展示这个图形。这就是为什么它看起来如此美丽和平滑。😊。
好吧。介绍够了。我希望你对 map plot Lib 图形的组成部分有了更好的了解。我将把这个复制到章节标题下。
就作为一个小参考,让我们保存我们的 Jupiter 笔记本,然后继续。
绘图必备 Matplotlib,Python 数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P16:16)设置 y 轴上下界 - ShowMeAI - BV14g411F7f9
要做到这一点。好吧,下一个是我常用的一个。那么如何设置 y 轴限制,每当你有一个普通图表时。
像这样。
Mat Ploot Live 只是尝试确定你想要什么样的 y 轴,有时有效,有时无效。
我们可以这样做。如果你执行 A X dot set,然后我们就尝试设置 Y Li。就这样。
所以为什么 La,你可以传入底部,可以传入顶部,这里还有一些其他选项。但我通常喜欢的用法是。
你只需说。A X dot set Y Li,然后传入最小值和最大值。所以也许我们想看看从 0 到 150。就这样。这张图从 0 到 150 是这样的。或者也许我们想看看,从负 100 到 100。看看它是这样的。所以你可以使用这个 set y lamb。
收缩或扩展你的 Y 轴。
绘图必备 Matplotlib,Python 数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P25:25)在 Matplotlib 中显示图像 - ShowMeAI - BV14g411F7f9
还有不同的颜色。好的,剩下两个问题。我把两个很酷的留到最后。所以我们要讨论图像,也要讨论颜色。那么我如何在 Matplotlib 中显示一张图像呢?这是一个很常见的需求,特别是在神经网络和深度学习中。
如果你正在处理图像数据,可能想在 Jupyter Notebook 中查看一些数据样本。所以让我们找一张我喜欢的,我觉得很美的图像。我将从 Unsplash 获取一张图。Unsplash 上有很多漂亮的照片,你可以下载。它们都有摄影师的署名。
如果你想的话,可以访问这张照片,它的 URL 在这里,这个看起来很奇怪的 URL。或者你也可以在 Unsplash 上找到你自己的照片。这都没问题。让我们继续免费下载。感谢 Unsplash 上的 Yuri M LC N 与我们分享你的作品。我们只会用它一会儿。好吧,继续吧。关闭这个。
让我们回到这里。实际上,让我们去我们的终端。我们需要移动我们的文件。让我们看看从下载文件夹下载的图像文件。所以如果我输入 ls
,在家目录后面加上 ~
,然后再输入 downloads
,你会看到我们刚刚下载的 Jpeg 文件。
所以让我们将从下载文件夹中的 M V 移动到我当前所在的文件夹。如果我再输入一下 ls
,你会看到我刚刚把那个图像移动过来了,完美。😊。
那么如何在 Matplotlib 中显示图像呢?如果你看看,这将使用 P L T 模块。PL T.dot。I am for image。read,I am read。所以如果我们读取图像,我们有一张图像,它是一个 Jpeg。让我们在这里读取我们的图像,我们就叫它,嗯,就叫它 image。哦。😔,好吧。
所以看起来没有安装 Pillow 的话,我们只能使用 P 和 G 文件。但如果我们在这里安装 Pillow,那么我们可以处理更多的图像。所以让我们去。实际上,我会向你展示如何在 Jupyter Notebook 中做到这一点。你甚至不需要离开 Jupyter Notebook。假设我们要使用 P。
我们的 Pip 将来自我们的可视环境。让我们执行 pip install pillow
。试试看。这样简单吗?非常快。所以我会删除这个单元格。再试着读取一次。好吧,这次我们成功地读取了图像,因为我们已经安装了 Pillow。那么这个图像的类型是什么呢?
这里是对象。好吧,这是一个numpy数组。所以如果你已经有一个想要读取的图像文件,你可以使用plt.imread
,这会将其转换为numpy数组。如果你已经有一个存储图像的numpy数组,那你就可以开始了。让我们看看。让我们看看这里的图像数据。好的。
你可以看到我们有一些嵌套的方括号。这将是一个多维数组。让我们看看形状。让我们看看形状。所以这里我们有图像的一个维度。我们还有图像的另一个维度,你会看到我们的第三个维度。
这将是我们的RGB值。这基本上就是图像的颜色。所以让我们来展示如何绘制它。我们做一个普通的模板。正常的公式。plt.subplots
。然后plt.show
。在这种情况下,我们将使用一个特殊的方法,叫做plt.imshow
。我们将传入我们的图像。看看这个。
它有点小,并且有x轴和y轴。但这就是我们的图像。挺不错的,我觉得这很酷,所以😊,我要关闭坐标轴。我还将指定一个更大的图形大小。现在,在这种情况下。我想要与原始图像相同的尺寸,我会说image.shape[0]
。然后。
由于这个数字很大,也许我会把它除以300。图像的shape为1。将其除以300。好了。我们得到了一个更大的图像,y轴和x轴被关闭了。这就是如何显示图像。现在,我想快速向你展示一些其他很酷的技巧。
这就是如何使用matplotlib
仅显示一个RGB通道。所以让我们回到这里。复制这个,下来。所以现在不绘制整个图像。让我们绘制所有像素的R通道,所有列的像素。但我们只绘制第一个RGB通道。我觉得这。
这可能是R通道,红色通道。让我们看看这会给我们带来什么。哇,看看这个。所以这会默认添加一个颜色映射。这实际上只是单值像素,所以你可以把它看作是一种黑白图像。
然而matplotlib
选择为它添加默认的颜色映射。那么,如果我们实际上想把它看作灰度图像呢?好吧,这就是这个很棒的C map参数再次派上用场。我们说cmap='gray'
。现在我们有了这个不错的灰度图像。记住。
这只是使用单通道,我相信是红色通道。所以让我们试试另一个通道。在这里,你可以进入一些,非常酷的图像分析内容。😊这是图像的不同通道。你可以看到,基于原始颜色,你可以看到很多不同的细节。因此,特别是。
注意。注意这里。左上角非常黑暗。然后在这里,你肯定有更多的灯光,更多的光线。而在这第一张图片中,这里的土地比第二张图片亮得多。😊所以,这就是你如何开始使用 Mapllib 进行一些酷炫的图像分析。你可以,嗯。
这只是一个 nuy 数组。😊你可以随意编辑它。你可以将其输入卷积神经网络。你知道,做一些。做一些机器学习,进行一些深度学习。并使用地图绘制你的结果。
绘图必备 Matplotlib,Python 数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P4:4)启动 Jupyter notebook 并设置我们的 notebook - ShowMeAI - BV14g411F7f9
现在我将要做的是,我在我的 Maplot Lib 教程文件夹中。我要运行 Jupyter notebook,然后,我们将继续进行其余的 Maplotlib 教程。
在我们的 Jupyter notebook 中。那么让我们关闭这个其他的 Chrome 窗口吧。
这是我们的 Jupyter notebook 界面。我将打开一个新的 Python 3 笔记本。我们在这里命名为 Maplot Lib 教程。这样就可以开始了。我们要做的第一件事是创建一个 markdown 单元,通过输入字母 M。然后我将进入这里,创建一个标题 1,并说,设置笔记本。😊
在笔记本中,当我使用 Maplot Lib 进行数据可视化时,我喜欢做的第一件事就是这样。百分号,mapplot Lib。内联。所以。我们在这里不需要花太多时间,但本质上,你可以用不同的方式在 Maplotlib 中运行数据可视化。
在 Jupyter notebooks 中,Maplotlib 的内联将是你最受欢迎、最常用的选择之一。我会把它设置为笔记本中的第一个单元,然后基本上忘掉它。让我们更深入地探讨一些实际的数据可视化,因为关于 Mapplot Lib,你会很快发现,有这么多强大的功能,可能会让人感到不知所措,并且有这么多选项,也会让人感到非常困惑。
我将尝试为你提供一些我们可以做的最简单的内容。然后我们会逐步增加复杂性,但我确实希望你限制一开始要考虑的内容。因此,让我们开始吧。导入 Matplotlib。我们将使用的主要绘图子模块是 Pyplot。
Matplotlib 还有各种其他子模块,你可以通过按下 tab 键查看所有这些不同的子模块。这里有很多东西。但无论如何,我们使用 Pyplot,并将其导入为 PLT。这将是你几乎总是导入 Matplotlib 的方式。
那么让我们继续吧。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P10:10)Matplotlib中的常见问题 - ShowMeAI - BV14g411F7f9
好的,现在我们要进入最后一个部分。这是一个相对较长的部分,因为我们要讨论第六部分。第六部分,之所以这样,是因为当我们谈论常见的map plot lib问题时,有很多这样的情况,因为我们已经带你了解了基础知识。
现在你已经拥有了进行数据处理和基本绘图所需的所有信息。一些基本的折线图,你知道的柱状图、散点图等。此外,还可以设置标题、X轴和Y轴标签,以及进行多个图的绘制。你掌握了这些知识,但是。
通常,当人们进行绘图时,他们想要实现一些特定的目标。而且有很多不同的特定可视化方式和常见的可视化修改方法,通常人们都想做这些,你可能也想做。所以这个常见问题部分将介绍你可能想要在绘图中实现的许多常见功能,首先从。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P11:11)改变图形大小 - ShowMeAI - BV14g411F7f9
我们如何改变图形大小。
我们如何改变图形大小?这是一个问题。而且,我们会回到我们的正常X数据。
这是我们的原因。阻尼振荡数据在这里只是为了保持一致性。实际上,我将设置y等于y阻尼振荡,以便我们可以在这里为所有这些不同的图进行X和y的绘图。
这就是我们之前做的事情。让我们从正常的模板开始。PL T.dot subpls A X.dot plot X和Y,然后我们会做PL T.dot show运行这个。好的。那么我们如何改变这个图的大小。
嗯,我们可以在这里做到这一点,每当我们创建图形和坐标轴时。我们只需传入fig size。fig size。就像是你在指定一种水果的大小,但其实不是。这是这里图形的大小。然后你可以传入你想要的任何值。那么我们传入10,10。
看吧,我们得到了一个漂亮的大方形图。如果我们传入,比如说,12和8。你会看到第一个数字控制宽度。图像的宽度。然后第二个数字控制图像的高度。这就是你改变图形大小的方法。让我们这样做。
让我们把这个稍微缩小一点。我们去6和4。
我们实际上非常接近原始图像的大小。那么我们试试8和6。好的。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P12:12)将图像保存到文件 - ShowMeAI - BV14g411F7f9
继续我们的下一个问题。我们如何将图像保存到文件中?
我们如何将图像保存到文件中呢?你可以在 Jupyter Notes 中右键单击这里,然后选择“另存为图像”,如果只是偶尔做一次,这是一种非常简单的方法。但是,如果你想使用 Matplotlib 将其保存到文件中。我们再来画一个基本图。
我将移除图形大小。所以,不是要在最后调用 plt.show,而是让我们使用 plt。我要点击 Tab 键,看看这里所有的选项。我将开始输入 save fig。好了。那我们实际上来看看文档。使用我们方便的问号。
Jupyter Notes 中的问号语法。所以我们可以保存图形,然后它只需要作为和关键字参数。因此,你知道,参数,关键字参数。基本上我们可以传入任何内容。好的,这是调用签名。所以文件名,我们可以传入 DPI,如果我们想的话。我们可以传入方向等各种不同的内容。
但我们主要想看的内容是文件名。所以,如果格式未设置,则输出格式从文件名的扩展名推断出来。所以在这种情况下,假设我们想将其保存为 PG,我们可以说 my_plot.PG,它将保存为 PNG,因为 Matplotlib 看到扩展名并知道将文件保存为 PNG 文件。让我们继续运行这个,你会看到它实际上也会弹出来。
但让我们回到终端。
让我们做一个小的 LS。看,这就是我的 plot.png,让我们打开我的 plot.png。
这里就是那个图像。看看。然后如果我们,把它放大,你可以看到它确实会变得有点模糊。这就是 DPI 参数可以派上用场的地方。但我们已经将图像保存到文件中了。就这样。
我将快速保存这个笔记本,确保在进行过程中保存,以免丢失你的工作。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P13:13)更改标题、轴标签和刻度标签的字体大小 - ShowMeAI - BV14g411F7f9
好的。那我们下一题。如何改变字体大小。标题、轴标签和刻度标签。
好的,让我们看看这个。所以我们得到了正常的。
公式就在这里。我将移除图形大小。好的,我们要绘制。所以首先,让我们设置标题和访问标签。我会做 A X dot 设置标题。记住。我们可以说,阻尼。振荡。我们可以做 A X dot 设置。Y 标签。我们可以称之为,现在就叫它 Y 标签。
Y 标签和 A x dot 设置 X 标签。我们就称之为 X 标签。
好的,我们这样做,你会看到 Mapllib 前进并放置了标题 X 标签,Y 标签。但是它们是默认字体,这里有很多不同的方式。你可以在这里直接传入一些字体参数。所以如果我们设 font size 等于 20,比如说。然后就这样。
现在我们的标题更大了。我们也可以传入。字体大小。让我们设为 15。对于这些标签。这样,你可以看到我们的 X 和 Y 标签现在不同了。然后对于我们的 tick 标签,这将稍有不同。通常你可以遵循这个 tick 标签的公式。
我们要做一些不同的事情。那就是使用 A X。我会在这里出来。A X dot。如果你开始输入 T,然后按 Tab,这个 tick 参数 Ramms 在这里。所以我开始输入 tick。
Tick 参数。让我们看一下这个。所以 tick 参数改变了刻度的外观、刻度标签和网格线,你告诉它要应用到哪个轴。所以。
在这种情况下,我们可以说 A X dot tick。Pms。让我们说轴等于两个。让我们把它应用到两个轴。在这种情况下,它实际上将是标签大小。我们可以设定 s 为 10。只是为了给你展示它的工作,先设为 30。好的,这样大得太过了,设为 7。所以现在它们比较小了。
我只想提醒你,文档将是你最好的朋友。所以以文本为例,以下是你可以传入的不同内容。我们传入字体大小用于标题和 X 及 Y 标签。我们也可以传入颜色,快让我快速展示一下。
我们可以传入 color 等于红色或其他颜色。
然后如果我们简单地谷歌一下,知道,Mapl Lib tick。Pamms。这将带你到这个文档页面。
也许你可以找到更多的信息。你可以找到一些例子。你可以在这里看到这个示例的用法。这个文档将对你非常有帮助,还有你可以找到的文档。
在 Jupyter 笔记本中,只需使用问号,大多数,甚至可以说所有,实际上。这些内容的在线文档都可以在这里找到。这个用法给了你一个很好的例子。所以记住,如果你有问题,咨询文档,因为这里有很多不同的做法。
我将把这个作为参考提供给你。
现在我们不打算深入探讨,因为这可能是另一个完整的对话。
但是。
这是你的,RC 参数 Ram 的概念。基本上,这就是说,你知道,这将设置你的。这将为不同对象设置各种参数。
在 mappllib 中为你的整个图形或整个 Jupyter 笔记本会话。你可以将这些参数默认值存储在外部文件中并加载它们。这样你就不必每次都这样做。因此,你不必不断地指定你想要什么字体和什么大小等等。
所以,举个例子,这里有一个字体字典,包含我们想要的各种参数。我们希望字体家族是等宽字体。我们希望字体是粗体。大小要更大,这样有点搞笑。然后你基本上会说,我想将这些参数应用于所有字体对象。这就是你该怎么做。
所以,如果你有兴趣了解更多关于如何设置这些默认值以及如何创建自己的 mappllib 参数文件的信息。
那么一定要进一步研究一下。我们今天不打算讨论这个,但我会在这里提供这个链接以供进一步研究。顺便提一下,你可以在视频资源之外找到所有这些链接。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P14:14)fig.add_subplot(111) 是什么意思 - ShowMeAI - BV14g411F7f9
好的,继续。那么一个非常常见的问题。非常常见的问题。这是我们实际上没有的。Y。😔,这种方法是这样的。但是你可能会看到像这样,究竟是什么意思。嗯。你可能会看到 Fig dot add subplot,像 1,1,1 这样的。
那么究竟是什么意思呢?好吧,让我们尝试一下,看看会发生什么。所以我们将做 fig x 等于,好吧,实际上。是的,是的。我们这样做。所以 PLT dot subpls。然后 Fig dot add subplot 11,1。让我们试一下,PLT do show。
所以这样会更清晰。如果我们去掉坐标轴。让我们先创建一个图形。所以 fig 等于 PLT dot fig your。但是我们一开始不创建坐标轴,我也不会使用这个 add subplot!
所以,只需创建一个图形,然后使用 PLT。你会看到这里有一个图形,但没有坐标轴,记住坐标轴是实际绘制图形的地方。
所以我们没有任何可以进行绘图的东西。如果你有一个图形并且想向其中添加坐标轴,这就是这个 add subplot 命令的用武之地。所以现在如果我将 A x 设置为这个,然后我们运行它。
你会看到现在我们有了一个坐标轴。如果,你知道,为了更明确一点,让我们打印一个 X,你会看到这是一个坐标轴子图类型。我们甚至可以打印这个对象的类型。这是类型为 mapplot Lib 的 axes,subplots,axy subplot。所以基本上,add subplot 的作用是为图形添加一个坐标轴。这就是第一步。
这就是这里的第一步。所以我会说,你知道,首先。
Fig dot add subplot。将坐标轴添加到现有的。
图形。那么关于这个 111 代表什么的问题?我承认这是非常令人困惑的。让我们看看子图的文档。
再一次,这有点不太有帮助,我们只有这些作为奇点。但是让我们看看调用签名。这是有用信息的地方。所以 add subplot。
看起来你有不同的选项来使用 add subplot 方法。确实如此。所以你可以调用的第一种方式是你想要多少行,多少列,然后这个图的索引是什么。让我们快速使用一下。所以想象一下我说。我想要。
我想要两行。我想要三列。这将位于索引编号,假设索引编号为2。所以很难看清。好吧,让我们。创建一个基本坐标轴来处理。首先,我们将在这里做 dot.subplots,然后在其上创建第二个坐标轴。
所以,希望这有点道理。我们基本上是在创建我们的第一个坐标轴,也就是这个图。而且添加子图。我们想象我们正在创建两个行和三列的子图。
我们将仅在索引编号2处创建一个坐标轴。假设我们想更清楚地演示这一点。我们还要添加,假设是坐标轴编号3。我们将在索引1,2,3处添加它,假设添加到4。所以我们将在这个左下角添加它。就这样。
所以添加子图基本上是一种说法,嘿,我有一个图。我想在上面创建一个坐标轴。我希望它在这个特定位置出现。并且我希望它看起来好像在两行、三列等中。所以这就是我们在这里使用它的方式之一。回到文档中。
你会看到我们也可以仅传入 pose 或 X,来看看它们是什么。
所以 POS pose 位置。是一个三位整数,第一位是行数,第二位是列数,第三位是索引。这就是我认为这有点令人困惑的原因,因为你基本上可以使用这些方法。
只需将它们压缩,没有逗号。这正是同样的事情。所以我们在说,嘿。我想创建子图,好像有两行和三列。我想在索引2处创建一个坐标轴。我们运行这个,得到完全相同的结果。如果你看到类似 Fig.add_subplot, 111。这到底是什么意思。
好吧。让我们回去。只创建我们的图。Figure。
好的。所以 fig.dot.add_subplot。
subpl 1,1,1。这是说我想要一行。我想要一列。然后我想在这个东西的索引1处创建一个坐标轴。所以这基本上是说我想要一个图,没什么太复杂的。
实际上,这与不带参数的调用是完全相同的。所以我认为这一切对我个人来说可能相当混乱。每当你有选项在一开始创建子图时。
每当这样对你有意义时,我会说就这样做。就这样做。然后你会得到你那里的坐标轴对象列表。然后你可以以那种方式单独操作它们。如果你真的喜欢这种方式,那很好。但请知道,这种操作有很多不同的方法。
我知道这可能会变得非常混乱。所以尝试选择一种方法并坚持下去。我建议你,如果可以的话,我建议你开始时就坚持这个方法。顺便说一下,正如我们可以在其他坐标轴上绘图一样,我将做A X
等于fig.dot.add_subpl
。
A X.dot.plots
。让我们做X
和Y
。让我们再创建一个。A X 2
等于fig.dot.add_subplots
。让我们创建两行,三列。这次我们做index3
。然后A X 2.dot.plot X
。Wai
。😔。好了,我们得到了我们的主要图表,就是我们创建的第一个图表;还有我们的次要图表,就是我们创建的第二个图表。
好吧,让我们继续。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P15:15)更改 x 轴上的刻度频率 - ShowMeAI - BV14g411F7f9
另一个常见问题是。这一项,我该如何更改刻度频率,刻度频率。在 X 或 Y 轴上。
好的,让我们回到我们正常的做法,子图。子图将绘制 A X 点图 X 和 Y,然后我们将使用 PL T dot show。
所以你会看到当前的 X 刻度基本上只是 Maplotlibb 认为应该去的地方。有时候这样会有效,有时候我们想要改变它。所以如果我们上到这里去 AX dot。我会按 Tab,看看我们得到了什么,然后我开始输入 set。
你可以看到我们可以设置的所有内容,向下滚动,你会看到设置 X 刻度。这是我们想要的。
如果你想的话,我们可以查看文档。所以我们基本上只是传入刻度。然后我们只需传入一个 X 轴的刻度位置列表。让我们试试,假设。
假设我们想要。
取负值位置。假设我们将这个从偶数改为。假设负 5,负 3,负 1。我们还会加上 0,然后是 1,3,5。让我们看看会发生什么。就这样。我们已经将 X 刻度从偶数改为奇数,包括 0。如果我们想的话,可以省略一些刻度标签,你知道的,去掉 3。
就这样,也许这就是你出于某种原因想要呈现的方式。你甚至可以做一些,比如说,加上负 10 出于某种原因。
然后,你知道,便是如此。因此,你现在扩展了图表的左侧,并在那添加了一个 X 刻度标签。这就是如此简单。如果你想的话,你可以用这个做各种不同的模式和东西。但这就是你。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P17:17)去除刻度和刻度标签 - ShowMeAI - BV14g411F7f9
好吧,接下来的两个,我觉得挺酷的,因为它们是一种通过去除不想要的东西来清理图表的好方法。所以我有时也会用这些。那么,我们怎么去除刻度和刻度标签呢?😊
那我们来绘制这个图表。
在这种情况下,我们将回到设置 X 刻度的方法,并设置 Y 刻度,设置 X 刻度。
我们只是传递一个空列表。所以,基本上我们在说,你知道的。嘿,我们不想应用任何 X 刻度标签。Y 也可以这样做。
我们可以让这个图表完全没有上下文,老实说,这并不是很有帮助。但它看起来确实干净漂亮,不是吗?
嗯,你知道,如果你出于任何原因想这样做,那就来吧。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P18:18)怎么关掉轴 - ShowMeAI - BV14g411F7f9
看,关于这个。你如何移除轴线、网格等。
假设我们想要移除这些边缘的线条。那么,先展示一下我们正常的图形。删除。然后如果你进到AX去设置。
然后设置轴,设置轴,设置轴为关闭状态。我们来试一下,看看会发生什么,设置。
关闭轴。看,周围没有轴线。
顺便说一下,我们这里没有任何网格线,但如果有的话,这也会影响网格线。所以我们实际上快速展示一下,如果我们对AX调用网格并传入true。
我们在刻度标记处得到了这个漂亮的网格。现在如果我们设置轴为关闭。这不仅关闭了图形周围的对齐,还关闭了那些网格标记。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P19:19)旋转轴刻度标签文本 - ShowMeAI - BV14g411F7f9
好的,下一个问题继续进行。这是一个非常常见的问题。
如何旋转轴文本?这并不是我们真正需要用到的,因为我们的轴文本看起来很好,但很多时候。
你可能有非常长的标签,它们都相互重叠,导致你无法看清任何内容,因此你会想,嗯,我需要旋转这些标签,这样我才能看到它们。
所以我会给你展示如何旋转你的 X 轴刻度标签。我们将回到我们的朋友 tick parameters 方法。所以 A X dot plot,X,Y。PL T dot show。
好的,让我们旋转这些 X 轴标签。我们将回到 Ax 的 tick parameters。如果你查看文档,或者你记得,你可以记得我们可以传入想要操作的轴,然后我们可以传入任何可以应用于这些标签的参数。
所以我要传入参数 rotation 等于,让我们试试 45。
好了,现在它们已经很好地旋转了。如果这些标签非常长,它们就不会相互重叠。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P2:2)创建项目目录并下载数据 - ShowMeAI - BV14g411F7f9
开始。
首先,我要打开一个终端,我要创建一个新的。让我把这个终端拖到这里。我将创建一个新的目录供我们在这个项目中使用。这就是我喜欢开始新项目的方式。让我在这里执行一下LS,看看我的主目录。你会看到我有一个名为项目数据科学的文件夹。
我将继续在这里更改,如果我执行LS。你会看到。这是我们在网上录制的其他课程和其他视频的目录。我将创建一个新的目录。我们称之为mat plot Lib。😊。我们称之为mappl Lib教程。就叫这个吧。
所以我会进入Maplot Lib教程目录。如果我执行LS,你会看到这里什么都没有,因为我们还没有在这里创建任何内容。我们只是创建了这个目录。所以,看起来不错。现在,我们将使用在这个教程中创建的一些数据。
但我们还将使用一点关于心脏病的数据。从kle这里取一点数据。所以我将打开一个新的Chrome窗口。让我把这个Chrome窗口拖到这里。如果你去kggle心脏病。让我们看看。我们有心脏病数据集。我们有预测心脏病。让我们去这里,预测。
心脏病。实际上,如果我们点击这个心脏病UI链接。这是我们想要的。所以Caggle.com/RonyTF R O N I TF,然后是heart disease U I。我会确保发布这个链接,以便你能获取到它。但这是我们将下载数据的地方。这是关于心脏病的数据。
我们可以看看这里的描述。这个数据库包含76个属性,但这个数据的已发布实验仅使用了14个属性,而这14个就是我们将在这个数据集中使用的。特别是,克利夫兰数据库是迄今为止唯一被机器学习研究人员使用的。
等等,这个数据集最初来自UCI。UCI机器学习库。如果你来这里。你会看到这些是一些非常受欢迎的机器学习数据集。我们将使用这个心脏病的数据集,但我们将从Cagle获取它。
所以,让我们。上去这里。点击这个下载按钮。如果你没有Cagle账户,你可能需要创建一个。我将点击这个下载的zip文件。它打开了这个heart.dot CSV。我会迅速重命名它,正好是这个zip文件的名字,实际上是heart disease U C I。
现在,为了向你展示如何在终端中做到这一点。我将回到我们的目录,我们的MaplotlibB教程。如果我们去项目数据科学和Maplotlib教程,你会看到就在这里。我将从我们的下载中移动heart diseasease UCci.csv。
我将把这一点移到目录,也就是说这个目录,所以我稍微做一下ls
,以显示我们在这里有我们的heartdisease UCci.csv文件。O。所以现在,如果我再检查一下我们的CSV文件确实在这里。我会双击这个。我们可以在Excel中快速打开它,只是看看它的样子。
好吧,这里是一堆数字。看到这里有一堆数字,我们的列标题在顶部。所以我们有这个人的年龄,性别。这些是0和1,原始的Caal数据集在这里给出了映射。所以1代表男性,0代表女性。然后我们还有其他一些数值列。
这就是我们将在一些教程中绘制的内容。
所以回来这里,让我们关闭这个,然后继续关闭。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P20:20)更改散点图标记大小 - ShowMeAI - BV14g411F7f9
好吧,我们越来越接近结尾了。不过还有几个问题要处理。所以让我们继续进行散点图标记大小。或者让我们把这个变成一个问题。你如何改变散点图。
标记大小。所以让我们看看我们的图表。在这种情况下,我们需要将其更改为。
散点图。看看这个。所以记住我们在这里绘制了大约 1000 个点。这就是你为什么看到这么多不同的点。
所以,关于大小。好吧,我们就看看 A X dot Sc。这是一个很好的习惯,顺便说一下。只需查看文档。检查一下参数。这会对你有很大帮助,真的很大帮助。好的,我们将关注这个 S 参数。😊
如果你查看下面的参数,S 是点的标记大小(平方)。好的,酷。让我们来 tink。看看会发生什么。你还可以传递一个数组,这样你就可以为每个传递一个形状。
每个点都有一个大小。但我们先通过传递 S 来开始。让我们试试 10。10 会怎样?10 让它变小。所以如果我们降低到 5。甚至降低到 1。看看这个。然后我们得到了这些非常小的小点。所以我们可以这样改变大小。如果我们想让大小随 X 变化呢?这里的 X 轴。随着我们的点有更大的 x 值。
也许它们会变大。我们试试看。
嘿,看看这个。所以它们一开始真的很小。实际上,我想我们这里有一个 0 的点,这可能是为什么这是不合法的值,导致平方根遇到问题。所以,嗯。我们可以试着给这个加一个非常小的值,比如 0.1。好了。这解决了。
所以你可以看到我们的大小一开始非常小,然后随着进展变得更大。所以这可以让你实现某种酷炫的效果。我不知道它们是否对你想要绘制的内容有用,但至少看起来挺酷。你知道,我们来做一下。让我们甚至做一下 X。😊,加上 1,我们乘以 10 或其他数字。
所以我们得到一个更大的效果。好了,或者我们可以传递 y,例如。看起来因为我们不能有负的大小。现在。我们只显示正 Y 的点。所以也许我们让这个 y 的绝对值。看起来很奇特。或者我们可以做。这个下降到大约负 100。所以我们可以做 y。
加上。百和5。好了。这有点大。所以,你知道。我们现在只是在尝试。这并不一定。好吧。所以你看,你有了你的大小选项。顺便说一下,这将是你在许多不同图表中进行操作的方式。而且,实际上,Python中还有一些其他的绘图库。
所以这就是我想展示给你的原因,你可以在这里传递一个数组作为大小。而且你也可以,颜色也可以做同样的事情。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P21:21)更改散点图的大小和颜色 - ShowMeAI - BV14g411F7f9
让我们实际上快速展示一下。这将是我们下一个问题。如何为每个点着色和调整大小。
好吧,你只需传入数组。你在这里只需传入数组。所以让我们取这个。我们将它放回这里。让我们得到我们的X。你知道的,我们将做X加上0.01或0.1,以避免遇到的整个错误。然后我们将其乘以10。然后我们也有这个C参数。得到了C参数。那么让我们试着传入这个。
我们试着把Y传入这个参数。
你会看到这里发生了一些有趣的事情。让我传入一个C映射值。这是一个颜色映射。这是让map plot Lib知道的一种方式。嘿,我想使用一个特定的颜色组。所以我们有一些冷、暖色调。
实际上这并没有做我预期的事情。我原本期望这些值会随着Y的变化而变化。我们来看一下A x点的散点图。
所以你可以传入size,可以传入C。C是一个颜色、一个序列或一个颜色序列。
好吧,看起来通过这些x值我能够修复它。如果你看看这里的x。我们降到负5。
如果我们把10加到x上,以确保所有的size都是正数,那么它看起来就像我们预期的那样工作。好吧,搞定了。所以这是每个点的着色,同时也根据每个点的大小进行处理。这可能对这个特定的图表没有太大帮助。但是假设你有,你知道的。
在散点图上有100个不同的点。你想根据一个属性为它们着色,并根据另一个属性调整它们的大小。这就是你会如何做的。正如我们刚刚学到的,确保你的所有大小都是正数,因为你不能有负的大小。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P22:22)使用对数轴绘图 - ShowMeAI - BV14g411F7f9
是的。
好吧,这是一个在某些数据科学问题中很有用的例子,这就是。你如何使用对数轴绘制?
所以,基本上,有时你可能会有一些值快速增长到非常大的数。这些值是指数增长的。你可能会有一个直方图,其中所有数据都聚集在一侧。所以这是几种不同的使用案例,你可能会对使用对数轴感兴趣。
所以我将把我这边的一些代码复制过来,所以。
我们的 X 指数将从 1 到 10,步长为 0.1。而我们的 y 值。所以我们将进行指数函数。所以 E 的 X 乘以 30。所以 E 的 X 乘以 30。现在,如果你绘制这个,你会看到一个像这样的图表。现在,这并不是特别有帮助,对吧,我们在这里。
它看起来非常接近 0,然后突然就飞速上升。但是你会看到我们这里的轴的刻度,我们的 y 轴实际上是什么,大约是 10 的 129 次方。所以这是一个巨大的数字。😊。事实是我们的 y 值在增长,它们在图表右侧增长得非常大,以至于这些值几乎无法在图上显示。
所以这并不是特别有帮助。那么我们怎么可能改变 Y 轴呢?让它成为对数轴。这是一个经典的例子,当你的某些值在与其他值有极大差异的范围时,你可能想使用对数轴。
所以在这种情况下,我们来到这里,我们的轴是 A X 点。在这个案例中,我们将使用这个 Y 轴刻度。
我们只需传入 log。
而且有一条美丽的直线,显示了 x 和 y 的对数之间的线性关系。所以对于这样的图表来说,这是一个不错的选择,让我把这个复制到这里,以便你可以参考。
对于这样的图表来说,这是一个不错的选择,正如我之前所说的。这对于你有很多值聚集在一侧的直方图也很有帮助。
所以,这是在数据科学中经常遇到的一种情况,因为你在查看不同类型的数据。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P23:23)在同一张图上绘制两个直方图 - ShowMeAI - BV14g411F7f9
是的。
好的,继续前进。如何在同一图表上绘制两个直方图是一个非常常见的问题。这是你应该掌握的技能。如何在同一图表上绘制两个直方图。
这是你应该掌握的技能,因为这是在同一坐标系上绘制两个图的经典例子。所以,让我们看看。
所以如果我们在这里绘制 X 和 Y。我们需要一些可以用的数据。
在直方图中绘图。我继续创建了几个正态分布。让我们把它们放进去。所以我正在创建正态分布。它们有特定的均值,特定的标准差。我正在创建1000个不同的数据点。如果我们对 disk 1 使用 Ax 点 hist。
让我们在这里创建这些。所以我们处理的是相同的数据,因为这将每次创建一个新的数据集。
这是我们的第一个直方图。
现在。你只需在同一坐标系上再绘制一个直方图。所以,这就好了。在同一图表中绘制两个直方图,使用相同的坐标系,就是这么简单。现在。每当我们遇到这样的情况,我会给你展示我另一个喜欢的技巧,就是使用这个 alpha 参数。Alpha 基本上控制透明度。
所以我们先在第二个图上实际使用 alpha。让我们把这个降到。😊,比如 0.7。如果我们把 alpha 降到 0.7,你现在可以看到我们可以透过橙色图看到蓝色图。如果我们对它们都使用 alpha。那我们得到的效果很不错,两者的颜色都有点柔和,我们可以看到两个图的分布。现在。
因为我觉得这很有帮助,我还会在这里添加标签。所以 dis1。Dis 2。然后记住,如果我们运行这个。
这没有任何作用,直到。Wei。
调用 A X 点 legend。这样,你就可以在同一图表上绘制两个直方图了。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P24:24)绘制水平线和垂直线 - ShowMeAI - BV14g411F7f9
好的,再来三个问题。这是一个马拉松,不是吗?那么,如何绘制水平和垂直线?你可能想为图表的某些地方绘制一些参考线。我们来看看。
让我们到这里来。我们来获取我们的模板。
我们将绘制一个A X dot图,X和Y。
好的,假设我们想在100的位置绘制一条水平线,在50和负50的位置再绘制一条水平线。然后我们还要在负4的位置绘制一条垂直线。我们该如何做到呢?好吧,这些可爱的A X dot H线函数和Ax dot V线函数。我们来看一下H线的文档。
所以你要传入。
一个x dot H线。所以你传入y,这是一个标量或一系列索引。这是绘制线条的y索引。所以我们想把它设置在负50和50。然后你还得传入x的最小值和最大值。你想要这条线从负4到0吗?你想让它跨越整个图表吗?
在这种情况下,我们希望它跨越整个图表。所以我实际上只想说,给我X数据的最小值,给我X数据的最大值。
就这样。所以我们从x的最小值到最大值。如果我们想让这个线条短一点,出于某种原因,我们可以让它从0到5,或者其他什么。好的,然后A X dot V线的情况也是如此。所以在这种情况下,我们只想。
一条在负4的位置。我们从y的最小值到最大值来绘制。就是这样。如果你想的话,可以传入颜色,比如传入颜色等于红色,或者你可以传入一个颜色列表,比如红色和蓝色。就是这样。所以现在我们用不同的颜色来为我们的线条上色。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P26:26)Matplotlib 可以使用的颜色 - ShowMeAI - BV14g411F7f9
Pt lib。好的。我们最后一个问题。那就是,我如何找到可用的颜色。
在 mappl lib 中。这是个好问题,因为这段时间,我们一直在做 C map 等于灰色,就像,你知道,颜色等于 R 和 B。或者你可以输入红色和蓝色。这可能会让人感到非常困惑。😊。
所以,从 mappl Lib。让我们导入颜色,我们要导入它。
作为 mappl Lib 颜色的 M 颜色在这里。
所以如果我们做 M 颜色,做一些文档。
你会看到。颜色模块。是一个将数字或颜色参数转换为 RGB 或 RGBA 的模块?
它还包括用于颜色规格的类中的函数。
如果我们做 M 种颜色点,然后按下 tabab。你会看到一些看起来像颜色列表的东西。所以让我们查看基本颜色。
看看这个。我们得到了我们的 B。我们得到了我们的 G。我们得到了我们的 R。K 在这里是黑色的。嗯。
如果你继续向下滚动,CSS4 颜色。所以。这是一个你可以使用的庞大颜色列表。你可以在 Maplotlib 中使用其中任何一种。如果我们一直滚动到最底部。你会看到我最喜欢的 XKCD 颜色之一。看看这个。这来自一部很棒的 XKCD 漫画。如果你还没有,赶快去谷歌一下。
XKCD 颜色。你会发现它在说什么。如果你去 C 名称。现在。这将是一个很大的标准颜色列表,在 matplot Lib 中。
其实在 stack overflow 上有个人做了一个非常好的不同颜色的可视化。我将把这个链接粘贴在这里,以便你可以查看。但这就是视频的最后一件事。最后一件事我们完成了。耶,我们完成了。我将向你展示这美丽的表示。😊,许多在 map plot lips 中命名的颜色。
所以让我们把这段代码复制过来。这是一段相当多的代码,这就是为什么。我不想为你敲出来。
看看这个。
所有这些颜色及其名称可以在 matte plot Li 中使用。我会说相当美丽。相当美丽。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P27:27)进一步学习,总结,致谢 - ShowMeAI - BV14g411F7f9
就这样,我们结束了。这是一场马拉松式的教程,信息量很大。如果你的大脑觉得无法承受所有内容,不要感到难过。我将给你留一点作业,章节编号。我们是不是到了第6节?这点重要吗?那我们就去看第6节吧。
现在我们到了第7节。实际上,第7节。这里有一些作业给你。如果你想继续学习mappl Lib,首先,获取自己的数据集来玩玩。哦,我们得把这个改成markdown单元。把它改成markdown单元。或者,实际上,咱们就用这个正在进行的吧。
所以,当你对自己正在做的事情感兴趣时,你会学得更好,因此获取你感兴趣的数据集,并尝试绘制一些图。这将是你学习的一个绝佳方式。我在这里想说,关于这一点的小补充是:用你的数据,尝试回顾我们做过的所有事情,这将有助于巩固你心中的许多知识。
接下来我建议你阅读一些map plot Live文档,我将指出这里两个特定的地方。第一个是map plot Lib教程,那些真的很好,可以帮助巩固我们刚刚学习的许多内容。
接下来是示例。查看一些示例以及生成这些示例的代码。最后,我推荐的事情是阅读关于P,LT风格的内容,或者说学习使用Mapplot Lib的状态基础风格。这是一种我们没有深入探讨的使用Mapplot Lib的方式。
我不一定推荐你使用这种风格。大多数时候,我认为我们一直以来的做法是我推荐的方式,但其他人会使用这个,你会看到使用这个的代码示例,所以至少了解一下这是什么是好的。就这样。
我想非常感谢你完成这个教程。我希望你学到了很多东西,并且能够将其应用到自己的数据科学工作中。如果你需要额外的数据科学教程,务必查看其他项目数据科学视频和课程,并留下评论。
让我们知道你想学习什么,我们会帮助你学习。好了,就是这样。祝数据科学家们学习愉快,我们下次见,再见。😊。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P3:3)使用 conda 虚拟环境(或 Google Colab)设置我们的 Python 环境 - ShowMeAI - BV14g411F7f9
现在我们进入需要设置Python环境的部分。我们需要Python。我们需要matplotlib。在这种情况下,我们需要pandas来读取数据。我们还需要Jupyter用于我们的Jupyter笔记本。所以有两种不同的选项。第一,我将使用Conda创建一个虚拟环境。
这里有个命令,如果你也想走这条路。我建议如果你还没有安装miniconda或Anaconda,去miniconda页面。Conda是一个用于Python的虚拟环境管理器和安装程序。因此我们将使用Conda来管理我们的虚拟环境,如果你不知道什么是虚拟环境,随意做一点研究。
但本质上,这只是一种最佳实践,将我们的Python编码环境打包到一个目录中,这样我们就不会搞乱我们的电脑等等。而且当我们尝试安装东西时,我们也不会有冲突的包。
所以如果你想走这条路,安装mini Conda,我们将把所需的一切安装到一个文件夹中,知道吧,这里只需花上一秒。如果你的机器上没有Python,而你又不想经历这个安装过程。
我确实推荐,如果你对数据科学或数据分析感兴趣,知道吧。 在你的电脑上安装Python是非常有帮助的,这样你就可以实际运行一些Python代码和其他内容。
但是。你也可以去Google Colab,Colab。 所以Colab。这基本上是由Google在云端通过你的浏览器运行的Jupyter笔记本。所以使用这些。你不需要安装任何东西。你可以直接来Colab。你可以创建新的笔记本。
这将为你创建一个笔记本,并且会安装你所需的一切。所以它会有matplotlib。它会有pandas,等等。因此,如果你想轻松开始,你可以直接去Colab,使用云端的笔记本。所以这很酷。我会把这个移动到回收站,我将在我的电脑上使用Jupyter笔记本。
😊。
离开这个网站。好的,我们有这个miniconda。那么我们来这里创建Conda。我将创建一个新的虚拟环境。我将把它命名为Matplotlib教程。😊。
因此,这个破折号和标志是我们创建的虚拟环境的名称,即 Conda 虚拟环境。现在我将安装 Python 包,Jupiter,Mat plot。让我们全屏显示。Mat plot,Lib,pandas,numpy。我想这应该就足够了。如果我们点击这里运行,这会转动一会儿。
它会查看我们尝试安装的所有这些包,弄清楚我们是否可以安装它们。然后我们会按下字母 Y。因此,这将告诉我们 Conda 需要安装的所有内容,以便在这个虚拟环境中安装四个不同的包。所以我输入一个 Y 表示是,按回车。这将下载并提取这些包。
我们将给它一点时间完成。完美。因此,我们刚创建了一个名为 Matplotlib tutorial 的 Conda 虚拟环境。所有安装都顺利完成。因此,查看你正在使用哪个虚拟环境,或者说你正在使用哪个版本的 Python,如果你在 Linux 或 Mac O 的终端中。
这个命令在 Windows 上会有点不同。我相信在 CMD 中它叫做 where,PowerShell 中的命令可能会有所不同,比如 where do EX E 或类似的命令。但你可以输入 which Python。😊,这将显示如果我现在运行 Python。
所以我运行 Python。这是当我运行 Python 时调用的可执行文件。所以 Anaconda 3。bin,Python。
你会注意到这是 Python 3。7。3 等等。我可以通过 Anaconda 访问所有安装在基础 Python 中的包。现在,如果我退出。然后输入 conda activate。Mat plot Lib tutorial,就像上面说的那样以激活环境。
你会注意到左侧会显示变化,表明我们现在在不同的环境中。你的终端可能没有那样的功能。没关系,我使用的是终端 Z,S H Zish,它为我做了一些花哨的事情。但如果你的没有这样,那也没关系。现在我输入 which Python。你会注意到我们指向了不同的位置。
所以 Anaconda 3 的 mapplotlib 教程在 Python 中。这表明我们现在处于封装好的虚拟环境中,并且我们只访问明确表示想要安装的包,以及标准的 Python 包。
所以我在这里输入 Python,你会注意到我们实际上在这里运行的是不同版本的 Python,3.8.3,因为 Conda 每次创建新的虚拟环境时,都会拉取最新的 Python 版本,即最新的稳定版本。因此我们实际上是在运行更新版本的 Python。如果我导入 pandas。
我们安装了那个,这样pandas就可以正常导入,但我们没有安装Cborn,这是另一个数据可视化库。所以Cborn在我的基础安装中是已安装的,但在我的虚拟环境中没有安装,因为我们使用的是完全独立的Python安装。我们在这里使用的是完全独立的包。
好的。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P6:6)Matplotlib中的基本图形 - ShowMeAI - BV14g411F7f9
我将在Markdown中创建一个章节标题。我将称之为章节号。我想现在是章节号2,不是吗?章节号2。基本图形,好的。那么让我们做一些你可能想在这里使用的基本图形。实际上,你知道吗,我们还没有开始使用我们的心脏病数据,对吧。
所以让我们实际上向上滚动到顶部。
我将在这里创建另一个标题,称之为加载我们的数据。好的,我们将使用pandas加载数据。如果你以前没有使用过pandas,如果你没有见过项目数据科学,Padas mega教程,那将向你介绍几乎所有你需要知道的关于pandas的内容。
所以我强烈建议你在某个时候观看。但让我们继续导入pandas为PD D。我们将使用pandas加载数据。所以让我们输入LS,它非常方便,Jupyter笔记本将其转换为shell命令,或者在这里使用shell命令。
它列出了当前目录中的文件。因此,我们看到我们的心脏病U I数据集。接下来,我将加载这个P D点读取CSV。放入数据框中。现在让我们读取它。如果我们查看DF.head,这将给我们数据中的前五行,因此我们看到我们的年龄性别。
我们有一个名为CP的列,ettera,et cea,et cea。然后目标是这个人是否患有心脏病。
如果我们查看DF点形状,这将告诉我们有多少行和多少列。如果我们查看DF点描述。
Df点,描述。这将告诉我们每列的一些描述性统计。例如,这个数据集的平均年龄是54岁。如果我们查看目标,平均值。
心脏病的患病率约为54%。因此,这个数据集中的大多数人确实患有心脏病。
最后,如果我们查看DF点信息,这将告诉我们非空行的数量。因此在这种情况下,我们有303行。看起来我们所有的列都没有任何空值,且所有列都是数值数据类型。其中一列是浮点型,其他都是。
这里是ints,整数。好的,所以我们已经加载了数据。我们现在准备开始使用这些数据进行绘图。因此我们回到我们的章节号2,章节2,基本图形。让我们开始。
从散点图开始,我们先看一个散点图。如果我们查看我们的数据框。也许我们想看看这两列之间的散点图。那么也许我们会感兴趣。年龄与胆固醇水平之间是否存在关系。
所以这是我们想要回答的问题。所以我会在这里输入。年龄与胆固醇之间是否存在关系。胆固醇水平。所以如果我们查看这里的 DF 年龄。这将返回一个 pandas 系列。我们有一堆值。我们可以将其转换为在绘制 mapplotlib 中使用的 numpy 数组。实际上。
我认为 mapplotlib 也可以接受 pandas 系列。但是,你知道,先转换成 numpy 数组总是没错的。然后让我们看看这里的前 10 个值。我们 numpy 数组的前 10 个值。我们还来看一下胆固醇。看一下胆固醇。前 10 个值。好的。
所以我们想要制作一个散点图,遵循我在上面告诉你的公式。绘制 mat plototlib 的公式。让我们做 fig,x 轴 = PL T 点 subplots。我们将做 AX 点。我们一直在做 AX 点 plot。但我们要做的只是将其更改为 AX 点 scatter。所以我们现在将做一个散点图,而不是线图。
然后我们将传入我们想要的 x。x 将是年龄。然后我们将传入我们想要的 y。所以 y 将是我们的胆固醇。最后,P,L T 点 show。
好了。这是我们年龄与胆固醇的散点图。一眼看去,似乎没有太强的关系。这里可能有微弱的正相关。但是没有什么会让我们惊讶的。所以我们可能会感兴趣的并不是。我们数据集中所有的数据点。
也许我们对按年龄计算的平均值感兴趣。这实际上也会给我们更少的点可以使用。所以我要创建一个数据框。
这是按年龄分组的。所以,基本上,我们要做的就是。Df。点分组。我们将按年龄分组。然后取所有其他值的平均值。如果我这样做,你知道,我在 pandas 教程视频中有更详细的解释。但基本上,这里的事情是我们按年龄对所有数据进行分组。
然后,你知道,对于,假设40岁的人。让我们看看,或许对于像45岁的人。我们将有10个不同的数据点。所以我们将取这10个数据点的平均值来获得每一个值。因此这个胆固醇值,而不是一个单独个体的胆固醇。现在将是所有45岁人的平均胆固醇。
所以让我们来获取这个组!
我们将其设为按年龄分组的DF。我们就叫它,这样我们就可以使用它。然后如果我们再次查看这些数据并问自己,好的。
现在我们想绘制年龄与胆固醇的关系。我们的年龄现在是左侧的索引。这是pandas数据框的一个特殊功能。然后我们的胆固醇仍然只是一个列。所以如果我们查看按年龄分组的DF,这里是我们所有的年龄。这将是我们的新X。
如果我们查看按年龄分组的DF胆固醇。
点。值,我们将只查看其中的前10个。
好吧,也许我们可以查看索引的前10个。好的。那么让我们创建第二个散点图。
所以我们会说散点图编号2。平均。😔。
按年龄分组的胆固醇。好的。因此我们可以使用完全相同的散点图公式。我们将把它放在这里。现在,代替DF,我们将有按年龄分组的DF。按年龄分组的DF,而不是调用年龄列。
对于这一点,我们将传入索引和这个数据框。
调用将保持不变。所以让我们绘制这个,看看,给你。所以现在我们每个年龄只有一个数据点。我们得到的东西实际上看起来更像是一个正相关。因此,这就是散点图的要点,A X点散点。
我们将随着进展深入探讨所有这些图表。但我们从基本问题开始,如何绘制一些基本图表。所以首先是散点图。
现在,让我们谈谈折线图。如果我们想要在这里绘制相同的图。但不是绘制散点图,而是想连接这些点。我们想绘制类似于上面y=x²的折线图。
好吧,我们可以在这里复制这个。并且不再是A X点散点。
我们之前做过,A X dot plot。
到底是否合理以这种方式表示数据,你知道,这是你自己的判断,但。绘制线图时,你只需调用AX dot plot。好的,那么我们继续。我们做一个柱状图。如果你想把这个绘制成柱状图,许多东西看起来非常适合做柱状图。
在柱状图中,很容易区分不同类别之间的关系。所以这是一种非常常见的图表,我们在Matplotlib中如何做到这一点?再一次,先复制我们绘图的公式。创建图形,使用PL T dot subplots创建轴。现在,而不是A X dot plot。
我们只需调用A X dot bar。因此,你可以看到通过更改我们在轴对象上调用的方法,我们正在改变图的类型。我们在这里有我们的轴,想要绘制某些内容。然后要实际绘制某些东西,我们必须在其上调用某种方法。要绘制散点图,你调用dot scatter。要绘制线图,只需调用dot plot。
顺便说一下,点图更强大。实际上,你对每种方法都有很多不同的选择,但我们现在只是走过基本方法。然后对于柱状图,你只需调用dot bar,而你这里的第一个值将始终是x。
而你的第二个值将是y。
这在水平柱状图中会稍有变化,我们接下来要做这个。所以让我们做一个,做一个水平的。
这里的柱状图,所以, вместо调用。Bar,现在我们调用bar。
H,所以我们称之为bar H。现在这有点混淆。你要传入的第一个参数,知道吗?这里调用的方式是完全相同的。但现在你传入的第一个参数技术上是Y轴,第二个参数是X轴。
现在你可能在想,好的,嘿,我怎么知道可以在这个轴对象上调用多少种方法。如果你去新单元格。
我相信我们仍然有来自前一个单元的A X对象。如果我们做A X,输入dot,然后按tab。这将显示我们可以在轴对象上调用的所有不同属性和方法。你会看到实际上有很多。因此,这里是bar。这里是bar H。
你可以看到我们这里有一个箱线图。你可以看到我们有各种处理标签和缩放的选项。😊我们这里有误差条。所以你有各种不同的东西,这部分我就是在浏览这个庞大的列表。这部分是我在开始视频时提到的,matplotlib可能会让人感到不知所措。
有这么多选项,因为你可以调整这个图表,让它看起来像你想要的那样。所以这里有很多选项。这就是为什么我们开始得很简单。随着我们继续增加复杂性。视频结束后仍然有很多要学习的东西。所以,这完全是关于你想要图表看起来怎样。
那么你如何让Matplotlib做到这一点呢?让我们继续简单类型的图表。这是我们最后一个图,直方图,对于直方图,你只需要一个变量。所以你知道,直方图将你的数据分成不同的箱子,然后显示你的数据行有多少落入每个箱子。所以在这种情况下,也许我们想看看。让我们去复制我们的。
我们这里的绘图公式。也许我们想查看我们的年龄分布。那么我们的数据中有多少人落入哪个年龄范围。所以在这种情况下。我们只需调用Ax.dot.hist。这里的.dot hist是我们要调用的直方图方法。
顺便说一下,如果我们想查看那个。
如果我们想查看它的文档,我们只需在后面加上问号。我们运行那个单元。然后你会看到,好的,我们在这里传入什么。好吧,我们传入X,X是唯一的必需项,而所有其他参数都是可选的。它们都有默认值,所以。箱子数。
是我们可以使用的参数之一。我们可以绘制直方图,好的。计算并绘制直方图,等等。这里是该参数的描述。所以如果你想做类似绘制直方图的事情,并想要更多的控制。你知道,在这里加上这个问号,运行这个单元。
获取文档,看看你所有的选项。在你首次绘制直方图时,你可以设置其中一些选项。
好吧,我们想查看我们的年龄直方图。所以在这种情况下。我们将回到原始数据框中,该框中有每个人的每一行数据。让我们获取这里的numpy数组值。
好了,来看看。这里是我们数据集中每个年龄类别的人数直方图。所以你可以看到,我们的数据中大多数人都落在这个聚集区。实际上,我们有两个大聚集区。一个是从大约 53 到 67 或者类似的。
然后另一个组,来自于大约 30 多岁到 50、53 岁,早期 50 岁。大约是这样的。这就是你如何做直方图。由此可见,我们有多种不同的图表类型,你可以通过调用这些不同的方法轻松访问。如果你还记得。
向上滚动到。
这四个不同的子图,这四个不同的坐标轴。如果你想在每一个中绘制不同类型的图,你可以。而且,你知道,我我。我可以现在就给你展示一下那是什么样子。实际上,如果我们把 X 改为第四个。改为散点图。看,这样就好了。那么,我们这里有很多数据点。哦。
这是因为我们改变了我们的 x 和 y。我们改变了我们的 x 和 y 来拥有。
这里有很多不同的点,下面有 1000 个不同的点。所以这就是为什么这个图现在看起来。
这很不同,这可能实际上对接下来的几种图形不太好。但我们还是来试试吧。让我们尝试一个条形图。所以这将尝试做一个有一千个不同条形的条形图。嗯,虽然不是最好的,但就是这样。这就是你如何在不同的子图中绘制不同类型的图形。
这就像改变你调用的方法一样简单。
O。所以这就总结了这些简单图形。我们有散点图。
我们有折线图、条形图、水平条形图和直方图。凭借这些图形,我认为你将能够绘制大多数你想要的图形,特别是当你开始混合这些并学习如何使用颜色等时。那么,让我们现在继续。
到下一个部分。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P7:7)在同一轴上绘制多个图形 - ShowMeAI - BV14g411F7f9
现在让我们创建一个新部分。我们称之为第 3 部分,第 3 部分。所以在这一部分,我们将看看在同一坐标轴上绘制多个图形。因此同一坐标轴。所以记得。
图 A X 等于 PL T 点子图,然后 PL T 点显示。这将给我们一个图形。所以一幅图像,你知道,还有一个坐标轴。所以 A X E S 在那里。所以我们将绘制的一个地方。对于这个,我们将查看同一坐标轴上的多个图形。
所以我们不会像这样查看多个坐标轴。我们将在同一坐标轴上绘制。好的。
好的,让我们试试。首先是一个简单的图形。让我们回到之前使用的简单数学方程。所以我们将进行 Ax 点图。现在让我们看看我们的 x。我们的 x 仍然在那里。我们的 y 也还在。让我们看看这里的 x 和 Y。这是什么?这是一个抛物线。很好。现在,如果我们想在这里绘制另一个图形,我们来做 A X 点图。
让我们回到我们的阻尼。让我们看看为什么是阻尼振荡,记住。看吧。我们的抛物线在这里变得非常扁平。你可以看到,因为我们的 y 轴突然变得非常大。那么,如果这里不是一个抛物线,而是 x 的立方呢?😊让我们试试。好的,那看起来稍微好一点,但不管怎样。
现在你可以看到我们在同一坐标轴上有两个图形,y 等于 x 的立方,然后我们有我们的阻尼振荡图。Matplotlib 自动为我们绘制了这两种不同颜色的图形。现在,每当你开始在同一坐标轴上绘制东西时,你通常会想添加标签。
这很简单。你只需在图形中添加标签参数。所以我们可以说,你知道,对于这个,也许就是 x 的立方。而这个的标签是阻尼振荡。所以我们添加了标签,但如果我们运行这个,其他的没有发生。这就是我们方便的 Ax 图例方法派上用场的地方。
所以这是你可能会一直使用的东西。每次你给图形添加标签时。然后你想在图形中显示这些标签。只需添加这个 A X 图例。我们运行这个,matplotlib 会自动在这里为我们放置一个图例,带有颜色。😊
而且。这也会设置图形的样式。所以,如果这是一个散点图,这些将是小点而不是线。我们看到这里的蓝色图形是 x 的立方,而我们的橙色图形是阻尼振荡。所以这是如何使用同一坐标轴对象的简单概述。要多次调用绘图方法,你要用不同的数据多次调用它。
这会将你的数据绘制在相同的坐标轴上。现在,让我们回到心脏病数据。假设我们想要一个散点图。我们想回到绘制一个数值变量与另一个数值变量的散点图,以寻找关系。但我们还想着色。
按标签,我们想根据标签着色。那我们为什么想这样做呢?好吧。假设我们想看看关系。让我们回去。让我们回到我们的数据框。
假设我们想看看静息血压和胆固醇之间的关系。如果我们回到我们的cagggle
数据,这里,回到我们的Cale
数据。
T rest, B P
,这是静息血压。所以这是静息血压。然后是胆固醇。这是血清胆固醇,单位是每分升多少毫克。
所以假设我们想看看静息血压与胆固醇之间的关系。
我们想看看在有心脏病和没有心脏病的人之间,这种关系是否有任何不同。因此我们想根据是否有心脏病来着色。让我们看看我们在这里的意思,以及我们可能怎么做。
所以我们将从基本公式开始。我们在这里有子图,正在创建图形。最后创建坐标轴,调用 plt.show
来显示该图。现在如果我们只想做一个普通的散点图。如果我们只是想做一个普通的散点图,我们可能会说,你知道的。df.T.rest BPS.values
。
我们想要将其绘制与胆固醇的值。
这是我们的图。我们在X轴上有静息血压。我们在Y轴上有胆固醇。但是我们想要为此着色。我们想根据这个人是否有心脏病来着色。所以看看我们原始的数据。
你可以看到目标。所以目标是1,让我们回到数据中验证一下。
一个目标。
嘀嘀嘀,让我们看看。
好吧,实验与克利夫兰数据库。值1、2、3、4都表示心脏病,值0表示没有心脏病,我想在我们的数据中。
我们只有。
哦,抱歉,值。计数。是的,我们在这里的数据只有1和0。所以1表示心脏病的存在。0表示心脏病的缺失。所以我们想要着色。根据这一列,我们想为每个点着色,看它是否有心脏病。
所以使用这个,我们可以用同样的原则在同一坐标轴上绘制多个图形。因此在这种情况下。
假设,让我们看看。我们的目标。假设我们只想获取等于0的行。所以我们将其设为零,这创建了一个布尔掩码。因此,基本上你知道这行是否等于0,它会显示为false或true。我们将这个布尔掩码传回到我们的数据框中,以便索引到这些行。
然后我们可以称之为,我们可以称之为我们的DF子集或类似的东西。
所以,让我们。
让我们试着逐步进行上面的内容。DF子集。等于这个。现在。与其传入整个DF,不如我们只传入这个子集。所以这些只会是没有心脏病的人的行。
所以假设先绘制没有心脏病的个体的数据。先做这个散点图。这样可以。你看到散点图变得相当不错。因此我们现在只绘制了大约一半的点。
我们只绘制了大约一半的数据点。
所以让我们复制整个内容。让我们复制整个内容并向下移动。现在也许我们设置DF子集等于有心脏病的人的数据。然后。我们可以再绘制。第二。第二,绘制个体有心脏病的数据。
看那条matplot Lib。已经根据是否有心脏病将这些点着上不同的颜色。现在我们要做的就像之前一样。我们添加一个标签。假设标签等于。我们叫这个也许是健康的。
这个标签将显示,心脏病。
记住我们需要在这里添加我们方便的AX do图例。就这样。因此,基本上我们在同一坐标轴上绘制了两个不同的散点图。第一个。这些是健康患者的X值,这些是Y值。第二个,这些是有心脏病患者的X值,这些是Y值。
matpllib自动为我们上色,我们添加一个标签,并且添加一个图例。
就这样。我们现在有一个通过标签上色的散点图。这很酷。😊现在,假设我们这里有很多值。我们想为很多不同的值做同样的上色散点图。那么。这是很多冗余代码。而且因为我们明确列出了,显而易见。
嘿,你知道,先绘制这个,然后再绘制第二个。但我们还有另一种方式可以做到这一点。我想快速给你展示。所以我要把这个复制到第二个单元。
所以在这种情况下,我们将循环遍历不同的值。基本上,这段代码中唯一变化的内容除了我们设置的标签外,就是我们根据这里的目标值来过滤数据的方式。所以如果我们再次查看DF目标。
DF目标,如果我们想要获取这个系列中的唯一值,那么我们只需点唯一值。
这向我们展示了我们只有两个唯一值,0和1,然后我们可以遍历这些值。
那看起来怎么样呢?我们可以说4,目标值,在DF目标的唯一值中。所以我们将循环,DF目标,来了。点唯一值。我们将循环遍历每个目标值,0和1。让我们继续缩进这一部分。现在,不再明确地将其设置为0。
我们将这个值设为我们正在迭代的目标值。然后我会删除这个注释。
而且趁此机会,我现在要删除这个标签。我们可以删除这里的第二个图表。所以让我们,或者也许我实际上会传入。传入标签等于目标,目标值,然后我们将保留图例。
就这样。所以我们刚刚做了完全相同的图表。你会看到现在映射绘图的lib因为这个DF目标的唯一值。
它切换了我们绘制的顺序,这意味着颜色被翻转了。所以,你知道,健康现在是橙色,而心脏病现在是1,仅仅因为这些值在DF目标中的输出顺序。
而我们的标签现在仅仅是这个目标值。如果我们想在这里有一个更具描述性的标签,这就是你可以开始做类似的事情的地方。所以也许我们有一个字典,可能我们有一个叫做标签映射的字典,或者类似的东西。我们想要映射一个标签值或目标值为0,健康。
我们想要映射目标值为1,Qiu,心脏病。而现在,我们的标签不再等于目标值,而是让我们的标签等于标签映射。
目标值。所以我运行这个单元,以便获取我们的字典。现在如果我再次运行这个,你会看到我们传入了我们的标签,这是从这个字典中映射过来的。
这是一种可以在许多不同情况下使用的技巧。我们可以在这里有一个颜色映射字典,也许。如果标签是 0,我们希望它是蓝色。如果标签是 1,我们希望它是红色或其他什么。因此,你可以使用这样的字典进行各种不同类型的映射技巧。
但这是一个示例,说明如果你想的话,如何将两个明确的调用合并为一个。
循环调用遍历所有唯一值。现在,当我们在这个散点图上时,假设我们有一个特定的点想要突出显示在这个散点图的某个地方。
这可能是你出于各种原因想要做的事情。也许你想在柱状图中突出一个单一的条,或者在散点图中突出一个单一的点。这是一个非常常见的需求。因此,让我们讨论一下如何在这个散点图中做到这一点。我要说的是:散点图,突出一个单一的点。在这种情况下。
我们将突出显示的方式是使用颜色。所以如果我们做 A X。
点散布问号。让我们看看我们有什么选项。因此,除了传入 X 和 Y,正如我们一直在做的,我们还有一个 S 参数,A C 参数。我们这里有一堆其他参数。嗯。
所以 S 将代表大小。这里的标记大小和 C 将代表标记颜色。我们将在稍后利用这个标记颜色。现在让我们从正常开始。
从我们的正常开始。
这里的模板,Plt.splots。
让我们做 A X 点散布。
嘟嘟。
让我们来做一个点散布。我们将做所有的点。所以让我们做 D F。T S,B,PS。DF 胆固醇。让我们看看这个。
好的,现在假设我们想突出一个单一的值。首先,让我们把所有其他值设为浅灰色。所以我将使用 C 参数。C 等于浅色。G i。所以 c 等于像灰色。现在我们将所有这些点变成灰色。现在我们想要突出一个点,可能我们想要突出的点就是这个数据中的第一个患者。
所以我们可以做的是。我们可以有一个散点图。实际上。我只是将整行复制下来。我们只针对零索引的人绘制一个散点图。所以只取我们的数据中的第一个点。现在让我们将颜色改为红色。你看,现在我们将所有点绘制为浅灰色。
然后我们只需取第一个点。我们只取那个第一个点,即零索引。我们将那个特定的点用红色绘制出来。这是一个很好的方法。你可以用柱状图做到这一点。你可以用其他类型的图表做到这一点。这是一个很好的方法来突出图表中的特定点,你只需,知道。
只需在其上绘制另一个散点图。用不同的颜色来做。随便选择你想要的颜色。好的,我们本节的最后一个例子将是。我们来做一个。我们来做一个柱状图。还有一个。折线图。也许还有一个。
画一条水平线。所以我们将从同一模板开始,PLT.dot subplots。然后在这里显示 PLT。我们想绘制什么数据,好吧,也许我想绘制。让我们看看。也许我想绘制一个折线图,回到我们的按年龄分组。我们的按年龄分组。所以让我们在 X 轴上绘制年龄,也许。绘制胆固醇水平。
沿着 Y 轴。这是一个很好的折线图,显示了你的年龄和每个年龄组的平均胆固醇。所以现在,也许我想添加一个柱状图。
在这个坐标轴上,我想显示 TR Bps,静息血压。
现在让我们做 AX.dot bar。再次重申。我们在这里使用的是同一个 AX 对象。所以我们使用同一个对象,调用不同的方法来在同一个图表上绘制不同的图,使用相同的坐标轴。因此,我们也将使用年龄作为 X 轴。现在让我们进行 T rest B。
P 作为我们的值。你看,我们现在有这个柱状图。它代表一个值,胆固醇则代表另一个值。所以这里并没有明确指出。所以我们可以改变这些不同图表的颜色。所以也许我会传入一个 C 等于。让我们试试橙色。我们还会。
我们可以保持。这个颜色,保持不变。让我们传入一个标签,看看会有什么效果。所以这将是。胆固醇。这个标签将是 T rest。Bps。并记住,我们需要调用 AX.dot legend 以便显示图例。所以你看,这就是我之前提到的。图表将以不同的形状显示,以指示你在这里查看的内容。
这是一张柱状图。它告诉我们这是静息血压。而橙色线是这条线图,这是我们在这里查看的胆固醇。好的,这看起来不错。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P8:8)添加和更改文本 - ShowMeAI - BV14g411F7f9
现在我们继续进入下一个部分。所以这个下一个部分。
你会注意到我们还没有添加任何标题。我们还没有添加任何标签。我们没有处理任何文本。除了我们的图例外,我们只是进行了图形绘制,图例会自动放置。那么现在我们进入下一个部分,我想,第四部分,对吧?我们在第四部分,对,第四部分,继续前进。
第四部分,添加和更改文本。好的。
所以添加和更改文本,这是绘图中非常重要的一部分,因为你想给人们提供关于他们所看到内容的信息。你知道的,你想标记你的 X 轴,比如 50 是什么,这个数字到底代表什么。你想标记你的 Y 轴,知道我们在看什么,然后你想给图表一些标题,一些有用的标题,以便人们能够理解数据的上下文以及你试图传达的内容。
在我们进行文本之前,我想给你展示一个非常有用的matplotlib。
资源的做法是 Maplotlibb。ATex。
我在这里。😔,让我们来看看这个。
我想给你展示一件特别的事情。其实,我会直接复制这个网址。
在页面下方,我们开始吧。Class mapplotlib do text dot text,所以。
我给你展示这个的原因是因为这个地图绘图库的 API,以及文档。
这对于查看使用文本对象时可以使用的所有不同属性非常有用。
所以我们的标题是文本,我们的标签是文本,等等。
这是你可以更改的文本的一些内容。所以你会注意到你可以更改字体系列,因此你可以更改字体的类型。你可以更改字体大小。我们要使用的其中一个是可以更改文本的旋转。所以你有所有这些不同的选择。
操作文本的选项。因此,这是一个非常有用的链接。我会确保你有这个。当你需要对文本做一些特别的事情时,可以来这里参考。所以我实际上,嗯,我会把这个粘贴到。
这是Jupiter Notebook。好的,首先,让我们看一下坐标轴标签。这是带有“I”的轴,而不是像这样带有“E”的“Cs”。
让我们获得一些图表,以便在这里使用这个文本部分。所以。
让我们看看,我们想做的事情是查看这个胆固醇的条形图。好吧,我们要查看一个按年龄划分的胆固醇条形图。所以我将在这里复制这个图。
让我们将其更改为“年龄与胆固醇的条形图”。我会去掉颜色和标签。
首先,我们的观众对X轴和Y轴应该代表什么毫无头绪。因此,我们的做法是,我会先在对象上展示给你看。所以AX。我会点一下,按一下Tab。让我们看看所有不同的方法。所以是set。
所以,当我输入set set underscore X时,你会开始看到可以设置的所有不同内容。因此,你可以设置边界、限制。我们将设置X标签。所以我们将在这里设置X标签。那么我们的X是什么?嗯,那就是年龄。所以让我们把这个复制到上面。你看。
你现在可以看到“年龄”这个词在下面作为我们的X轴标签。如果我们想对Y轴做同样的事情,嗯,我们只需将其更改为设置Y标签。那么这将是平均胆固醇。我们的Y轴标签就是这样。那么如果我们想给这个图表一个方便的标题呢?
所以我会继续把这个复制下来。让我们在这里创建一个新的部分标题。
Pot。Tido。
你要做的方式是,先回到Ax,看看是否有设置标题。就在这里。看看这个。我已经知道了,但你不知道,所以对我们其中一个人来说,这仍然是一个惊喜。AX点设置标题。让我们看看。
假设我们要查看不同年龄的平均胆固醇水平。
而且你看。现在平均胆固醇按年龄显示为标题。我们正在这个AX对象上做这个。所以这是这个坐标轴的标题,这个坐标轴的标题。稍后这会派上用场。
所以。这是你在添加和修改文本时真正想要了解的两件主要事项。我们将在常见问题部分进一步讨论文本,但现在就先保留访问标签和图表标题,因为这些将是你将要使用的主要内容。
绘图必备Matplotlib,Python数据可视化工具包!150分钟超详细教程,从此轻松驾驭图表!<实战教程系列> - P9:9)在Matplotlib中使用子图 - ShowMeAI - BV14g411F7f9
好的,让我们进入最后一个部分,然后再回答常见问题。正如我所说,我们将在常见问题中相当多地回到文本。所以我们将看看如何更改这些刻度,旋转X轴和Y轴标签,以及更改字体大小等等,但在进入一些细节之前,我们先做一个基础功能的部分。
我之前已经在Jupyter Notebook中向你展示过这个,但我想明确一下,并花更多的时间在这上面。你知道我们通常如何使用plt.subplot
。然后我们做plt.s
。!
这创建了一个单一的坐标轴,我们可以在上面绘制东西。如果我们传入一个数字,比如行数、列数,那么我们在这里就会得到多个图形。让我们再过一遍。我们来看看一个2乘2的!
一个2乘2的图。而且记住,这通常会把这个改为axs
,如果它有多个坐标轴。如果我们查看axs
。!
这是一个二维的numpy数组。注意这里我们有一个包含两个Matplotlib坐标轴的列表,这两个坐标轴都被包裹在外部列表中。我们可以查看点的形状!
你会看到我们有两个乘以两个,这与我们请求的相匹配,也与我们得到的图形相符。那么在每一个图上绘制时,你要做的就是用axs
,然后你可以指定这个axs
对象中的坐标或索引,想在何处绘制。所以我们在第一行、第0行和第1列绘制一些东西。
让我们试试这个。也许我们想在这里绘图,先看看我们的年龄分组。所以也许我们会把所有这些都作为年龄来看。让我们回到看看我们的胆固醇值。你看,这里我们现在在第一行、第二列有一个折线图。
我们按年龄划分的平均胆固醇。现在,如果我们想在第一个图中查看,也许我们想查看第0行、第0列。点。也许想看看平均静息血压的条形图。对吧?我们来做一个条形图。所以现在你会看到我们在那个第一个图中有一个条形图。
这也是常见问题中会出现的内容。但我会继续把图形做得更大。所以请记住,图形就是整个图像,对吗?所以现在我们尝试在同一张图像中绘制四个不同的图,而之前我们只绘制了一个。
所以这就是为什么看起来比较小的原因。那么我们来改变图的大小吧。让我们来改变图的大小。也许我们会这样做。
我们只需传入10乘以10。
看看这会有什么效果。或者,也许,我们试试12乘以8。
好的。看起来更成比例了。所以现在你会注意到这个图形,这仍然只是一个单一的图像,但这个单一的图像现在变大了。我们有更多的空间来绘制每个坐标轴。好的,让我们来做两个这样的图。我们需要在第二行中绘制一些内容。
第一列和第二行、第二列中的某个内容。那么也许我们来看看我们的分组。我们有哪些列。
我们来看看这个。我们的第三个图。也许我们再看看这个。对于我们的第四个图,我们有thalac和老峰值。那是什么呢。
所以这个,Talac,或者你怎么发音的,表示达到的最大心率。而老峰值是运动相对于静息所引起的ST段抑制。我不是完全确定这是什么意思,但如果你学医,可能会知道这意味着什么,或者如果你在医疗保健领域工作。
所以我们把这个第三个图做成一个散点图。也许我们会把最后一个,再做一个条形图。那么我们试试这个。
好的,你看,我们首先绘制了一个条形图,我们可以做任何我们想做的事情。
使用这个坐标轴,就像我们对待单个坐标轴一样,所以我们可以设置标签。我们可以设置标题,我们可以做所有这些事情。
第二个图是一个折线图。
我们有一个散点图,然后用另一个条形图结束它。所以让我们花点时间。
只是想告诉你,你确实可以设置X标签、Y标签和标题。就像正常一样,使用这个坐标对象。
让我们看看第一个图表。然后我们再看第二个图表。然后是第三个图表。这里是第四个图表。好的,我们或许不需要对所有这些都进行设置,但。
所以与AX不同,我只是将其更改为这个Numpy数组中的坐标轴位置。
X轴标签,这将是年龄。Y轴标签,这将是平均。
这是什么?是你的休息。血压,对吧,所以平均。
休息。血压。
如果我们想在这里设置一个标题,可以说是平均。休息血压。
按年龄来看看这个,看看效果如何。
好的,我们的图表变得有点紧凑。你知道,想让图表看起来完全符合你的期望确实需要一些时间,具体取决于你想做什么。但请注意,我们有X轴标签、Y轴标签,还有这个图表的标题。我们只是使用了同一个坐标轴对象。
现在假设你花时间为所有这些图表添加了适当的标签。我将逐个检查,确保这是索引到正确的坐标轴对象。
假设我们现在就把这些都保持不变,但假设你花时间逐一检查。
你知道,也许我会改变胆固醇。
让我们看看,这个是什么。
这个是心率的平均值。最大心率。记住,这是所有数据的平均值,因为我们是按年龄分组并求平均的。
旧的峰值。这是运动引起的ST段抑制。所以我们就称为平均旧峰值。
好吧,假设你花时间绘制了所有这些。就像我刚才说的。
年龄。这里的年龄 X 轴标签和标题 A 太近,它们重叠了。这看起来不好,你无法阅读,而且你不知道那是什么。所以我们需要想办法修复这个。
所以有办法上下移动文本和图形。但还有一个非常方便的功能。
PLT
的紧凑布局功能。这并不是,它不是一个灵丹妙药,你知道的。它并不总是能完全按照你的要求工作。
但是如果你在 PLT.show
之前调用这个紧凑布局,那么 Matplotlib 会尽力确保元素不重叠。因此你会看到这里的 X 轴标签和下面图形的标题现在不重叠了,所有内容看起来都不错。
好吧,我想这就是第 5 节关于子图的内容。实际上就是这么简单。你可以创建任意数量的子图,然后在每个子图的每个轴上绘制任何你想要的图形。
最后,你调用 PLt.showhow
,如果元素重叠,尝试 Plt.tight_layout
。试试这个,看看是否有效,如果不行,你可能需要手动调整元素的位置。但希望这个对你有帮助。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P10:L11- 文本分类 - ShowMeAI - BV1TT4y1m7Xg
🎼,大家好,欢迎来到另一个 Tensorflow 教程。在这个视频中,我们将学习如何使用 R 和 N 进行文本分类。上次我给你们快速概述了一下,并展示了我们如何将输入视为一个序列,然后创建 R 和 N 模型。现在我们将把它应用到一个非常有趣的任务上。
这是来自真实世界数据的文本分类。我们分析 Twitter 的 tweets,并想预测文本是否与灾难事件有关。在这里,我在一个 Jupyter Notebook 中,已经导入了我们需要的内容。我们要使用的数据集在 Kaggle 上可以找到。
我当然把链接放在描述中。这叫做灾难 tweets。我们想预测哪些 tweets 是关于真实灾难的,哪些不是。😊而且有两个文件可用,训练和测试 CSV,但测试 CSV 不包括标签。这是用于提交的,如果你想参与这个比赛的话。
所以我只下载了这个训练数据 CSV,然后已经放入我的文件夹中。接着我们使用 pandas 加载数据,可以调用 pandas 的 read_csv,然后文件名。现在如果我们查看数据的形状,我们看到有 7630 个样本和五列。
现在我们来看前五行。在这里我们看到了一些额外的信息,比如 ID、关键词和位置,这些我们现在不需要。然后是文本,这就是实际的 tweet。目标标签是零表示没有灾难,1 表示这是一个灾难 tweet。
所以我们也来分析一下这两类各有多少。我们有这样多关于实际灾难的 tweets,还有这样多不是关于灾难的 tweets。我想这里大致是平衡的,我觉得这没问题。好的,现在我们可以继续,想在稍后使用 R 和 N 之前先对这些文本进行一些预处理。
所以我想做的第一件事是稍微清理一下数据。我想去除 URL,因为它没有提供任何信息。我还想去掉标点符号。为此,我已经实现了这些辅助函数。这一个使用了正则表达式。如果你想了解更多,我在我的频道上也有一个完整的指南可以查看。
好的,现在我们来定义这两个函数。在这里,例如,这些都是我们想要去除的标点符号字符。现在如果我们查看这个例子,它找到了一条带有 URL 的 tweet。如果我们去掉这个,它就只有这种格式。所以现在有了这两个函数。
对于我们的数据框或 Pandas 数据框,我们可以调用这个 map 函数,只针对文本列。因此我们说 data frame.dot text.dot map,然后是这两个函数。接着,我们将其赋值给文本列。这意味着我们移除了所有的 URL 和标点符号。
这是我想做的第一个预处理步骤。我还想去除停用词。为此,我们将使用著名的 NLTK 库。这是一个非常流行的用于自然语言处理的 Python 库。您可能还需要执行 NLTK.dot download。顺便说一下,您可以通过 Pip 简单安装它。在这里,我想获取所有停用词并将其移除。
根据定义,停用词通常是一些常用词,例如 D、A、N,搜索引擎被编程为忽略它们。因此,我们想要忽略这些停用词。我们从 NLTK 获取所有的停用词,然后通过一个小助手函数将其移除。让我们在这里打印出停用词。
在这里,您可以看到所有不同的停用词。然后我们再次使用这个函数调用 map 函数,作用于文本列。这将移除所有停用词。现在让我们看看一些示例文本。这就是文本列。现在我们想要准备这些文本,以便可以用于 RNN。
所以我们不能像这样使用所有字符串。因此,我们必须将其转换为模型理解的表示。为此,第一步是计算所有不同的单词。在这里,我们要利用一个非常不错的对象,即计数器对象。
它在 Python 的 collections 模块中可用,然后我们计算所有唯一的单词。因此,我们遍历文本列,然后说对每个文本进行操作。基本上,对于文本列中的每一行,我们说遍历每一行,然后对每一行进行分割。这样我们就得到了一个包含所有不同单词的数组。
然后我们遍历所有的单词并将其放入我们的计数器中。每当这个单词出现时,我们就将计数器增加一。因此,如果我们这样做,然后返回计数器并将这个函数应用于数据框的文本列,我们就得到了计数器及其长度。这就是唯一单词的数量。
我们发现这些推文中几乎有 18000 个不同的单词。那么我们也来看看计数器本身。基本上,它看起来像一个字典,这里的键是不同的单词,值是每个单词的计数。这就是计数器的样子,计数器对象还有一个很好的特性。
我们可以调用这个最常见的函数。这里我们可以看看五个最常见的单词。因此我们看到“like”这个词是最常见的,出现了345次。😊 然后再一次。让我们将计数器的长度分配给一个变量,并称之为 nu unique words。我们稍后会需要这个。现在我想将数据集拆分为训练集和验证集。
因此,我定义一个整数。这应该是我们想要用作训练的全部数据的80%。然后其余的部分。因此,20%用于验证。接着我们可以对数据框进行切片。然后前80%的样本用于训练,其余部分用于验证。现在我们得到了这个。同时,我们现在仍然拥有整个数据框。
现在我们想要拆分文本和标签,我们可以简单地通过访问不同的列来做到这一点。所以我们说 train data frame.dot text dots to nuy,同样适用于 data frame.dot target。因此我们说这些是我们的训练句子和训练标签。然后再次,我们对验证集做同样的事情。如果我们查看训练句子形状和验证句子形状。
然后我们可以清楚地看到训练集中有更多的数据。接下来我们要做的是应用分词器。通过分词,我们将文本语料库向量化,将每个文本转化为整数序列。所以你很快就会看到一个示例,使这一点更加清晰。
但现在我们要从 Tensorflowcars.dot preprocessing.dot text 导入这个分词器。然后我们创建一个分词器对象。为此,我们需要提供唯一单词的数量。这就是为什么我们之前要计算这个。然后我们必须调用 tokenizer.dot fit 在文本和训练句子上。因此这里只使用训练数据。当我们完成这个步骤时。
我们可以得到这个单词索引。所以这里每个单词都有一个唯一的索引。假设 word index 等于 tokenizer.dot word index,然后看看这个单词索引。然后我们看到这些单词的每个都有一个唯一的索引。这就是这个分词器的作用。然后我们可以将这些文本转换为序列,因此我们可以调用 tokenizer.dot texts to sequences,然后给出句子。
所以不要对此感到困惑。我们有句子。然后。这是原始文本。然后我们得到一个序列。因此它的大小相同。但现在它有这些唯一的索引。所以我们为训练集和验证集做这个。例如,我比较训练句子的五个样本和相应的序列。
所以让我们打印一下。这就是它的样子。所以现在可能会更清楚一些。句子是正常文本。然后在应用了分词之后。我们得到这个序列。因此我们现在这个数组的长度与文本相同。但现在我们为每个单词都有一个索引。所以现在我们有了这个。
现在我们想做一件事,因为现在序列可以有不同的长度。这就是你在这里看到的。但我们希望每个序列都有相同的长度。为此,我们应用填充。因此,我们再次导入,从tensorflow导入填充序列进行预处理,然后我们必须指定一个最大长度。因此在这种情况下,我们说是20,但你可以在这里玩更多或其他的,或者也许一个推文可能甚至超过20个不同的单词。
所以你可以稍微增加一下,但这也可能使你的训练时间更长。因此现在当我们指定这个时,我们可以调用这个函数填充序列,并用训练序列和我们指定的最大长度调用它。在这里我们说填充和截断等于后填充。这意味着它只使用零。因此我们对训练和验证序列执行此操作。
然后如果我们查看这里的形状,我们会看到它们在第二维度上都有形状20,因为这是最大长度。现在如果我们打印一个填充序列,我们看到这里使用了零填充。因此现在再一次。让我们打印一个训练句子样本,一个训练序列样本和一个填充序列样本,以便你看到区别。
然后再次看到,对于这个句子,我们有序列中的所有单词。我们有这些索引,然后对于填充序列,我们使用0填充。因此现在我们可以检查一下,如果这是正确的。如果我们能反转这个。因此,我们创建一个字典,将这个单词索引中的键和值翻转。
如果我们看一下,这是这个单词索引的键。我们有单词,值为这个索引。现在我们想将其存储在另一个字典中,并反向操作。因此现在我们说,键是索引,值是单词。这就是我们的反向字典。
所以让我们看看这个。然后我们看到所有这些索引都是我们的键,所有这些单词都是值。现在我们可以定义这个解码函数,它获取一个序列。然后我们简单地😊,对序列中的每个索引调用get函数。这将返回相应的值。如果不可用。
然后它应该返回一个问号。但如果我们获得新的索引,则如此。但是如果我们保持在同一个训练数据集中,那么它应该为每个索引找到相应的单词。这就是解码函数。然后让我们试一下。因此,我们对一个训练序列样本调用解码函数。
所以这个,然后我打印原始序列和解码文本。在这里我们看到这个序列和这个解码序列,我认为我们说我们有三个人。Dight热量远。所以如果我们查看我已经打印在哪里。所以这里我打印了从10到15的样本。因此那是原始句子。
所以我们看到我们的解码是正确的。现在我们有了这个,我们可以进行模型的实际实现。上次我给你展示过,我们可以非常轻松地创建一个简单的R N模型、LSTM模型或GR U模型。在这种情况下,我们使用LSTM。所以为此我们首先创建一个顺序模型。
现在由于我们使用文本数据,我们也使用这个嵌入层。因此,单词嵌入为我们提供了一种有效的稠密表示方法,其中相似的单词具有相似的编码。如果你想了解更多,我可以推荐Tensorflow网站上的这个官方指南。在这里你会看到另一种表示可能是独热编码。
在这里我们简单地使用a0或a1。但是还有这个嵌入表示。通过这个嵌入层,我们获得了这个表示。因此,得到一个浮点值的稠密向量。目前我们仍然有这个填充序列,包含所有的单词索引。现在这个嵌入层将这些索引转换为固定大小的稠密向量。
所以这就是为什么我们首先需要这个标记化。现在我们可以使用这个嵌入层。这样可以得到唯一单词的数量。然后是你指定的大小,还有最大长度。就是我们所指定的。这是输入长度。现在在定义之后,我们可以应用我们的LSTM或R N层,就像上次一样,我们只需指定输出单元的数量。
在这里我也说了dropout等于10%。然后由于我们想进行分类,所以a0或1分类,我们使用只有一个输出的稠密层。然后我们还应用sigmoid函数。让我们这样做并打印模型摘要。所以我们看到在嵌入之后,我们得到了这个输出形状。因此,批次的数量。
然后20是最大长度,32只是我们在这里指定的输出大小。然后我们的LSTM具有这个输出形状,因为我们指定了64个输出单元。接着我们有我们的稠密层。现在由于我们使用二元分类,我们使用这个二元交叉熵损失,这里我们说from Loit等于false,因为我们在这里已经使用了激活函数,然后再次使用优化器并定义我们想要跟踪的指标,编译模型,然后我们简单地训练它,因此我们进行拟合,在这里我们想使用填充序列和对应的标签,然后是epochs,现在这也是新的。
我想我之前没有使用过这个,因此在这个fit方法中你可以使用验证数据参数,这是一对元组,在这里我们使用验证填充序列和验证标签。现在如果我们这样做,那么它在训练过程中会自动使用验证数据集进行微调。
因此,记住这一点是个好主意,如果你在这里指定验证数据,你可以自动进行此验证。那么现在让我们训练这个模型。好吧,训练完成了。正如你所看到的,训练数据的最终准确率为 98%。相当不错。但验证准确率只有 73%。这可能是过拟合的迹象。
所以这可能是你的一项作业,你可以进一步改进或稍微调整模型,以使其表现更好。但正如我们所看到的,我们对文本数据进行了正确的预处理,并建立了一个不错的 LSTM 模型,因此这里得到了很好的准确率。所以让我们进行一些预测。
因此,我们简单地在这里调用模型的预测。😊,在这种情况下是训练的填充序列。正如我所说,我们在最后使用了 sigmoid 函数。因此,我们仍然需要将其转换为标签 0 或 1。所以我们简单地说,如果我们的预测输出概率高于 0.5,那么就是 1,否则就是 0。现在让我们打印一些原始的训练句子。
以及相应的标签和预测结果。在这里,是的,我们看到五个被分类为灾难,另一个则不是灾难,在这种情况下,我们的所有修正都是正确的。因此我们可以说,例如,这里有三个人死亡,等等。所以这是一个灾难。而这里,水灾也是一个灾难。最后这里。
我们有一些可爱的,没有灾难的。所以是的,看起来不错。而且是的,我认为我们在本教程中学到了很多东西。现在你知道如何应用一些基本的自然语言处理技术,然后使用 LSTM 进行文本分类。希望你喜欢这个教程。如果你喜欢,请点击点赞按钮,并考虑订阅频道。
然后我希望在下一个视频中见到你,再见。😊。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P2:L2- 张量基础 - ShowMeAI - BV1TT4y1m7Xg
🎼,嘿,大家,欢迎来到 Tensorflow 初学者课程的第二个教程。今天,我们学习张量基础。张量是 Tensorflow 库中的核心对象。因此,所有操作都是基于张量,张量就像是 N 维数组。所以你可以表示 1D、2D 或 3D 数组,甚至更高维度的数组。😊。
但让我们把它写下来。我们表示 N 维数组,但张量的设计还使其具有 GPU 支持。所以我们有 GPU 支持。
张量的设计也使我们能够构建所谓的计算图,然后跟踪计算反向传播。例如,我们将两个张量相乘,然后构建所谓的计算图,接下来的操作是减法。这也是我们计算图中的一个操作。然后在后面。
我们可以用这个来计算梯度。
所以它用于构建计算图,并在后面计算反向传播。我在我的 Pytorch 初学者课程中已经有关于这个的教程。但相同的概念也适用。所以如果你对此感兴趣,看看视频吧。我会把链接放在描述中。而且关于 tensor 的另一个重要点是它们是不可变的。
这意味着我们不能更新张量的内容。我们只能创建一个新的。所以现在让我们开始创建一些张量。首先,我们当然想导入我们的库 S T F。😊,然后为了创建一个张量,我们使用 T F.dot.constant 函数。所以我们说 x 等于 T F.dot.constant。
然后我们可以给它一个值,例如,只有一个标量值。然后让我们打印我们的张量。让我们运行这个文件,看看它的样子。然后我们也得到了一个警告,但我们不需要在意,我们可以通过说 import O S 来消除这个警告,然后设置 O do environ。变量称为 TFCPP Min lock。Level。Equals,然后作为字符串,a2。所以现在。
如果我们再次运行,这个警告应该消失。是的。现在我们看到它只打印了张量。这是一个只有一个标量值的张量。我们还可以通过给定形状参数来指定形状。这是一个元组。在这种情况下,我们可以说它是 1x1。然后我们还可以,例如,给它一个数据类型。
现在我们可以说 T F dot float 32。所以现在如果我们再运行一次,我们应该能看到这里的区别。所以现在,是的,我们也看到形状是 1 乘 1。所以现在它不仅是一个标量值,而是一个矩阵,并且我们有一个不同的数据类型。这是只有一个值。当然,我们也可以在这里放入一个列表。所以我们可以说。
例如,1 和 2 和 3。现在我们有一个 1 D 张量。所以在这里我们看到形状是 3。在这种情况下,我们可以说这是所谓的等级 1 张量。当然,我们也可以放入一个列表的列表。所以让我们创建另一个列表。第一个是这个。现在让我们创建另一个列表。这次必须使用 4,5 和 6。在这种情况下。
这是一个等级 2 张量。所以现在让我们再次打印这个。让我们看看形状。😊。在这里我们看到我们的张量,形状是 2 乘 3。这意味着我们有两行三列。所以在这种情况下,我们手动创建了值,但还有一些方法可以用某些值填充我们的张量。
例如,我们可以说我们的张量是 T F dot ones。然后我们可以将其形状作为元组传递。所以让我们说三乘三。这是一个 3 乘 3 的张量,仅填充 1。所以在这里我们有它,我们看到这里的默认数据类型是 float 32。如果我们不指定任何类型。与 ones 类似,我们也可以使用 zeros。这将做同样的事情,只是将我们的张量填充为 0。
所以在这里我们看到我们的 0 号张量。然后还有一个方法叫做 Tf dot I,这个只接受一个单一的值。所以在这种情况下,我们放入一个三。所以这将创建单位矩阵,其中对角线矩阵或对角线填充为 1,其余填充为 0。这就是 I 函数。然后还有一些方法可以用随机值初始化我们的张量。
所以为此,我们可以,例如,使用 Tf dot random,然后从正态分布中抽取一些值。所以正态。然后在这里,我们再次需要形状。所以我们使用 3 乘 3。并且在这里我们可以指定均值。所以默认情况下,这个值是 0,标准差默认是 1。所以让我们打印我们的随机张量。这里我们可以看到随机值大约在 0 附近,我们也可以使用均匀分布而不是正态分布。
我们可以通过说 Tf do random dot uniform 从均匀分布中抽取值。然后我们再次需要形状。在这里我们可以指定最小值。所以让我们说这个等于 0,最大值等于 1。这意味着我们所有的值都在 0 和 1 之间,并且它们是均匀分布的。
所以在这里我们得到了我们的新随机张量。现在我们也可以使用 T F dot range 函数。这与正常的 Python range 函数类似。所以现在我们有值在 0 到 9 之间。哦,当然,我必须打印它。所以让我们清除这个并再运行一次。所以是的,这是我们的范围张量。现在让我们看看,默认情况下,这个数据类型是 in 32。
假设我们想要更改这个。我们想要转换我们的张量。我们可以通过说 X 等于 T F 的 cast 来做到这一点。然后再次指定我们要转换的张量,数据类型等于,让我们使用 T F 的 Float 32。然后打印我们的新张量。再次注意,我将其分配给新值,因为原始张量是不可变的。
让我们运行这个。然后我们看到我们得到相同的张量,但现在数据类型不同。这就是我们如何转换张量的。现在让我们讨论张量上的操作。这里重要的是所有操作都是逐元素的。因此让我们创建两个张量 x,等于 T F 的常量和一个列表 1,2,3。
让我们用一个新张量 Y 来做同样的事,它的值为 4,5,6。那么现在,比如说,我们可以通过说我们有一个新的张量 C 等于,然后使用 T F 的 x 和 y 来进行逐元素相加。如果我们现在打印我们的 C,那么让我们清除这个并运行它。哦,这里我有一个拼写错误,当然。所以再来一次。
让我们清除这个并运行它。然后我们看到新的张量是 5,7 和 9。这是因为我们在这里进行了 1 加 4 等于 5,2 加 5 等于 7 和 3 加 6 等于 9。所以所有操作都是逐元素执行的。这一点很重要。因此,除了使用这个函数,我们也可以直接使用 C 等于 x 加 y。
这做的是同样的事情。如果我们打印这个,我们应该能看到相同的结果。然后,除了加法,我们还可以通过调用 T F 的减法函数或简单地说 x 减去 y 来使用减法。再次,这做的是同样的事情。然后我们可以通过说 T F 的除法函数进行逐元素除法。或者我们可以使用这个运算符来除我们的张量。
然后我们可以通过调用 T F 的乘法函数或再次使用星号运算符进行逐元素相乘。接着,我们可以通过调用 T F 的点积函数,即 Tensor.Dot,然后是 x 和 y 来计算点积。在这里我们需要指定 x 等于一。因此,让我们清除这个并运行它。现在我当然要移除这个。那么,让我们再次运行它。
这会生成一个单一的值。我们在这里做的是计算这些值的乘积,然后加总所有值。所以 1 乘以 4 加上 2 乘以 5 加上 3 乘以 6。因此这是一个单一的值。然后我们可以使用双星号运算符进行逐元素的指数乘法。比如说 C 等于 x 的三次方。那么让我们运行这个。
在这里我们得到 1 乘以 1 乘以 1 等于 1,2 乘以 2 乘以 2 等于 8,以及 3 的三次方是 27。这就是逐元素的指数乘法。然后让我们进行矩阵乘法。为此,我们需要使用随机函数创建两个新张量。所以在这种情况下,让我们使用随机正态分布,并设置形状为 2x2,y 也使用相同的。
然后进行元素级矩阵乘法时,我们可以说C = T F.dot.matmul,然后X和y。让我们再次打印这个。然后在这里我们看到我们得到了矩阵乘法结果。在这种情况下,我们必须小心。所以在这里,形状必须匹配。因此,我们的第一个张量的列数必须与第二个向量的行数匹配。
所以这个维度,例如,如果我们在这里使用3,也必须匹配这个维度。所以在这里我们可以使用3x4,例如,唯一重要的是这两个数字匹配。所以现在让我们再次运行这个,看看它是否有效。所以是的,这里我们得到了结果,得到的形状是2x4。所以这两个数字基本上保持不变。
所以这是矩阵乘法,我们也可以用@符号重载它。所以我们可以说x @ y。这是做同样的事情。然后我们来谈谈切片。切片和索引。这与numpy数组或Python列表是相同的,因此我们可以以不同的方式访问它们。所以让我们创建一个常量张量,有两个维度。所以一个列表的列表,假设是1,2,3。
和4,还有另一个列表5,6,7,8。现在,比如说,我们想访问只有第一行。我们通过说x,然后索引0来获取这个。所以让我们清除这个并运行它。然后我们看到只得到1,2,3和4。然后我们也可以在这里使用冒号和逗号。所以这意味着在第一维中,我们想要所有内容。我们想要所有行。
但是只有第0列。所以让我们打印这个。我们看到得到的是1和5。我们也可以反过来做。所以我们可以说只有列。只有第0行和所有列。所以这基本上是一样的。如果我们在这里只使用0,那么我们应该得到1,2,3和4。所以是的,这里我们得到了结果。再一次。
这里我们可以指定开始和结束索引。所以默认情况下,它是从开始到结束的所有内容。但是当然,我们也可以指定开始。那么假设是1,假设是3。那么最后一个是不包括的。所以现在只使用索引1和索引2。所以我们应该只得到2和3。所以是的,这有效。
所以在这里我们只得到2和3。现在,如果我们在这里放入两个单独的值。然后我们访问一个特定元素。所以在这里,假设我们在第0行,我们想要第1列。所以这应该是值2。让我们打印这个。好吧,所以这里我们看到值2。所以这有效。所以这就是我们如何应用索引和切片。现在让我们谈谈张量的重塑。
所以再一次,让我们创建一个随机张量,假设使用T F.dot.random.uniform。我们使用正态分布,形状应该是2x3。所以让我们先打印我们的x。清除这个并运行它。然后我们看到我们的形状是2x3。所以让我们重塑我们的张量。我们可以说我们的新x应该是T F.dot.reshape。
然后原始张量再次是我们的x。而且在这种情况下,新形状是3乘2。我们来打印我们的x。然后这应该可以工作。哦,我忘了这里的X。所以再次,让我们运行这个。当然,我们只能使用匹配的形状,以便可以应用于这些原始形状。所以在这种情况下,它是有效的。
我们也可以,例如,仅使用一个形状和六个值。所以两次3等于6。这就是为什么6在这里也能工作。所以现在我们有一个形状为6的张量。所以只有一个1D数组。你也可以在这里使用-1。例如,如果我们说-1,然后是2,那么它会自动为你确定正确的形状。所以在这种情况下。
这应该再次是3乘2。所以在这里我们看到形状是3乘2。所以这有效。因此,是的。正如我所说,最开始张量有点像numpy数组。所以你可以将张量转换为numpy数组,反之亦然。那么我们来看一下如何转换为numpy数组。这非常简单。所以你只需说我们的X。
或者说,在这种情况下。是的,让我们使用X等于x,然后调用numpy函数。所以现在如果我们打印我们的x,那么它应该看起来一样。如果我们打印X的类型,那么我们应该看到这确实是一个numpy数组。所以让我们运行这个。所以是的。我们看到我们的x与张量具有相同的值,但现在我们看到它是一个numpy数组。
要将其转换回去,我们可以说x等于TF.dot.convert,然后下划线到张量,然后再次将numpy数组放入。现在如果我们再次打印这个的类型,那么我们应该看到这又是一个张量。所以是的,这有效。因此我们看到这是一个张量流的急切张量。你现在不必担心这个。
急切张量的意思是,它立即计算操作,而无需构建我最开始提到的计算图。😊,所以,是的,正如我所说,你现在不必担心这个,只需知道这就是一个张量。这不仅仅是因为我使用了这个转换为Tor函数。所以所有这些常量值。如果我使用TF.dot.random_normal或者TF.dot.constant,然后在这里加一个值。
所有这些都是E张量。因此在这里,我们再次看到这个的急切张量。所以是的。这些都是我想展示的所有函数。现在,还有几件事我想提到。所以在这里,我们可以用字符串,而不是使用数字,例如,获取一个字符串张量。我们来打印我们的新字符串张量。
让我们清理一下并运行这个。所以在这里我们看到我们得到了一个数据类型为字符串的张量。同样,在这里我们可以使用列表,生成一个一维字符串张量。所以,例如。我们可以使用另一个名字,还有另一个名字,Max和me。现在如果我们运行这个,那么我们看到我们有一个具有多个值的不同形状的字符串张量。
这也在工作。还有一件事我想提到。因此,正如我所说,我们使用了常量张量,它们是不可变的,但还有另一种类型的张量。这是一个 tensorflow 变量。因此,举例来说,让我们用常量函数使用 1、2 和 3。我们可以用 T F 点(大写 V)和变量做同样的事情。
现在如果我们打印这个。所以现在我们看到它看起来是一样的。 但我们也得到提示,这这是一个 tensorflow 变量,当你想修改其值时应该使用变量。因此,例如,tensorflow 变量用于存储模型参数,我们在训练期间更新这些参数。但你现在不需要担心这个,因为我们将使用更高级的 API。
这就是 Kas API。它为我们做所有这些事情。所以我们不需要担心使用变量然后更新权重。但你应该知道这存在。这与 tensorflow 常量不同。是的。我想这就是我想向你展示的关于张量的全部内容。
希望你喜欢这个教程。如果你喜欢,请点击喜欢按钮,并考虑订阅频道。希望在下一个视频中见到你。😊。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P3:L3- 第一个神经网络(训练、评估和预测) - ShowMeAI - BV1TT4y1m7Xg
🎼,嘿,大家,欢迎来到第三个 Tensorflow 教程。今天,我们将构建我们的第一个神经网络。我不会在这里解释理论,而是专注于实现,但我会在描述中提供一些链接,如果你想了解更多内容。我也会提供幻灯片以及我的 GitHub 项目中的代码。
我们实现的神经网络看起来是这样的。我们的神经网络有多个层,它接收一个输入图像,然后处理这个图像,最后产生每个类别的概率。😊,所以我们这里有一个多类分类问题。这意味着最后我们使用 soft max 层来获取概率。
这就是我们要编码的内容。我保证最终的代码看起来相对简单,因为 Tensorflow 为我们处理了很多事情。因此即使是初学者也应该能够构建这样的神经网络。Tensorflow 提供两种不同类型的 API,Kaas 顺序 API 和子类化 API。Kaas API 抽象了很多东西,使实现算法变得更加容易。
所以他们说这个适合初学者,而另一个适合专家。我认为这不是一个好的描述,因为我认为 Kaas 不仅适合初学者,也同样适合有经验的程序员。因此这是一个很棒的 API,你可以实现很多东西。
只有在你需要更多灵活性时,你才可以或应该切换到子类化 API。😊。
在这个初学者课程中,我们集中在 Kaa 顺序 API,但我会在后面的剧集中涵盖子类化 API。所以现在让我们使用顺序 API,跳转到代码。我已经导入了 Tenofflow,并像上一个剧集那样屏蔽了一些警告,所以你不用担心。
现在让我们开始使用 Kaas API 实现我们的网络。因此,我们也从 Tensorflow 导入 Kaas。由于 Tensorflow 2,已经包含这个内容。因此在此之前,它是一个单独的 API。但现在它已完全集成。所以我们还导入 nuy S N P,另外导入 matplot Li do pi plot S PLT,因为我想给你展示一个图。
现在我们先获取数据集。在这个教程中,我们使用的是 Mnis 数据集,这是一个著名的手写数字分类数据集。这个数据集包含在 Kas do 数据集中。接着我们通过声明 x train 和 Y train 获取训练和测试集,然后是逗号,再是另一个元组,然后是 x test 和 y test。这是 Mist.dot.load data。
我们必须在这里使用两个元组,因为这是load data返回的内容。然后,例如,让我们打印X train.shape。还让我们打印Y train.shape。现在让我们打开终端。我已经在安装了Tensorflow的虚拟环境中。所以让我们运行这个文件。这是这个文件。让我们看看形状。
我们看到我们的x训练有这个形状,因此我们有60000个训练图像。每个图像的大小为28×28,然后我们有60000个与数据对应的标签。顺便说一下,这现在是NumPy数组,因此这不是一个张量,但我们仍然可以将其用于我们的模型。所以我想做的第一件事是归一化数据,因为现在。
图像的值在0到20055之间。我们想要将其归一化,使值在0到1之间。因此我们说x训练和x测试等于,然后我们说x训练除以255作为浮点数。第二个是x测试除以255。这样我们可以在一行中处理这两个数据集。现在让我在这里复制粘贴一些代码。我想绘制数据。
所以我们只说PTI来绘制6个不同的图像。前六个数字。让我们运行这个,看看图的样子。好的,这就是图的样子。这里我们看到手写数字,非常简单。这就是我们要分类的内容。让我们去掉这个,构建我们的模型。让我们构建我们的模型。正如我所说的。
我们使用顺序API。所以我们设置model等于。这是ks.model.sequential。在这里我们传入一个包含所有不同层的列表。与这里类似,我们希望有不同的全连接层。
所以我们从ks.layers.flatten开始。这将我们的图像展平,以减少这一维度,从28×28变为1维。然后我们将使用我们的第一个真正的全连接层。所以我们说ks.layers.dense。这个稠密层是在Keras API中的全连接层。在这里我们必须指定输出,这是一个我们可以指定的隐藏大小。
所以我将使用128,但你可以在这里使用不同的值。😊。然后我们还说activation等于relu。所以我们将使用relu激活函数。如果你再看一下这个图,通常这些层后面都有激活函数。我有一个关于激活函数的完整教程在PyTorch初学者课程中。
但是相同的概念也适用于这里。所以我会在描述中放入链接,你可以查看。但基本上你应该知道的是,它引入了非线性,并改善了训练。它使我们的模型更好。因此,我们应该在每一层后使用激活函数。
然后我们就用一个在中间。然后使用我们的最终层。这又是一个稠密层。😊。
现在我们需要指定10个输出。所以我们希望有。我们确实有10个不同的类别。每个类别我们需要一个输出。在这个简单的例子中,我们只有两种不同的类别:狗和猫。这就是为什么我们只需要两个输出层。但在我们的例子中,我们有10个类别。所以这必须是10。这必须是10。
但你可以调整这个大小。正如我所说,我们想要得到概率。这就是为什么我们需要一个soft marks层。所以我们可以通过说ks dot layers dot soft marks来包含它。但实际上在文档中,他们说这不推荐。
但相反你应该。
在你的损失函数中稍后包含。因此我们暂时不考虑这一点。现在这就是我们模型所需的一切,我们的模型可以自动确定正确的输入大小。我们只需指定输出大小。但假设在创建后,我们想调用model dot summary并打印出来。目前这不起作用。
但是如果我们指定第一个输入大小。在这里我们可以说input shape等于28乘28。那么这样就有效。但你不必这样做。你也可以在后面将其适配到训练数据时让它自动计算,但那样你只能在编译模型后打印。
所以在这里包含这一点是一个好习惯。现在我们保存并再次运行,然后我们将打印模型摘要。在这里我忘了加一个S。所以它叫Kara dot model dot sequential。好的,这里是打印的摘要。所以它打印出所有不同的层。在这里我们看到第一个展平层。
这是形状784。所以这是28乘28。它将其减少到一维。这不是我们需要训练的实际层。所以它没有参数。我们有第一个输出形状为128的稠密层。然后是第二个输出10的稠密层。在这里,第一个只是none。
所以这是我们还不知道的样本数量。😊。然后我们也看到了总参数和可训练参数。所以,是的。现在我们已经有了模型。顺便说一下,我想你可以看到使用这个顺序API是多么简单。此外,还有第二种使用顺序API的方法,可以像这样设置你的模型。
然后在每一层分别进行。所以你可以调用 model dot at。然后使用这一层。然后你看到,比如说,model dot at。然后你使用这一层。😊。Model dot at 第二层,然后 model dot at。最后一层。所以这在做同样的事情。但这就是现在的优势,你可以在每个操作后打印模型摘要,弄清楚你的训练情况。
所以,嗯,请记住你也可以这样做。所以我们只会使用第一个。然后再次注释掉这个。所以现在我们有了我们的模型,接下来我们需要的是损失和优化器。在多类分类问题中,通常我们使用类别交叉熵。
所以我们说损失等于,然后我们说 ks dot losses。然后这里实际上叫做稀疏类别交叉熵。这是因为我们的 y 是一个整数类标签。所以是 0、1、2、3 或类似的。因此我们使用这个,有时标签也编码为 one hot。
所以对于类 0 是 1,然后对于其他类是 90s。所以在这种情况下,我们只是使用类别交叉熵,但在我们的案例中,我们使用这个。而且我们也说 from logics 等于 true。这是因为在最后,我们没有包含 soft marks。所以我们仍然有原始数字,原始 las。
所以我们必须使用这个,否则训练效果不会很好。然后我们需要创建一个优化器。所以我们说 Kas dot optimizers。然后这里,让我们使用 Adamom 优化器,这是一个非常流行的优化器。我们需要给它一个学习率。所以我们说这是 0.0001。这是你在开始时应该调整以获得好结果的最重要的超参数之一。
所以随意尝试一下。然后我们也定义了一些我们想要跟踪的指标。在这种情况下,这应该是一个列表。我们这里只想跟踪准确度指标。因此当我们有这个时,我们调用 model dot compile。这是我们在 Tensorflow 框架中所做的。然后我们说我们的损失等于损失。
我们的优化器等于优化器,指标等于指标。所以这将为训练配置模型,之后我们可以开始训练。所以让我们定义批量大小并将其设置为 64,设置我们训练的 epochs 数量。所以这里我只使用 5 个 epochs,然后我们可以简单地调用 model dot fit,我们想要拟合 x train 和 y train。
所以我们的训练数据,我们指定批量大小等于。批量大小。然后 epoch 等于 epoch。然后我们说 shuffle 等于 true。这是默认值。但我想强调的是,在训练期间你应该始终这样做。然后让我们将 ver 设置为 2。这只是用于日志记录,0 表示没有输出,1 表示进度条,2 表示正常日志记录。
所以这就是我们训练模型所需做的一切。再说一次,我们使用顺序 API 来构建模型。然后定义损失函数、优化器和可选的汇总指标。所以这里不一定需要使用它,但我们可以。然后开始训练,使用 model.fit
。现在我们可以开始训练了。让我们运行这个。
现在我们看到它开始训练,并且在每个纪元之后,它打印出一些信息。因此,它打印出损失和准确率,因为我们指定了这些。我们看到,在五个纪元之后,我们已经得到了一个很低的损失。因此,它降低了,我们的准确率是 98%。所以我们的简单神经网络对于这个任务已经非常好了。现在,我们已经训练好了它。
接下来我们想要评估我们的模型。我们也可以非常简单地通过说 model = model.evaluate
来做到这一点,然后使用我们的测试数据。所以我们使用 X_test
和 y_test
。在这里,我们可以使用批大小并将其设置为我们的批大小。我还设置了 verbose = 2
用于一些日志记录。这就是我们评估的方式。
批大小意味着它处理一些批次并在这些批次上进行计算。这可以加快训练和评估的速度,甚至改善训练。所以让我们再运行一次。现在我没有保存模型,所以我需要再次训练它,然后进行评估。让我们运行它。在以后的章节中。
我们学习了如何在训练后保存我们的模型。好的,训练完成了。再说一次,我们看到了五个不同的纪元,然后我们有一个用于评估的打印语句。我们看到,测试集的准确率稍微降低了,但仍然非常好。所以现在我们已经有了一个很好的训练模型来分类手写数字。
现在让我们看看如何用我们的模型进行一些预测。我们有几个不同的选项。再一次!
将其放在这里作为最后一层,但它在训练过程中已自动包含在内。不过现在我们需要它。所以我们的第一个选择是创建一个新的模型。我们将其称为概率模型。这也是一个 keras.models.Sequential
模型。在这里,我想给你展示一件新事物,我们可以将整个模型传入其中。
我们可以使用我们原来的模型。现在它拥有这个模型的所有层。现在我们使用 kra.layers.softmax
层。既然我们有了这个,我们可以调用这个概率模型。所以我们说 predictions = probability_model
,然后传入测试数据 X_test
。
现在我们有这个。例如,我们可以通过说这是预测索引0来获取第一个预测。让我们在这里打印这个。所以打印预测0。这是概率。因此现在我们想选择概率最高的类别。我们可以通过调用arc max函数来实现这一点。因此我们说标签0等于nuy.dot arc max。
然后是这个预测pre 0,然后打印标签0。所以现在让我们保存这个。现在我再次运行训练和评估,然后为你打印这个。好吧,完成了。在这里它打印出预测0。所以对于。
每个类别都有一个概率。然后我们获取具有最高概率的标签或索引。在这种情况下,这是索引7。所以我认为是这个。9.49。这是最高的。因此,是的,这可以工作。这是实现它的第一种方法。第二种方法是分别使用我们的原始模型加上soft marks。因此我们可以说和我们在这里做的一样,预测等于。
然后我们调用原始模型并传入x测试。接着我们为自己应用soft marks。因此我们说预测等于Tens offlow.dot N N.dot soft maxs。在这里我们放入预测。现在我们得到了和这里相同的结果。让我们打印这个。😊,然后当我们运行这个并打印时。
那么我们应该看到完全相同的数字。哦,抱歉,我暂时停止了这个。因此我在这里忘记获取预测0,这样我们就可以看到这里是相同的。让我们清除这个并再运行一次。好吧,所以我们的训练完成了。在这里你可以看到它打印出完全相同的数字和相同的类别标签。
你可以这样做。然后作为第三种选择,而不是像这样调用模型和模型。你也可以调用model.dot predict。然后是数据。在这里你也可以指定批大小等于批大小。然后它会为每个批次计算。这也是你可以做的。再一次。
数字应该是相同的。现在我们不仅仅要得到一个预测。假设我们有两个或五个不同的预测。我们称之为0,5s。然后我们通过预测并使用从索引0到索引5的切片来得到这个结果。现在我们先为你打印pre0,5的形状。现在如果我们对这个调用arc max。
现在假设我们的标签0,5s等于,然后如果我们获取预测。如果我们调用nuy.dot arc max,并使用这5个预测。然后我们还必须指定x。在这种情况下,我们想沿着xs 1进行计算。现在我们应该得到五个不同的标签。打印标签50s。现在让我们清除这个,再运行一次,希望这能成功。
好吧,所以这就完成了。我们看到,再次通过这个模型预测,我们得到了相同的数字。然后这是我们的形状。所以是5乘10,即五个不同的样本和预测。对于每个预测,有10种不同的概率,如这里所示。如果我们沿X 1调用arcms。
然后我们得到了五个不同的标签。因此,第一次标签是这里的标签7。这些是接下来的预测。是的,这就是你如何进行预测。我认为这就是你需要知道的,以构建你的第一个神经网络。因此,再次强调,你构建你的顺序模型,然后设置损失和优化器,然后编译模型。
然后你调用模型拟合和模型评估。然后当你想进行预测时,可以调用模型预测。不过,别忘了如果你想要实际的概率,记得调用软标记。是的,我想目前就这些。我希望你喜欢这个教程。请点击喜欢按钮,并考虑订阅频道。
我希望在下一个视频中见到你。😊。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P4:L4- 线性回归 完整项目演练 - ShowMeAI - BV1TT4y1m7Xg
🎼,大家好,欢迎来到下一个 TensorFlow 教程。在上一个视频中,我们学习了如何创建神经网络,然后训练和评估模型并进行预测。😊,在本教程中,我们实现我们的第一个真实世界项目,因此我们处理回归问题,学习如何加载数据。
分析数据并进行一些预处理。是的,正如我上次所说,我们已经使用了深度神经网络。这里我们先退一步,仅应用线性回归模型。所以只有一层。但最后,我们再次将其扩展为深度神经网络。通过这个,你应该能更好地理解 Keras 层。
还有激活函数。因此我在一个 Jupyter 笔记本中。你不需要担心这个,这只是让我在向你解释代码和展示不同步骤时生活更容易一点。但是你可以在普通的 Python 文件中编写所有这些代码。那么让我们开始,首先导入我们需要的东西。这里,我再次关闭了一些警告。然后我们导入 matplotlib。
这也是新的。因此现在我们使用 pandas。你可以通过 pip install pandas 来安装它。😊。这使得处理数据集、分析它们和修改它们变得非常简单。然后在这里我设置了一些打印选项,让输出看起来更好一些。接着我们从 TensorFlow 导入相关内容。所以再次导入 TensorFlow 的 tf,然后导入 Keras。
上次我告诉你关于 Kaas API 的事情,我们已经使用了 ks 层。现在这是新的。因此我们还从 TensorFlow 的 ks.layers 导入实验模块,导入 preprocessing 来对数据应用预处理层。这是我们需要的导入。现在开始处理数据集。
所以我们将使用这个 autompg 数据集。这个数据集来自1983年,这里有不同的特征,使用这些特征来预测汽车的 mpg。因此,汽车使用一加仑燃料能行驶多少英里,这里是一个非常流行的网站,你可以在上面找到很多机器学习数据集。如果你点击数据文件夹,下面你会找到实际数据的链接。
现在在这个 Jupyter 笔记本中,这是完全相同的 URL。我已经在上面写好了不同的列名,然后使用 pandas,我们可以说 pandas 能读取 CSV。因此这里的结尾不是 do csv,但它仍然是 CSV 格式的。所以我们可以使用这个方法,如果你在磁盘上有 CSV 文件,也可以使用这个方法。所以这也可以工作。现在让我们加载数据,然后可以调用 data.tail,这将打印最后五列。我们在这里看到想要预测的 mpg 值和不同的特征。
例如,我们有气缸数量、排量、马力、重量、加速度、车型年份等。因此,是的,这是我们的数据集,现在我们清理我们的数据集。在这里我们有一些缺失值,我们可以很简单地通过调用data.drop
来排除它们,然后我们也会改变最后一列,因为。
这实际上是一个分类值,其他的都是数值型值。所以这可能会让我们的模型感到困惑。因此我们想将其转换为独热编码数据。我们可以调用数据集的pop
方法或直接删除它。在原始数据中,我们有不同的国家,如美国、欧洲和日本。我们可以这样添加它们。现在,再次进行操作。
如果我们查看尾部数据,那么我们会看到我们移除了原始值,而是包含了独热编码标签。因此,对于标签1,代表美国;对于标签2,代表欧洲。然后,标签1又是这样。所以现在我们有了这个。现在我们想将数据分为训练集和测试集。我们可以通过调用sample
方法,并在这里使用一个比例来实现。因此,使用80%作为训练集。
然后我们再次删除样本。因此,所有我们在这里指定的样本都不包括在测试集中。然后,是的,让我们打印形状,并描述我们的数据集,因此我们也可以通过调用describe
函数很容易地做到这一点。然后在这里我们看到我们的整个数据集有392个样本,目前有10个不同的列。
然后我们的测试数据,训练数据占80%,即314,剩下的是用于测试的。现在如果我们调用描述函数,它会分析一些统计信息,如样本数量、均值、标准差、最小值和最大值。这可能有助于分析。首先,我们想要做的是将特征和标签分开。
我们想要的是我们的标签,以预测MP。首先我们做一个副本。因此,我们说这些是我们的训练特征和测试特征。然后我们简单地从训练和测试数据中删除MPG列。当我们这样做时,它也会返回数据。所以这就是我们现在的训练和测试标签。
现在我们有了这个。然后这是一个简单的函数,用于用matplotlib
绘制数据。现在让我们简单地绘制一个特征。因此,让我们绘制马力特征。我们将其与MPg值进行对比。所以我们看到,汽车的马力越大,MPg值越低。这是有道理的,因为我们的汽车功率越大,所需的燃料也就越多。
所以MPg值越低。而且我们也可以绘制重量特征,这应该有类似的分布。因此,汽车的重量越大,消耗的燃料就越多,而MPg值则越低。所以,是的,这就是我们的数据呈现的样子。现在如果我们回到描述函数,查看不同的均值。
然后我们看到这些都有不同的范围,这再次是一个非常重要的问题,我们必须考虑。因此,如果我们这样保持这些不同的范围,可能会使我们的模型感到困惑。因此,建议先对数据进行标准化。让我们再次打印,描述我们的训练数据集,但只打印均值和标准差。
如果我们再次运行这个,那么这里我们会看到不同的均值。现在为了标准化,我们使用了预处理模块中的这个标准化层。因此这里是我们导入的这个。让我们编码这个。因此我们创建一个标准化层。因此我们说normalizer等于pre.processing.dot.Normalization。
这是一个适用于顺序API的kas层。要调用这个,我们必须将其适应我们的数据。因此这里我们说,normalizer.dot.adapt。然后我们想要将其适应训练特征。目前,这是一个pandas数据集,所以我们可以将其转换为nuy数组,然后调用训练特征。
所以现在这个功能的作用是,简单地计算训练特征的均值和方差,然后将其存储在层中。因此,现在,例如,我们可以打印,然后使用normalr.dot.mean.dot.nuy。如果我们运行这个,就可以看到这里。这些是我们的均值,这些数字与我们在第一列看到的完全相同。因此这只是将其存储下来。现在每当我们将这个层应用于我们的数据时。
它会对特征进行标准化,以计算这个公式。因此,它减去均值,然后除以标准差。这意味着我们的输出具有零均值和单位方差。这里我们来一些示例。因此,第一个数据来自训练特征。然后,让我们打印这个。
所以这是第一个数据标准化。然后我们还想打印标准化后的数据。因此,让我们打印nor.Maized。然后这里我们需要用我们的数据调用这个normalr层。所以首先。然后将其转换为numpy。这是我们如何将TensorFlow张量转换为nuy数组。让我们运行这个。然后我们看到我们有第一层具有不同的尺度和范围。
现在我们的标准化数据。因此它们都在0附近,具有单位标准差。这就是我们如何应用标准化预处理层。现在让我们处理我们的回归问题。在回归中。我们在某处有这个从训练数据得知的分布。
现在当我们获得新数据时,我们想要,例如。这里我们获得一个新的权重样本,然后我们想预测这辆车的多少mpT。为此,我们拟合一个函数,即用这个公式拟合一个线性函数,这样我们可以用mp乘以x加上B来近似。因此,这基本上是一个线性方程,我们使用这个与密集层一起。
为了更好地理解这一点。现在,首先,让我们不要使用所有不同的训练特征。所以这些,让我们只使用一个,以便保持在二维情况下。在这种情况下,例如,使用马力。所以在这里让我们定义我们的特征,这应该是马力标签。我将这样实现,这样您就可以在这里更改特征,然后尝试不同的特征。
在这里使用权重,所以所有这些名称都可以作为特征使用。现在让我们获取单特征或单数据,称之为单特征等于Ny数组。从我们的训练特征中,然后我们可以通过特征访问它。这将只返回马力特征。所以让我们打印这个。打印单特征 dot shape。打印训练特征 dot shape。
所以现在,如果我们运行这个。嗯。这里我有一个拼写错误的数组。让我们再运行一次。然后我们看到我们的单特征只有一个特征。而在整个训练数据中,我们有9个不同的特征。然后在这里,我们创建了这个预处理或归一化层,并将其适应于所有特征。所以基本上我们必须做同样的事情,但现在仅适应马力特征。
所以我们再次称之为单特征归一化器,我们调用适应数据并适应单特征单下划线特征。所以现在我们有这个,可以运行这段代码,这里我有一个多余的括号。所以再次修正。所以现在我们有这个单特征。现在我们创建我们的顺序模型,就像上次一样。
所以使用Kaas API非常简单。嗯。所以,我们说,我们的单特征模型等于。然后我们说,Kas dot Models dot sequential。在这里我们使用一个包含所有不同层的列表。所以我们将这个作为第一层。单特征归一化器。然后我们只使用一层。所以一个密集层,输出或称为单位数的单位只有一个。
所以这就是我们构建线性回归模型所需的全部。这是一个线性回归或线性模型,完全应用这个公式。它有一些权重,并将其与我们的输入相乘。它还有一个偏置。所以这就是我们在这里所做的一切。让我们运行这个,并打印模型摘要。
然后我们看到有归一化层和密集层,只有五个参数。5个参数。所以这非常简单。接下来,和上次一样,我们定义一个损失和一个优化器。所以对于损失,我们使用ks dot losses。在线性回归的情况下,我们可以使用平均绝对误差。
所以这是一种可能性,我们也可以使用均方误差。所以你可以尝试两者。😊。所以这实际上是预测值y减去实际值y,然后取绝对值,最后对所有样本求和,计算均值,均方误差是相同的,只不过这里使用的是平方而不是绝对值。
所以试试看吧。现在优化器等于。所以和上次一样Kaas.dot.optimizers.dot。让我们使用Adam优化器。我们需要给它一个学习率。让我们试试0.1。然后在我们有了这个之后,我们编译我们的模型。所以单特征模型.dot.compile,compile。在这里我们给它。
优化器等于优化器和。损失等于损失。是的。上次我们也给了它要跟踪的指标,所以准确率。但在回归中准确率没有意义,所以我们不考虑。然后我们可以稍后看到损失。让我们运行这个。现在来训练模型。
我们只需像上次那样调用model.dot.fit,使用我们的训练特征,这里我们只希望定义的单个特征,所以在这种情况下是马力。但我们仍然包括所有训练标签,然后定义周期,在这里我将verbose设置为1以查看一些日志,我们还可以定义验证分割,这样自动将20%的训练数据用于验证数据,以调整超参数。
所以让我们训练我们的模型。现在,训练完成了。现在我们看到损失减少了,我们也看到验证损失在减少。最后,我们的训练损失是3.8,验证损失稍微超过4.1。所以并不算太差。顺便说一句,如果我们调用model.fit,那么它将返回历史记录,其中存储了这两个损失。
所以我们可以将其分配给一个变量,我在这里称之为history。然后我简单地绘制历史记录。接着,我们可以通过调用history.dot.history来访问这两个损失,然后访问损失和验证损失。让我们绘制这个,然后我们可以看到损失减少了,看起来非常不错。然后要评估我们的模型,我们就像上次一样简单进行。
调用model.dot.evaluate,只用我们的测试特征,即马力和测试标签。让我们运行这个。这非常快。所以在这里我们看到。测试数据的最终损失为3.6。所以并不算太差。现在让我们预测一些样本。因此在这种情况下,我简单创建了测试数据。所有值在。
最小值和最大值之间,并增加范围一点。你也可以在这里直接使用一个硬编码的数字,比如从0到250。但我想让它更适合使用的特征。所以我们使用这个。然后要进行预测,我们调用model.dot.predict。然后是我们想要预测的新测试数据。
然后我们用一开始的函数绘制它。这与一开始的图相同。因此我们绘制马力与MP7值的关系。这些是我们预测的新x值。我们看到我们的预测。因此在这里我们绘制一条线。这是一条线性线,因为我们使用的是线性回归模型。
我们看到情况还不错。因此,我们看到相同的趋势。我们的汽车马力越大,MP越低。但是,例如,在这个区域,除非我们的马力进一步增加,否则它保持不变。所以是的,在这个区域,也许在这个区域,它并不完美。但是在其余部分。
看起来还不错。所以,是的,这就是我们如何应用线性模型。再一次,我们只需要一个带有一个输出单元的密集层。我们还应用这个归一化层。因此,这就是我们进行线性回归所需的一切。现在让我们将其扩展为深度神经网络。正如我所说,只有一个密集层。
我们这里只能使用一个线性函数,这并不完美。因此,为了进一步改善,我们可以在这里引入更多层,将其转换为一个完全前馈的神经网络。所以我们简单地,仍然在最后使用归一化层和密集层。但是在中间,我们使用更多的密集层。假设,layers.dot.dense。
然后在这里你可以尝试不同的隐藏层大小。正如我上次所说,我们还对中间这些层应用激活函数。😊,所以我们是的,让我们像上次一样再用一次relu。然后我们再使用同样的。是的,然后在最后,我们用一个输出的密集层。现在这就是我们所需要的全部。
现在我们将我们的线性回归模型转换为深度神经网络模型。所以让我们使用这个。然后再次,我们用损失和一个adam优化器进行编译,并调用摘要以再次查看不同的层。然后我们看到现在有很多参数需要训练。因此现在再次。
让我们用我们的马力特征调用模型拟合并开始训练。😊,训练完成。我们看到最终模型或最终损失现在略微改善,所以比之前略低。让我们评估一下我们的模型。现在它低于三。因此它肯定更好。现在我们再做一些预测并绘制图表。现在我们看到一个新图。
现在我们看到我们的函数不再只是线性。但在这里我们也有一些非线性区域。😊,这是我们所使用的激活函数的效果。这就是为什么在神经网络中应用激活函数如此重要。因此在这里,我们再次只有一个带有一个密集层的线性回归模型。
在这里我们只能预测线性函数。而现在通过深度神经网络,我们可以获得非线性函数作为预测。所以是的。我想这就是全部,现在我们只使用一个特征,以便保持在这个二维案例中,但当然,我们可以包括所有特征,方式相同。
所以实际上我们不需要更改任何东西。我们使用这个标准化器,将其调整到所有的主要特征。在这里,我们只有一个密集层。然后我们编译它。接着我们将其拟合到所有训练特征上进行训练。现在,训练完成。我们看到损失也低于3。因此,使用所有特征进行训练效果很好。
此外,更好。现在让我们将其评估为最后一件事情。然后我们看到最终的损失。所以是的,你会看到代码实际上是相同的。我们只是在这里使用所有的训练特征,以及标准化器。我们将其调整到所有训练特征。因此,是的。
我想你现在在这个教程中学到了很多,关于如何下载和加载CSV数据,如何用pandas框架分析和预处理它,然后如何使用标准化层来标准化我们的数据,接着如何用这个密集层设置一个线性回归模型。
然后再次,训练和评估与上次相同。是的,我们也。你了解了激活函数在深度神经网络中的作用。就这样,今天到此为止。希望你喜欢这个教程。如果你喜欢,请点击赞按钮,并考虑订阅频道。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P5:L5- 卷积神经网络(CNN) - ShowMeAI - BV1TT4y1m7Xg
🎼,大家好,欢迎来到另一个 Tensorflow 教程。今天,我们将实现我们的第一个卷积神经网络。所以卷积神经网络看起来类似于第三课中的前馈神经网络。主要区别在于我们使用卷积滤波器,而不仅仅是密集层。
这里是一个典型的卷积网络架构。我们有输入图像,然后应用不同的卷积层和激活函数,比如这里的 ReLU。我们还应用池化层来减少图像的大小。最后,我们进行分类。这意味着我们在最后使用一个全连接层。
也被称为密集层,为我们每个类别提供输出。所以我们的卷积层使用卷积滤波器,滤波器滑动在图像上,然后😊,计算一个新值并将其写入输出图像。我这里不再详细说明,但我会提供一些链接,如果你想了解更多理论。
这里是另一个卷积滤波器的图像。一开始我们将其放在鼠标位置,然后计算卷积并将输出写入这里,然后我们滑动到下一个位置。所以在绿色的位置进行相同操作,然后滑动到蓝色位置再做一次。这就是我们如何计算卷积。接着我们还应用最大池化。
这也是一个滤波器,例如,这里是一个 2x2 的滤波器,我们将其放在第一个位置并计算最大值,比如这里的 20,然后写入输出。接着我们滑动到下一个位置并进行相同操作,依此类推。
这将减少我们的图像大小。这些就是我们要应用的所有概念。这是我们将要实现的架构图像。所以我们有输入图像,然后应用卷积加上 ReLU 激活函数再加上池化。然后再重复一次。最后我们将图像展平,压缩成一维,并使用全连接的密集层和 Softmax 激活函数,然后进行分类。
所以最后这一步和我们在第三课中使用的完全相同。因此我建议你先观看这一课,如果你还没有的话。现在我们可以进入代码。在这个例子中,我们将使用 CIFAR-10 数据集。这个数据集包含 60000 张 32x32 的彩色图像。
这里看到的不同类别,比如飞机、汽车、鸟、猫等。这就是我们要分类的内容。那么现在我们来看看代码。好的,我这里已经写了一些代码。这和第三课中的代码类似。所以我们再次导入需要的东西,比如 Tensorflow、Keras 和层。然后我导入 matplotlib。
然后我们使用ci进行10个数据集,它集成在Kara数据集中,我们可以将其分成训练图像和测试图像。现在如果你打印形状,我们看到,例如,训练图像有50000个样本,每个图像的尺寸是32x32x3,因为它有三个颜色通道。
然后我们归一化数据。我们希望它在0到1的范围内。然后这里我有不同的类名。我写了一个帮助函数来展示一些示例图像。所以我们运行到这里。现在如果我说Python,然后这个文件的名称。我们就会看到一些示例图像,这些图像非常模糊,因为我们的维度非常小。
但没关系。现在让我们停止这个。现在我可以删除这个绘图代码。我们不再需要这个了。
现在我们定义我们的Kaa顺序模型,就像上次一样。这是我们需要实现的。接下来的代码与教程3中的完全相同。因此,我们再次定义我们的损失和优化器。这里我们想要稀疏分类交叉熵,并且说逻辑等于真。所以它应用softm。这一点很重要。
然后我们定义一些想要跟踪的指标。然后我们必须调用model.compile,之后通过简单调用model.fit与我们的训练图像和训练标签来开始训练。然后,我们可以通过调用model.evaluate与测试图像和测试标签来评估它。所以,是的,这就是整个代码。现在这里唯一剩下的就是定义我们的模型。
所以现在让我们再看看。所以我们再次想应用。
具有激活函数和池化层的卷积层。然后再来一次。最后,我们希望展平并应用全连接层。所以让我们这样做。首先,添加一个卷积层。我们可以通过说model.at来完成。然后我们使用ks.layers中的一个层。这就是con2D层。
所以这是一个二维卷积层。首先,我们需要指定过滤器。这是卷积后的输出过滤器数量。这里我们说是32。然后我们需要指定内核大小。这里我们使用3x3的过滤器内核。接着,我还写了步幅。
这里是标题。所以步幅等于1和1。这只是默认值。我们希望滑动多少,以及在图像上滑动多远。填充等于有效。所以你可以选择有效或相同。这基本上是两种不同的规则。填充是如何应用的。我们这里说有效。然后,如我所说。
我们想要使用激活函数。所以我们设置activation equals Relu
。对于我们的第一层,我们还指定输入形状。这个是32x32x3。现在我们有这个。然后,在这之后,我们想要应用一个池化层。所以我们说model.add
。然后再次,layers.maxPooling2D
。在这里,我们也可以定义池大小。所以在这里。
我们默认使用2x2,或者我可以再次为你写出来,让它更清晰,所以我们使用一个2x2的最大池化层,然后再做一次。所以我们复制并粘贴这个。这里我们移除输入形状,因此我们不再需要这个。
让我们也去掉这个,因为这只是默认设置。然后在这里我想告诉你,可以为每个维度指定一个值,或者可以只指定一个整数值。这样对于每个维度都是一样的。再来一个最大池化层。现在我们想要。
再看看。现在我们想要扁平化,然后应用全连接层。所以现在我们添加model.add
,然后layers.flatten
。
所以我们将其挤压成一维,然后说model.add
。我们想要添加一个密集层。所以layers.Dense
,在这里我们设置隐藏层大小为64,同时也有一个激活函数。然后在最后我们再做一次。所以model.add
一个密集层。现在我们必须指定10个输出类。
在这里我们不想要激活函数,因为我们对损失设置了loss equals true
。现在这就是我们所需的所有内容。这是我们的第一个卷积神经网络。现在,比如说,我们可以调用打印,然后打印模型的摘要。现在,暂时先停在这里。我说导入cis
,然后cis.exit
。
所以到这里就停止,不要开始训练。我们再运行一次,看看它是否有效。好吧,现在这个有效。这里打印出摘要。然后,我们可以检查不同层的输出形状以及每层的参数数量。所以,是的,这基本上是我们卷积神经网络的概述。现在我们可以去掉这个。
和上次一样,我们编译模型,拟合它并评估它。让我们运行它。清理一下,然后开始训练。好吧,训练完成。我们看到损失下降,准确性随着每个周期提高。最后,我们有一个最终评估准确性。所以它还不完美,准确率只有65%。
但我们只训练了5个周期。所以我相信如果我们训练得更久,这会变得更好。所以,现在你可以看到我们的卷积网络在工作。你知道如何定义和设置你的模型。现在你可以,比如说,调整学习率或尝试不同的架构。然后你可以进一步提高准确性。所以,是的。
我希望你喜欢这个教程,请点击点赞按钮并考虑订阅频道。希望在下一个视频中见到你!
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P6:L6- 保存和加载模型 - ShowMeAI - BV1TT4y1m7Xg
🎼,嘿,大家,欢迎来到下一个Tensorflow教程。在这一集中,我想向你展示如何保存和加载我们的模型。使用Tensorflow API这非常简单。所以让我们看看我们是怎么做到的。在这里我有和第3个教程相同的代码,我们实现了一个简单的前馈神经网络,并将其用于Mnes数据集。😊。
所以在我们定义模型后,我们编译并拟合它。我们开始训练,然后进行评估。之后,我们想保存我们的模型,这里有三种不同的选项,我想向你展示这三种,因此我们可以保存和加载整个模型。
我们可以只保存权重,或者只保存架构。所以让我们从整个模型开始,这非常简单,我们只需说模型保存,然后指定文件名,这里有两种不同的可能格式可供使用,因此我们可以使用Tensorflow保存的模型格式或使用HDf5格式,这取决于我们使用的后缀。例如。
如果我们仅使用NN表示神经网络,文件名没有后缀,那么它将使用这种格式。如果我们指定后缀H5,那么它将使用这种格式。因此两者在Tensorflow文档中都正常工作,他们建议使用这种格式,但我认为这种格式也可以。因此你可以两者都使用。
所以让我们使用这两种格式来向你展示差异。所以让我们使用另一个神经网络,称之为没有后缀的神经网络。现在如果我们运行这个,它将开始训练,训练后,它应该以两种格式保存模型。因此我们说。Python,然后是这个文件的名称。
所以这是第6个教程。好了,训练已经完成,并且我们的模型已保存。我们看到了H 5文件。至于另一个,我们只是使用神经网络。然后它使用了保存的模型格式。对此,它会创建一个包含文件的整个文件夹。因此两者都正常工作。然后为了加载它。
让我们使用一个新模型。我们可以通过说新的模型等于Kaas.dot.model.dot.load_model,然后是相同的文件名来加载它。所以让我们使用N.dot.H 5。现在我们有了它,可以做同样的事情。因此现在如果我说新模型.dot.evaluate,那么这应该会产生完全相同的结果。现在我们可以删除所有这些。因此我把它留在这里,以便它。😊。
第一次评估和第二次评估,这样我们可以看到这是相同的。在这里我想提到,上次对于指标,我们只是使用了名称准确性。在当前的Tensorflow版本2.3中,有一个问题。如果你使用字符串,然后在加载这个特定的损失后,它将不会产生相同的结果。
所以你应该在这里使用这个kas矩阵对象,然后它运行良好。但这将在版本2.4中修复。让我们运行它。然后我们应该看到原始模型和加载模型的完全相同的评估结果。好的,这里我们有它。所以这里是原始模型的评估。
然后在加载之后,我们得到了这个。这是完全一样的,别担心这个警告。如果我们使用保存的模型格式,这个警告会出现。但我认为这也是一个缺陷,应该在下一个版本中修复。所以,是的,我认为现在我们看到了如何保存和加载模型。所以就是这么简单。
我们只使用model dot save
,然后可以再次调用Kara models load model
。然后我们得到了完全相同的模型。这就是我们如何保存整个模型。现在如果我们只想保存权重,我们也可以非常简单地做到这一点。所以我们可以保存model dot save weights
,然后叫做and dot weights dot H 5
。
这里我们再次有两个选项。有文件名后缀或者没有。如果我们想加载权重,那么我们需要像这里那样设置我们的模型。然后在不训练的情况下,我们可以简单地说model dot load weights
,然后是这个文件名。所以N dot weights dot H 5
。所以在这里,我们需要初始化我们的模型。现在。
作为最后一个选项,如果我们只想保存架构,我们可以通过说our cha string equals
来获取架构的Cha字符串,然后使用model to Chasson
,这会将我们的模型架构保存为Cha字符串。然后,例如,我们可以保存这个,所以我们可以说with open
,然后是我们的文件名。
所以N and model
,我们想以写模式打开它,然后是S F
。然后我们说F dot right our Cha string
,加载时也是一样。因此在加载时,我们做同样的事情,说with open
,然后是同样的名称和end dot model
,然后在这里以读模式作为F
。然后我们可以说our loaded Cha string equals
,在这里我们说F dot read
,所以我们不需要在这里导入Cha模块。
这已经在TensorFlow API中实现了。当我们加载了Cha字符串时,我们可以通过说new model equals Kas dot model dot model and then underscore from Jason
来设置我们的模型。然后在这里加载的Jason字符串。现在这里,这将只加载架构。如果我们说print new model dot summary
,那么它看起来会是一样的。
但这里还没有权重。因此我们仍然需要训练它。但没关系,现在你有了三种不同的选择。我认为第一种是最简单的,但也是最贵的。所以有时候你只想保存权重或仅仅是架构。所以,现在你知道使用TensorFlow API是多么简单。
然后你可以开始保存和加载你的模型。没错,这就是现在的内容。希望你喜欢这个教程。请点击点赞按钮并考虑订阅频道。希望在下个视频中见到你。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P7:L8- 乐高星球大战小人仔分类任务 完整项目流程 - ShowMeAI - BV1TT4y1m7Xg
🎼,大家好,欢迎来到另一个 Tensorflow 教程。今天,我将进行另一个完整的项目演示。我认为这个项目会很有趣,因为我们将使用来自 Kaaggle 的真实图像数据集,包含乐高星球大战小人仔。我们要对角色进行分类。因此,在这个过程中,我们将学习如何下载和组织我们的数据,以及如何将图像加载到 Tensorflow 中并进行预处理。
然后我们设置一个卷积神经网络,训练它并保存我们的模型。在这个过程中,我还会介绍一些新概念,比如图像增强和 Keras 回调。所以我希望你能坚持到最后,我们将看看能否正确识别卢克·天行者。这是可在 Kaggle 上获取的图像数据集,我会在描述中放上链接。
然后你可以直接点击下载并下载数据。我已经做过这一步,并将其复制到我的项目目录中。😊,在这个乐高文件夹中,我们有一些不同的类别,比如哈利·波特和侏罗纪世界。但现在我只会使用星球大战的人物,以便于你更容易跟上。
所以我们来复制这个文件夹,以便我们有一个备份,因为我们将稍微重新组织数据。我们将其重命名为星球大战图像。然后在这里,我们有10个不同的类别,但现在我只会使用前五个。这样做是为了让你更容易理解。现在我们来看看这些图像。所以现在在这个星球大战图像文件夹中。我们有。
例如,class1。这是尤达。
class2 是卢克·天行者。
然后我们还有 R2-D2,还有麦克斯·温度。最后一个角色是格里夫斯将军。所以这些是我们想要识别的角色,现在我想做的第一件事是稍微重新组织一下这个文件夹结构。这样你就可以像这样加载它,同时你还可以通过每个目录中的元数据进行加载。我想让它简单一点,这样我们就可以轻松加载到 Tensorflow 的图像加载器中。
所以我想将数据集分为训练图像、验证图像和测试图像。我们在这里创建三个文件夹,然后在。
在每个文件夹中,我们会为每个角色创建图像。例如,我们有一个训练文件夹,然后在子文件夹中,我们有一个关于尤达的文件夹,卢克·天行者等等。所以这是我们要做的第一件事。在这里,我在一个 Jupyter notebook 中,我们导入所需的内容。
然后这里我命名了包含图像的基本目录,然后我硬编码了每个角色的名称。这五个角色,我还设置了一个随机种子,使其更具可重复性,现在我们要做的第一件事是创建不同的文件夹。
所以我们当然可以用Python自动化这个。如果我运行这个代码并查看,这里创建了这三个新文件夹,然后在每个文件夹内为我们拥有的每个角色创建了一个文件夹。因此,现在这些都是空的,我们将从这里获取图像,然后复制到这里。
我们每个角色大约有12到14幅不同的图像。我知道这不是很多,特别是对于深度学习,但对于本教程来说足够了,我会在最后向你展示我们得到了相当不错的准确率。所以,是的,我们现在想要将大约60%用于训练,25%用于验证,剩下的用于测试,然后将它们复制到这些文件夹中。
所以如果我运行这个。然后它会打印每个目录中图像的总数,以及训练样本、验证样本和测试样本的数量。所以现在如果我们回到这里,这些文件夹都是空的,所以我们实际上可以删除它们,现在移动到垃圾桶,现在在训练文件夹中,例如,我们应该有图像,所以我们为每个角色有训练图像、测试图像和验证图像。
所以再一次,这就是你的结构应该是什么样子。这使得Tensorflow图像数据加载器非常简单。因此,现在我们可以继续设置我们的图像数据生成器,以便从Kras预处理图像中获取图像数据生成器,在这里你可以传入自己的预处理函数,例如,你可以编写一个规范化数据的函数。
但在特殊情况下,我们只想规范化它。我们还可以传入rescale参数,然后在这里我们使用1除以255,因此我们希望我们的图像范围在0到1之间,就像之前的示例一样。然后我们必须调用这个生成器,调用从目录流的函数。在这里,我们传入训练的目录。
所以这是乐高星球大战的图像,然后训练,然后我们可以指定目标大小。因此,现在我认为图像的尺寸必须是512乘512,我们可以指定一个目标大小,Tensorflow会自动为我们调整大小。然后我指定类模式,因为我想将标签作为单个整数值。因此,你也可以,例如,在这里使用独热编码。然后你可以使用批量大小。
然后对于我们的训练图像,我们说shuffle等于true。然后我们指定我们有RGB图像。因此,你可以在文档中检查参数。然后我们指定我在这里硬编码的类名。对于验证和测试我们也做同样的事情。
图像的唯一不同之处在于,我们在训练时使用 shuffle=True
。而在验证时,我们设置为 false
。所以这里其实没什么关系,但尤其在测试时,你希望 shuffle=False
。所以现在如果我们运行这个,那么 Tensorflow 会自动为我们加载这些。例如,我们来打印一下。
测试批次的形状。所以我们说我们只有四个的批次大小。这就是为什么我们有四个不同的标签。如果我们看看第一个批次,那么这是四,因为我们有四个样本,每个图像的大小是 256 x 256 x 3
,因为我们在这里指定了这个图像大小,并且我们有三个颜色通道。因此,让我们例如用 Matplotlib 绘制一些图像,这里打印了测试批次的前四个图像,这里我们有尤达和杜克·天行者,并且我们打印了训练批次的四个图像。因此,是的,现在我想向你展示的另一件事是,我们可以非常轻松地使用这个图像数据生成器进行图像增强,因此如果我们看看 Tensorflow。
数据增强是一种通过应用随机变换(例如图像旋转或翻转)来增加训练集多样性的技术。因此,这对于提高模型的泛化能力非常有用。我们可以通过这个数据生成器非常容易地实现这一点。因此,我们需要传入的唯一内容就是一些额外的参数。如果我们想要这个。
那么我们只对训练数据集这样做。例如,我们可以指定旋转范围,指定随机水平翻转,还可以指定高度平移、宽度平移以及剪切和缩放。所以现在如果我们使用这个。那么让我应用所有这些。然后再一次,你只希望对你的训练数据这样做,而不是对这些。
这里有几种不同的方法。所以,当然,你也可以编写自己的函数来实现这个。但这个图像数据生成器使得这一切变得非常简单。那么现在让我们再次运行这个图像增强。因此,让我们运行这个和这个,还有这个,再次运行。是的,这里我们可以看到,例如。
我们有轻微的旋转,可能还有不同的缩放因子,或者这里可能有一些剪切效果。因此,是的,让我们再运行一次。那么让我们从批次中随机选择另一个样本。再一次,让我们看看。是的,我认为你绝对可以看到它正在对图像进行处理。因此,这个图像确实是旋转过的。所以,是的,这是一种你可以很容易应用的好技术。
所以我现在要暂时移除这个,因为我们没有那么多图像。在这种情况下,它实际上可能会混淆我们的模型并降低准确性。因此在这个示例中,我将把它排除,但请记住,你可以很容易地在这里做到这一点。那么让我们再次运行这个和这个,然后我们就不应该再看到增强效果了。
所以,是的,我认为这些是没有旋转或其他效果的正常图像。现在我们设置卷积模型。这与教程5中的内容相同,是一个简单的卷积神经网络,具有不同的卷积层、最大池化和激活函数。最后,我们使用一个全连接层。这个最后一层很重要。
在这里,我们仅使用五个输出,因为我们有五个不同的类别。所以让我们运行这个并打印出我们模型的摘要。在这里我们可以检查架构。然后我们设置损失、优化器和指标并编译我们的模型。这再次与上次相同。在这里重要的是要设置from_logits等于true,因为我们在最后一层不使用激活函数。
所以让我们编译它。然后我们可以轻松调用model.fit来训练我们的模型。现在我想给你展示另一个新东西。我想谈谈Keras回调。回调是应用于每个训练epoch之后的函数。所以在这里,你可以,例如,保存检查点或使用其他不同的功能。
我在这里想做的是使用早停回调。这样我们可以很方便地使用它,因为它已经在Keras的回调中实现了。然后我们设置早停。我们希望监控验证损失,并设定耐心为五。这意味着如果验证损失在接下来的五个epoch中没有改善。
然后它将自动进行早停训练。因此,当我们有这个时,我们可以指定这个参数。所以我们可以说回调等于。然后这是一个列表,因为如果需要,我们可以传入更多的回调。然后我们说早停。接着我们使用其余的参数。
现在让我们训练这个并看看会发生什么。好的,训练完成了。我们实际上说我们想要30个epoch,但在第10个epoch后停止了,因为我们的验证损失没有改善。所以这里是我们的最低值,接着在接下来的5个epoch中没有更好。因此它在这里停止了。我们可以看到,如果我们查看训练数据的准确率,那么这里。
例如,我们在最后一个epoch中得到了100和97。这是非常好的。但是现在如果我们看看验证准确率,我们会发现这是最佳的,但实际上却在下降,而我们的验证准确率并不好。所以这是一个。
清晰地表明我们对训练数据存在过拟合问题。在这种情况下,部分原因是我们没有那么多可用的图像,尤其是验证集的图像很少。所以这可能是一个问题。不过,是的,我认为在这种情况下,拥有这个回调非常好。然后我们可以停止并尝试改进这个模型。所以我把这留给你作为作业。你可以。
例如,尝试使用我向你展示的图像增强,或者调整学习率,或者也尝试稍微改变我们模型的架构。所以是的,这就是我们可以做的一件事。😊在下一个教程中,我还会向你展示另一种非常强大的技术,通过这种技术,我们可以在小数据集上实现非常高的验证准确率。所以我希望你也能观看下一个教程。暂时就这样。
我还想做的事情。所以我们可以轻松保存我们的模型,这是一件我已经向你展示过的事情。所以我们可以像这样保存它。然后如果我们查看这个文件夹,它应该在这里。所以是的,就在那里。😊然后我们来绘制一些数据。所以在这里我们看到损失。训练损失下降得非常好,但验证损失就没那么好了。
训练的准确率也是如此,非常好。但是验证的准确率就不好了。所以,这可能是一个指标,表明我们在这里存在过拟合。所以现在让我们在测试数据上评估它。再次在这里,我们看到我们在这个测试数据上的准确率不是很好。
然后如果我们尝试进行预测,我们调用模型预测。然后我们还需要在这里应用软标记,因为我们在模型层的最后一层没有使用它。然后为了获取实际标签,我们必须沿着轴1调用arctmax。所以现在如果我们打印实际标签和预测标签。然后我们看到我们有。
在这种情况下,它的正确率只有50%。所以现在再次打印一些新图像和预测。是的,在这里我们的预测再次是卢克·天行者,所以卢克·天行者。这不是很好。所以是的,但现在我想你应该知道我们如何应用一个完整的项目,使用真实的图像数据集。我们甚至在训练数据集上实现了高准确率,使用了我们所用的技术。
但我们仍然需要改进,使其在验证数据集和新的测试数据集上也表现良好。所以在下一个教程中,我们将学习迁移学习。通过这个,我想我们会实现相当不错的准确率。所以我希望在下一个视频中见到你。如果你喜欢这个教程,请点击喜欢按钮,并考虑订阅频道,下次见。
面向初学者的 TensorFlow 教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P8:L9- 迁移学习 - ShowMeAI - BV1TT4y1m7Xg
🎼,大家好,欢迎来到新的 Tensorflowlow 教程。今天,我们将继续上次的内容,一起应用迁移学习,获得一个良好表现的模型。😊,所以如果你还没有看过上一个教程,我强烈推荐你先去看一下。作为快速回顾,我们使用了来自 Kegle 的一个数据集,包含乐高星球大战 Minfi。
我们应用了自己的卷积神经网络。然后我们遇到的问题是,在训练中,我们得到了非常好的准确率。接近 100%。但在验证数据集上的表现不好,在最终测试数据集的评估中,我们的准确率只有 40%。这不是很好。
现在我们要做的是应用迁移学习来改善我们的模型。😊。迁移学习是一种非常好的,简单但非常强大的技术。其概念是,我们使用一个已经训练好的模型,这个模型可能是一个具有许多特征并且在大量数据上训练的非常好的模型。现在我们所做的就是,取这个模型,然后只修改最后的层,剪掉它们,然后在最后应用我们自己的分类层,并只训练这些层。这样,我们的训练可以非常快速,同时也能利用已经预训练的神经网络的其他部分。所以这就是迁移学习的整个概念,接下来我将向你展示如何使用 Keras 实现这一点,所以第一步。
我们要做的是加载一个预训练模型。Keras 中已经有一些模型可用。例如,流行的 Vgg16 模型。通过说 Tensorflow keras applications 和我们的模型名称,你可以获取这个。如果我们调用它,系统会下载该模型并将其保存在你的文件夹中。让我们运行它并打印摘要。这里是。架构。
所以你可以看看这个。现在我们要做的是,如我所说,我们想要。
删除最后一层。你可以只删除最后一层,或者也可以删除更多层,然后应用你自己的。所以在这个例子中,我们只删除最后一层,密集层,然后应用我们自己的具有五个不同输出的密集层,因为在我们的例子中,我们有五个不同的类别。现在。
这是一个 Keras 功能模型。我已经谈到了功能 API。如果你还没有看过,我也建议你先看这个,我会把链接放在描述中。但我也说过,我们可以轻松地将其转换为序贯模型。我们可以通过设置一个新模型并说这是一个序贯模型来做到这一点。
然后我们遍历所有层,除了最后一层。因此最后一层不包括在内,称为模型和层。现在让我们运行这个并打印摘要。然后,它应该是相同的,除了你看不到这一层。哦,对不起。所以这里,这是原始摘要。这里我们有作为最后一层的10个输出。
现在在我们的案例中,这应该是最后一层。那么我们来看一下。是的,这就是最后一层。现在我们要做的是将所有这些层的可训练属性设置为false
。因为我们不需要重新训练它们。我们只需要训练我们的新分类层。所以我们遍历所有层,并将层的可训练属性设置为false
。
例如,这里你可以看到可训练参数和不可训练参数。现在如果我们这样做并再次打印摘要,我们会发现现在所有的参数都是不可训练的。现在我们添加最后一个密集层。默认情况下,这又是可训练的。然后再一次。
我们设置损失函数和优化器并编译我们的模型。上次我告诉你们如何使用这个图像数据生成器,然后调用这个flow from directory
函数。这很简单地从目录加载图像。我们也可以在这里应用预处理、重缩放,甚至图像增强。所以上次我们在这里应用了重缩放。这次我们想做的是,应用与基础模型相同的预处理函数。在这个weci G net
中。因此,我们也可以通过说这个在tensorflow.keras
应用程序中可用,后面接我们模型的名称和preprocess_input
来获取。
这是我们的预处理函数,然后我们可以将其提供给我们的图像数据生成器,作为预处理函数的参数。这对于我们的训练、验证和测试集都是一样的。然后我们为每个数据集调用flow from directory
。这些参数与上次相同。现在我们正在从不同的模型加载图像。
我没有运行这个单元。所以我们来运行这个和这个。现在我们完成了。再一次。这和上次是一样的。所以我们训练了我们的模型,并应用了提前停止的回调。如果我们的验证损失在5个周期内没有增加或改善,那么就会提前停止。所以我们再在这里应用一次。现在让我们来拟合我们的数据。
这出现了一个错误。你必须在训练和测试之前编译你的模型。我想我在这个单元中已经做过了。所以我们再运行一次。运行这个和这个,现在是我们的训练。现在它工作了。我想我第一次没有运行这个单元。现在让我们看看我们的迁移学习模型表现如何。
好的。现在我们的训练完成了。我们再次进行了早期停止。所以我们看到测试数据集上的准确率是 100%。完美。而验证准确率几乎是 94%。所以,我认为这现在非常好。这比上次好多了。现在我们设置了 30 个周期。
但是我们的验证损失在这里是最低的值。然后在接下来的五个周期内没有改善。所以我们设置了患者值为 5。这就是早期停止的原因。因此我们在第二个周期时已经获得了 100% 的验证准确率。但这可能是因为我们的验证数据集中可用的图像不多。
所以我认为这个结果不是很可靠。但我认为我们可以看到迁移学习是多么强大。因为上次我们遇到了过拟合的问题,以至于我们在训练数据上有良好的准确率,但在验证数据和测试数据上却没有。
现在,通过迁移学习技术,我们在仅仅两个周期后就得到了这个结果,即使在这个例子中我们没有那么多可用的图像。这是非常好的。那么现在让我们在测试数据集上评估我们的模型。我们看到在这种情况下,测试数据的准确率为 100%。所以我想这次我有点幸运。但也确实如此。
我们再次看到这种技术是多么强大,以及它是多么简单。所以你加载一个预训练的模型。😊。然后,我们在这种情况下将其转换为顺序模型。所以你不必这样做,但这样对你来说会简单一些,因为我知道顺序 API 更容易理解。然后我们排除了最后一层,添加了我们自己的密集层。
然后我们还将层的可训练性设置为 false,除了最后的密集层。然后我们进行了新的训练。作为家庭作业,你可以尝试其他预训练的网络。所以,比如说,移动网络版本 2 是另一个非常受欢迎的网络。你可以访问这个链接,在这里你可以找到所有不同的可用网络。
所以这是我们的 V G16,你也可以使用 G19。你有移动网络和移动网络版本 2 以及 ResNet。所以,试试它们。我可以告诉你,当你尝试将模型转换为顺序模型时,可能会遇到问题,因为这仅在模型架构是线性时有效。
如果你不知道如何操作,如果你的架构不是线性的,那么你可以观看我关于功能 API 的教程,因为我在最后给了你一个提示,并展示了如何在功能模型中进行迁移学习。所以,看看这个,如果你也能获得 100% 的准确率,请告诉我,然后希望在下一个视频中见到你。如果你喜欢这个视频,请点击赞,并考虑订阅频道,再见。
面向初学者的TensorFlow教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P1:L1- 安装与环境配置 - ShowMeAI - BV1TT4y1m7Xg
🎼,嘿,大家,欢迎来到我的Tensorflow初学者课程。在这门课程中,我会教你入门这个框架所需的所有知识,我们会一路上构建一些不错的示例项目。所以Tensorflow是一个端到端的开源机器学习和深度学习平台。
它由谷歌开发,是最受欢迎的深度学习框架之一。在这一集里,我会展示如何在你的机器上安装Tensorflow。顺便提一下,所有课程材料都将在Github上提供。我创建了一个新的Tensorflow课程,并且已经上传了第一个安装指南。
所以如果你想,可以查看并阅读这里的指南。😊现在让我告诉你安装Tensorflow需要做什么。你去官方网站Tensofflow.org,然后点击安装。在这里你可以看到要求。你需要Python 3.5或更新版本。我假设你已经在你的机器上安装了这个。
然后它支持Mac、Uuntu和Windows。安装命令非常简单。你需要的Pip版本大于19。然后你只需输入“Pip install Tensorflow”。我会在几分钟内演示这个。但首先,让我告诉你在Windows上安装它以及获得GPU支持需要做什么。
所以在Windows上,你还需要安装Visual Studio 2017。你可以免费获取这个,只需安装免费社区版。你还需要C++可再发行组件。你可以点击这个链接,这将带你到这个页面,然后下载并安装相应的版本。
然后你也可以在Windows上直接输入“Pip install Tensorflow”,这样就可以了。如果你有GPU支持,我会告诉你需要做什么。如果你的机器上没有Nvidia GPU,可以跳过这部分。让我们点击这个链接,安装命令稍后会是一样的。
但首先,我们需要一些其他东西。当然,你的机器上需要有Nvidia GPU和必要的驱动程序。如果你有这些,就必须安装Kuda工具包和Couddi及N工具SDK。而且获取正确版本是很重要的。Kuda工具包需要10.1版本。
所以我们点击这个链接。这将带你到这个网站。在这里你可以找到所有的归档版本。然后选择最新的10.1工具包并下载适合你操作系统的版本。所以对于Windows,安装这个。
一旦安装完成,你还需要 CoudD 和 N SDK。这是 Kuda 深度神经网络库。在这一侧,你点击下载。同样,这里非常重要的是获取正确的版本。因此,你需要版本 7,因为现在我认为最新版本是版本 8。
然后你点击下载。为此,你需要一个账户,你可以免费创建这个账户然后下载它。
一旦你下载了这个,我会告诉你必须做什么。在这里,我从我另一台有 Windows 的机器上做了一些截图。因此,首先,在安装 Kuda 工具包后,你可能会在 C 程序文件和 Vdia GPU 计算工具包 Kuda 中找到它,然后是版本 10.1,这就是你的安装目录。当你下载了 codi 和 N SDK 后。
然后你可以进入这个下载的文件夹,在那里你会有一个 bin 目录、一个 include 目录和一个 lip 目录。例如,在 bin 目录中我们有一个 DL。因此,现在你需要将所有这些文件抓取出来,然后返回到你的 Kuda 工具包安装目录,在那里你也会有 bin 和 include。
lip 目录。因此,你必须将所有这些文件复制到 Kuda 工具包目录中的相应文件中。在完成这些之后,你还需要修改环境变量。所以你需要创建一个变量 kuda path,然后放入安装路径。然后你还需要修改实际的路径变量。所以在这里。
你需要添加这些额外的路径。这是包含 bin 文件夹和 lip、VvP 文件夹的安装文件夹。因此,你需要将这些添加到 Windows 的路径变量中。现在这就是你所需的一切。这些是在 Windows 上所需的所有步骤。现在我们可以继续安装我们的 TensorFlow。所以现在我们首先要做的是,我建议使用虚拟环境。为此,我使用 Conda。
我用 Conda create
创建了一个新的环境。然后是 minus n 和名称。我说 T F 代表 TensorFlow。我说 Python 等于 3.8。
如果你不知道如何使用 Conda,那么我有一个完整的教程来解释这个。所以我会把链接放在描述中。顺便说一下,你并不需要 Conda。你也可以仅仅使用 Python 的虚拟环境。这也是可以的。好的。所以现在我们创建了这个,现在我用 Conda activate T F
来激活它。接下来是安装。
我们使用 Pip 安装 Tensorflow。因此也有一个 Conda 安装命令可用,但我实际上不推荐使用 Conda 安装命令,因为这不是官方支持的,可能会有一些性能问题。所以我们就用 Pip 安装 Tensorflow,然后按回车。这可能需要几秒钟。好的,所以这成功了。让我们测试一下,看看安装是否真的成功。
所以让我们开始我们的 Python shell。让我们导入 Tensorflow S T F。如果一切正常,那么这应该可以正常工作而没有错误。是的,这成功了。我们没有看到任何错误。所以现在我们有 Tensorflow,例如,我们可以打印版本 Tensorflow underscore。Underre 版本,我们看到我有最新版本 2。
3.1 然后如果你安装了 GPU 支持,你也可以通过输入 physicalical devices equals Tf.config do list dot physicalical underscore devices 来测试,然后是 GP U 字符串,这里出现了一个错误,抱歉。T F.dot config.dot list,underscore physical devices。这里在我这边。
这只是一个空列表。但是如果你有便宜的支持,那么它应该放在你的 Kuda 设备中,这样你就可以用这个命令进行测试。是的,暂时你知道如何安装 Tensorflow。我希望你喜欢这个。如果你喜欢,请点击喜欢按钮并订阅频道。
然后我希望在下一个视频中见到你,再见!
面向初学者的TensorFlow教程,理论知识、代码思路和应用案例,真正从零开始讲明白!<快速入门系列> - P9:L10- 循环神经网络(RNN & LSTM & GRU) - ShowMeAI - BV1TT4y1m7Xg
嗨,大家好,欢迎来到另一个TensorFlow教程。今天我们将学习循环神经网络,简称RNN。RNN是一类神经网络,允许将以前的输出用作输入,同时具有隐藏状态。这意味着我们在这里处理的是一个序列。这是非常强大的。借此。
我们可以将RNN用于许多不同的应用,比如文本生成、文本翻译、情感分类等等。我已经有一个深入的RNN教程,在那里我更详细地解释了这些幻灯片。如果你想多了解一点理论,那就看看这个视频的前五分钟。
因为我现在想专注于TensorFlow的实现,所以让我们直接进入代码。😊,🎼。
这里我已经有一些代码,这与教程第3部分中的代码完全相同,使用了Ms数据集,然后我们定义了一个简单的神经网络,接着定义了一个损失函数和一个优化器,编译了模型,然后训练和评估它。
我们使用这个数据集进行了数字分类,现在我们唯一想要改变的是模型,改用RNN模型。这不是RNN的典型应用。很多时候它用于文本分类或文本生成,但这个例子应该演示RNN确实可以用于图像分类任务。
你将看到我们如何使用Keras API轻松创建我们的RNN模型。正如我所说,当我们处理RNN时,我们在这里处理的是一个序列。在我们的案例中,我们有图像,但我们不需要更改数据集。我们只需将图像视为一个序列。
现在我们的图像必须是28乘28,所以是28乘28个像素。现在我们将其视为一个序列。这意味着我们说一个时间步是图像中的一行。然后我们还有28列。这意味着我们的输入大小是28,序列长度也是28。因此,这意味着我们的序列中有28个时间步,在每个时间步中。
我们有28个特征。现在当我们这样处理时,我们可以简单地使用一个RNN。所以现在让我们继续定义我们的模型。首先,我们定义一个空的序列模型。我要做的第一件事是添加一个输入。因此我说model.add,然后是keras,然后是input。
然后在这里指定形状,即28乘28。所以这里的第一个数字是序列长度,第二个数字是输入大小。现在我们可以添加RNN模型。有不同的可用模型,我们从简单的RNN层开始。稍后我还会展示另外两个著名的模型。所以现在。
假设model.at。然后我们可以在keras.layers中获取这个。所以我们已经在这里导入了这个,然后我们可以说layers.。现在我们想要一个简单的R和N模型。我们唯一需要指定的是单位的数量。也就是输出单元的数量。这也是隐藏单元的大小。所以当然有很多。
更多的参数。因此我建议你自己查看文档。有一点你应该注意,默认情况下,R和N中的激活函数是tanh函数。那么在我们的例子中,试试relu函数。这就是我们所需的全部内容,用于R和N模型。
所以现在我们有这个。现在,既然我们要进行分类,我们在这个数据集中有10个不同的类别。那么像在其他教程中一样,我们在最后添加一个全连接层。因此我们说layers.Dense,然后我们想要10个输出。这就是我们所需的全部。所以在最后我们不使用激活函数。
但我们必须小心,必须在我们的损失函数中指定从logit等于true。而现在这就是我们目前所需的全部。这是我们需要的简单R和N的整个顺序模型。所以首先,让我们导入cis,并说cis.exit,这样它只会运行到这里。让我们运行到这里的代码并打印摘要。
所以我们说Python,然后是这个文件的名称。所以这个。哦,这里我漏掉了等号,当然了。所以shape等于28乘28。那么我们再写一次。然后在这里我们看到我们的简单R和N有这个输出形状。我稍后会解释这个。然后我们有一个具有10个输出的全连接层。让我们再看看R和N。
所以输出的形状是n。这是我们拥有的样本数量。然后是128,就像我们在这里指定的那样。它包含的是每个样本的一个单一向量。我们得到的输出是最后一个单元,最后一个时间步的输出。但这包括了关于前一个时间步的所有信息。所以这就是我们所需要的全部。
所以我们只需要这里的最后一个单元。这就是为什么我们的输出是这个形状。但你也可以得到一个形状为批次数量乘以序列数量、时间步数量或序列长度的输出。然后是单位数量。当我们指定一个额外的参数时,我们可以得到这个,称为return。
return sequences等于true。如果我们使用这个,默认情况下是false。如果我们使用这个,那么我们的输出就是这个形状。例如,当我们想将多个R和N堆叠在一起时,这很有用。因此,我们可以使用第一个,它将返回所有时间步。然后我们使用第二个,我们说这是false。
然后我们得到了这个输出形状。所以让我们再次检查一下这是否正确。清除这个并再次运行。没错,我告诉你的确是正确的。第一个 R 和 N 有这个输出形状,因为我们设置了返回序列为真。另一个则只有这个输出形状。然后,我们又有了我们的全连接层。
这可能会提高你的模型性能。所以再次,你可以尝试堆叠多个 R 和 N。目前,我们就使用一个,然后去掉这个,训练它,看看它在这个分类任务中的表现如何。再次清除并运行。好的,我们看到最后的准确率是 97%。
因此我们的 RnN 确实在这个图像分类任务中表现良好。现在你知道如何使用这个简单的 RnN 层来设置你的 R 和 N,并且你应该知道如何将输入视为序列。我还想给你展示另外两个著名的 RnN。这只是一个简单的 RnN 层,但还有,比如 LSTM 或 GRU。这两个也是很受欢迎的 RnN。
它们的表现通常比简单的 RnN 略好,我认为你不需要更改其他任何内容。所以参数大多数是相同的,输出的结构也是相同的。所以是的,也可以尝试 GRU 或 LSTM。好的,我想现在就到这里。在下一个教程中再见。
我们学习如何将其应用于文本分类任务。所以我希望在下一个视频中见到你。如果你喜欢这个教程,请点击喜欢按钮并考虑订阅频道,我们下次再见,拜拜。😊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!