ShowMeAI-人工智能工具笔记-九-
ShowMeAI 人工智能工具笔记(九)
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P15:L2.4- 在 Pandas 中为 Keras 使用 Apply 和 Map - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeffine,欢迎来到华盛顿大学的深度神经网络应用课程。在这段视频中,我们将看看如何结合使用apply和map函数与pandas。这允许你编写将执行在整个数据框上的Lambda函数或其他函数。这使你能够对数据框进行相对复杂的转换,这对特征工程可能非常有用。
它允许你以能使你的神经网络更具预测能力的方式表示数据。有关我最新的AI课程和项目,请点击订阅并点击旁边的铃铛,以便在每个新视频发布时收到通知。apply和map是pandas数据框提供的两个函数,你可以直接在这些数据上使用。现在我们已经看到map在一般Python数据结构列表中的应用。😊
但是map可以与数据框一起使用,进行类似的转换,这对于你在本课程中的某些项目可能需要的更高级的特征工程非常有用。apply和map可以非常非常有用,我们将看一个具体的案例。
在后面的部分中,我们将讲解如何做到这一点。现在我们来加载autompg数据集。我们将对其进行非常简单的映射。这是你进行映射时最常见的操作之一。这类似于SQL中的解码。我们要做的是,您这里的原始值指定了汽车的来源地区。1是北美,2是欧洲,3是亚洲。因此,我们将对原始值进行处理。
我们将创建一个名为originig name的列,并在所有情况下填充它,这就是map所要做的。它将查找原始值,并将其替换为北美(1)、欧洲(2)和亚洲(3),那么我们来运行一下。如果我稍微滚动一下,你可以看到北美、北美,3是亚洲,2是欧洲,依此类推。
因此,如果你能够实际做到这一点,这可以是一个非常好的总结值的方法。我的意思是,假设你在这里有所有美国50个州的数字。你可以在这里放一堆值,它们指向同样的东西。你可以用1指向北美,用2指向北美,甚至是州名,密苏里州指向北美。
加利福尼亚到北美,纽约到北美,等等。如果你看到法国,它就属于欧洲。因此,你也可以用这个来进行总结。apply是另一个你可以使用的东西。对于这些数据集,apply基本上是将一个函数,通常是一个lambda,应用于数据中的每一行。所以这里。
让我们继续进行计算,这个我称之为效率的指标。它基本上是位移除以马力。你的发动机有多大,实际能获得多少马力?
这给你提供了汽车效率的一般指示。因此,我们可以将其添加到数据集中。这显示了你如何基于这个比率进行特征工程。这里我将展示一个更复杂的特征工程示例。
这实际上是前几个学期的一个作业。你可能会在这个学期看到类似的作业。这基本上使用了来自美国国税局的数据集,这是一个美国政府的税务机构。我们将会。
这里还有更多数据文档,如果你有兴趣阅读。但这基本上是一个数据集,提供了估计的调整后总收入以及美国邮政编码的其他信息,所以你关心的字段是州,举例来说是密苏里州。邮政编码是该州内的邮政编码。
AGI Stub 有六个不同的收入区间。所以一是最低收入,六是最高收入。每个邮政编码将有六行数据,然后它们会给你一个计数,即每个收入区间的人数。因此,这为特定邮政编码提供了一种财富分布的概念。
我们要尝试将这些区间组合在一起,以便你能估算该特定邮政编码的整体 AGI,因此这是一个简化。你有邮政编码,每个邮政编码有六行数据。你想将其缩减为每个邮政编码仅一行,并给出调整后总收入的整体估算。
这就是文件的样子。你看到的邮政编码是63017。这是我工作的邮政编码。AGI Stub,所以这是你为每个邮政编码拥有的六个值,然后是计数。因此,第二高的是最大的收入。这显示了这个特定收入,如果你做得最多。
在美国著名的邮政编码90210,可能会非常高,因为那是一个非常富裕的邮政编码。所以你在这里看到很多数字。我们将如何将其组合起来。这些是每个区间的带,1 是 1 到 25k,6 是 20万美元或更多。现在,将这些重新组合的一个问题是20万美元或更多。
这是一个相当大的类别,可能高达,我不知道,可能是几百万美元。不过,这些人赚了多少都不清楚。所以我们要做的是为每个区间建立一个中位数。125。由于我们不知道上限是什么,12500。这可能是我整理的估算中最大的缺陷。但你。
你可以看到这些大致在哪里。因此,我们可以估算6,3,0,17的平均AGI。基本上,我们将这些值相加。所以这就是我们的总计。我们会把这些全部加起来。我们将总计AGI,但按照中位数加权。因此,我们将考虑人数。4710乘以12500,因为这是乐队一的总人数。
这是乐队一的中位数。乐队二的中位数是2780和37500。因此,这实际上是一个加权和。然后我们将进行除法,这样我们得到的这个邮政编码的平均收入大约是88,000。这看起来是合理的。因为我们手动计算了这个,所以这也很好,因为它给了我们一个可以手动检查的值。
所以我们自动化的过程将计算每一个邮政编码应该得出相同的值。因此,我们将把这个数据集加载到内存中,它非常庞大,你可能想要进行流式处理。但是这是加载整个数据框,马上就会加载完成。这可能需要一段时间。我花了大约20秒。现在我们要做的事情是。
这将向你展示一个很好示例,展示如何将多种技术结合使用。现在这个数据集确实有一些垃圾数据。因此,我们有邮政编码是0和9999。不存在这样的邮政编码。它们在数据文件中确实有用途,但我们不打算使用它们。因此,我们将获取所有的行,这就是Lo为我们做的。
数据框不等于零邮政编码,且邮政编码不等于9999。我们还将仅拉取这些字段。因此,我们在横向和纵向上缩减这个数据,去掉了很多列和所有这些无效邮政编码的行。
你运行这个。这实际上是非常快速的,现在数据框已经被修改,如果你显示数据框,你会看到它实际上只剩下这四个。无效的也被去掉了。但我们不会去寻找它们。我们现在要做的是将所有这些AGI桩替换为中位数。那些我给你的中位数是1,36,所以这是一个出色的映射应用。我们运行它。
再一次,它非常非常快。如果我们查看一下,我们现在看到这些应该已经转化了,它们现在是AGI桩。那些实际的收入中位数。接下来,我们按邮政编码分组。对于每一个邮政编码,我们基本上可以执行一个lambda。因此,这是一个很好的应用场景。
我们将对其进行apply操作,基本上进行求和,因为我们想要对所有值进行求和。在每一个邮政编码中,但我们将进行加权求和。因此,我们将基本上按照n1进行加权。假设有30个,然后乘以AGI桩,最后将整个结果除以n1。
这是N1的总和,实际上,你可以在整个邮政编码的总和中看到。然后我们重置索引,使行号对齐,如我们之前所见。我们运行那个。那确实需要几秒钟。让我们看看这实际上做了什么。我们现在几乎拥有了我们想要的数据集。邮政编码。
这是每个的平均值。列标题有点杂乱,邮政编码。还不错,但零,零是什么,零应该是我们的平均AGI。我们的AGI估算。我们将重新命名这两列,然后显示顶部。现在我们可以看到有这个漂亮的输出。你可能想要一个两个CSsv。
这完全是我之前进行的作业的有效提交。上个学期。我们将查找我们手动计算的邮政编码,它与我们之前的88.689匹配。感谢观看这个视频。在下一个视频中,我们将继续使用pandas,并讨论特征工程,也就是如何你。😊
以有助于神经网络更具预测性的方式表示你的数据集。这个内容经常变化,所以请订阅频道以保持对本课程和其他人工智能主题的最新了解。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P16:L2.5- 使用Pandas进行Keras深度学习的特征工程 - ShowMeAI - BV15f4y1w7b8
嗨,我是 Jeff Hean。欢迎来到华盛顿大学的深度神经网络应用视频。在这个视频中,我们将讨论如何在 Python 中使用 Pandas 进行特征工程。这使你能够准备数据集,特别是当你有表格数据时。现在,这并不涉及图像、音频或自然语言处理的特征工程。
而是如何将列类型数据转换为神经网络可能更具预测性的格式。你可以通过许多不同的方法进行特征工程,这通常被认为是获得高度准确模型的最佳方式之一。如果你想了解我最新的 AI 课程和项目,请点击旁边的订阅按钮,以便在每个新视频发布时接收通知。现在。
我们将进一步探讨一些更高级的特征工程以及你如何使用 Pandas 进行特征设计。你可以做计算字段。我们之前见过一点,但假设你想要以千克为单位的重量或基于其中某一项的其他计算。
😊。
你可以运行这个自动化程序,现在你得到了以千克为单位的重量。这可能不是一个太有用的工程特征,因为它与原始数据集中以磅为单位的重量高度相关。不过你仍然可以尝试。你可以设计类似的东西,通常你会想要某种方式将重量与其他东西相除或进行某种归一化。
这是特征工程中非常常见的方法,我在日常工作中经常这样做。这被称为增强,我们将从外部 API 获取额外的数据。我们将用这些额外的数据来增强我们的数据,因为这些额外的数据可能会给我们的神经网络带来额外的预测能力。通常情况下,你需要为这些额外的数据付费。
有时你可以找到免费的 Google API 密钥,那里有各种此类数据。我将使用这些数据来处理地址。现在我将给你一个如何增强地址数据集的示例。要做到这一点,你需要一个 Google 密钥。而上次我把这些放进来的时候,我收到了很多请求,问我能否给你我的 Google 密钥,你基本上是在问。
你能给我一个可以收费的信用卡通道吗?遗憾的是,答案是不能。不过我会把我的 Google 密钥放在这里。显然,我会把它移走。现在我们已经把我的 Google 密钥放进去,我会把它移除。以免我不小心保存它。顺便说一下,这真是个灾难。
你在GitHub上使用AWS等的API密钥上传东西。比特币矿工和其他不法分子,虽然并不是所有比特币矿工都是不法的。基本上找到你的凭据,你可能会在一天内收到2万美元的账单,这可不好。不要这样做。永远不要将私钥上传到GitHub,尽管这常常发生。
我们要做的是处理地址,你可能有一个地址,比如布鲁金斯大道1号,圣路易斯,密苏里州。哦,顺便提一下,如果你想获取自己的谷歌密钥来做这个,去谷歌API密钥那里获取一个名为Gecode的密钥。这里我们要做的是,我将输入华盛顿大学在布鲁金斯大道的地址。
我将向谷歌发送请求,把我的密钥放进去。获得我的响应后解析出来。实际上,我将能够获取华盛顿大学的经纬度。纬度,这个经度,所以这很酷。我现在可以得到一个经纬度。现在你可以将其用作特征。这将向你展示东西在东西和南北之间的定位。我建立过使用这两个特征的数据集,它们非常有用。
在我工作的保险行业,我们总是对不健康的习惯感兴趣,比如吸烟。因此,我们经常构建模型,告诉我们某人吸烟的概率。纬度和经度是否能预测吸烟情况,这里是CDC关于美国各州吸烟率的图表,因此是的,位置非常能预测你是否吸烟。你还会在那个模型中想要其他特征。
但你可以看到位置意味着很多,我们将使用纬度和经度来计算城市之间的距离。这可能让你计算某人距离某个都市中心的远近,或者类似的东西。这是一个三角学公式,计算球体上任意两点之间的最短距离,我不打算深入讨论它为何有效或如何有效。
但这基本上给你提供了两个纬度和经度之间距离的计算。所以我会继续运行这个。它告诉我圣路易斯,密苏里州和劳德代尔堡,佛罗里达州之间的距离是1684公里,如果你想要英制单位,可以转换为英里。但你可能想看看,比如说。
一个人的地址和主要都市区,某公司与附近竞争对手之间的距离。一个配送中心,零售店。这段代码计算华盛顿大学与其他大学的距离。在美国。这在国际上也有效。谷歌Gecode可以做到这一点。这是我们与其他大学的距离,我只是随机挑选了这些学校。
所以这又是你可以利用的一种方式,想想看,如何将其标准化并地址以放入特征向量,这将是非常困难的。这给了你一种可能的方法来实现这一点。
感谢观看这个视频。本课程的前两个模块,你现在已经观看完毕,涵盖了一些Python基础知识。接下来的视频将开始真正深入TensorFlow和Keras。这些内容经常变化,所以请订阅频道以保持对本课程和其他人工智能主题的最新了解。
😊。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P17:L3.1- Keras深度学习和神经网络编程介绍 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeffy,欢迎来到华盛顿大学深度神经网络应用的视频,在这段视频中,我们将对深度神经网络进行一般介绍,以及它们的概念如何运作。这将使我们能够在本课程之前部分学习的Python基础上构建,实际上构建出神经网络,以便于我AI课程和项目的最新进展。
点击旁边的小铃铛订阅,以便收到每个新视频的通知。神经网络已经存在一段时间了。深度学习就是训练非常深的神经网络的能力。😊!
你可能见过其他机器学习模型和其他类别,比如支持向量机、梯度提升、XGBoost和LightGBM,以及所有这些基于数据训练模型的不同方式。神经网络可以作为这些模型的替代品。
神经网络简单地接受你通常会发送给支持向量机或其他模型的数据,并输出分类结果,试图对输入的内容进行分类或确定类型。或者它可以进行回归,并根据你想让神经网络预测的数据输出一个数字。然而,神经网络的真正强大之处在于它们能够处理最终数据并以不适合典型分类和回归的方式生成数据。
类型模型,例如,你可以将图像输入到神经网络中。你甚至可以让神经网络接收一张图像并生成另一张图像。因此,神经网络所能做的非常富有表现力,输入几乎可以是任何东西,输出也可以是任何东西,输入和输出并不一定要是同一类型。在其他模型中,你会。
只需发送一个一维向量,即一组预测变量。然而,使用神经网络,你也可以传入一个二维矩阵。现在,这就是你开始传入,比如一个带有像素网格的图像的地方。神经网络的强大之处在于它意识到相邻的像素彼此之间更重要,而其他模型类型中,输入因素的顺序变化对任何事情都没有影响。
它也可以传入一个三维矩阵或三维张量。这本质上是一幅彩色图像,其中第三维指定你传入的单个像素的颜色。而在谈论神经网络的维度时,这种维度可以以几种不同的方式使用。
通常你会谈论输入向量或输入矩阵的样子。你有多少个输入神经元,它们是如何排列的,是网格还是盒子?
维度也可以指神经网络中的权重数量。现在,传统模型中会谈到回归和分类,神经网络也是如此。神经网络的输出神经元变成单一的回归输出或分类输出。所以像你这里看到的回归神经网络,这里有两个我组合在一起的示例神经网络。
我在寿险行业工作,因此你将看到我提供的许多例子,类似于保险科技的方式,其中包含与医疗记录等相关的输入,这些是你在寿险中感兴趣的内容。在这里,你请求神经网络预测最大保额。那么我们应该为某人投保多少,针对个人的最大风险金额是多少。
分类神经网络会产生类别。因此我们可能会有一个优选标准、次标准或下降。这只是将潜在的保险申请放入正确的桶中。因此,回归分类。这些是你传统的模型类型,我们将在本课程后面看到,神经网络可以产生比这更复杂的输出。
分类或回归,神经网络甚至可以同时进行分类和回归。输出神经元,也就是最右侧的那些,这里只有一个。如果是回归神经网络,它总是只有一个输出神经元。这里我们有额外的输出神经元,每个类别对应一个输出神经元。
你可以通过神经网络的分类方式来判断它是否是一个二分类神经网络,这意味着它只是在分类两个事物,通常它只有一个输出神经元,指定了它属于其中一个类别的概率。
然而,如果你在处理多类别分类,类别数为三或更多,通常你会为每个类别有一个输出神经元。你绝不会有单一类别的分类神经网络,因为只有一个类别。它总是那个类别,因此你至少需要有两个类别,以便神经网络有区别的对象进行分类。
这就是神经网络的结构。它们有多个层。现在我们将看到还有其他类型的层和其他会使其更复杂的内容。但对于表格神经网络来说,它的输入看起来有点像Excel中的行和列。这就是它的样子。你会有输入层。
这些输入神经元是进入神经网络的值。接下来,你会有几个隐藏层,最后到达输出层。这些是偏置神经元,你不会直接向它们发送输入,它们仅仅是存在于这里,以增强神经网络的预测能力。
我们马上会看到偏置神经元的具体作用,它们处理输入都为零的情况。但你并不一定希望输出也为零。箭头是神经网络中各个实体之间的权重。
在隐藏层中,你可以在深度学习中有很多隐藏层,数以百计。通常有四种类型的神经元,神经网络中的输入神经元接收其余神经网络的输入。隐藏神经元,因为它们位于输入和输出神经元之间。输入神经元接收神经网络的输入。
输出神经元接收从神经网络发送出的输出,或者在这之间。上下文神经元在我们进入时间序列和递归神经网络时会更多了解它们。它们在对神经网络的调用之间保持状态。然后是偏置神经元,它们本质上就像y截距和传统数学中的线性方程。
你还有几种层类型,神经元会进入这些层。输入层接收输入,输出层发送神经网络的输出,然后是隐藏层。在后面的部分,我们将手动计算神经网络的输出。但现在,我们会看到神经网络实际经历的计算并不复杂。
它本质上是一个加权和,传递到激活函数。所以计算一个隐藏神经元或神经网络中的输出神经元的输入,本质上是接收特征向量或进入它的向量。如果我们为下面的这个神经元计算,输入向量就是1,2,3。这些值。
本质上,你会将输入1乘以权重1,输入2乘以权重2,输入3乘以权重3。将这些相加。然后这个值传递到激活函数,这就是该神经元的输出。这个方程基本上就是在向你展示这个。
它本质上是所有θ的总和,θ或权重,乘以所有的x。x是输入,然后φ是激活函数。这基本上在神经网络中反复进行,以计算每个隐藏和输出神经元。这给你一个示例,输入是1和2。
现在这个第三个神经元,实际上是你的偏置神经元。它作为偏置神经元的表示方式是将一个一连接到末尾。所以一个输入到第一个神经元,二输入到第二个,这个则输入到第三个。这个神经元基本上就是偏置。因此,这个权重会被加上,就像一个截距。
由于这是1,我们将1乘以第三个权重。这基本上是偏置神经元的工作方式。我们的权重可能是这样。因此,这可能是三个权重值。第三个称为偏置值。我们将这些输入乘以每个权重值并求和。这是0。
8变成了被传递到激活函数的总和。激活函数只是引入非线性的函数到神经网络中,使得一切都不是线性的修正线性单元。我们将看到这是现代深度学习中最流行的激活函数之一。
深度学习及其他与修正线性单元相关的家族成员,如leaky ReLU。softmax通常用于分类神经网络的最终输出。这确保了所有输出神经元的总和为1,因为你希望这些输出神经元代表神经网络试图分类的每个类的概率,softmax确保这些概率是真正的概率,并且加起来为1,正如概率通常应有的那样。
修正线性单元是一个相当简单的激活函数,但极其有效。你实际上是在取0和x的最大值,所以x是传入的值。softmax看起来像这样,它本质上是将它们相加,然后将每个值除以总和,这种归一化确保它们加起来都为1。
顺便说一下,如果你想实验一下softmax并看看这些单独的值是如何生成的。我有一个JavaScript示例,链接就在这里。那为什么是修正线性单元呢?
那么受欢迎的原因是什么呢?为什么这是如此受欢迎的激活函数?在深度学习之前,最常用的激活函数是双曲正切和sigmoid。这里显示的是sigmoid。当你将值输入到它时,它会产生压缩效果。无论是负无穷大还是正无穷大,这种行为都是所期望的。
这工作得很好。通常,你是通过梯度下降优化这些神经网络。因此,你是在计算误差函数的导数。这是误差函数。当我们改变一个权重时,误差会上升,误差会下降。你希望将误差降到最小。
只不过你无法一次看到整个图形。你实际上必须为合理范围内的每个数字计算神经网络。你只能看到你实际上所处的点,但这就是微积分中的导数的作用。你取导数,它会给你权重所在的瞬时变化率或斜率。
你可以通过这个值的斜率来判断。这有一个负斜率。这意味着我们需要增加权重以朝向最小值移动。你总是通过斜率或梯度的符号的反向来改变权重。这通常在机器学习中被称为梯度。因此如果我们查看导数。
在sigmoid函数中,你可以通过虚线看到它。注意它是如何迅速收敛到零的,因为那个导数被称为梯度。它会到0或消失的事实意味着我们会有消失梯度。这是消失梯度问题。在深度学习中解决了。
这是它主要解决的众多问题之一。因为它饱和到0,所以不如。因为修正线性单元在两个方向上都不会饱和到0,就像sigmoid函数那样。我们将看看为什么需要偏置神经元。本质上,它们是截距。就像你之前处理的Y等于Mx加K线性方程。
如果你查看这个,这就是我们改变权重的一个例子。如果你注意到我们改变了权重,它实际上改变了斜率。并且你真的。线总是必须通过零。当输入是。因此所有这些都通过零。没有办法真正改变这一点。当你改变偏置神经元时,现在你在移动。
你并没有影响斜率。因此将这两者结合使用,你实际上可以。你可以影响斜率并进行移动。你可以移动它。所有这些神经元一起可以以某种加法效果贡献所有神经元。让我们让这条线断开并基本上近似任何函数。
感谢观看这个视频。现在我们已经看到深度神经网络的一般介绍。我们准备开始查看Tensorflow和汽车,看看这些是如何在Python中实现的,以便你可以利用它们。这个内容经常变化。所以请订阅频道,以便及时了解本课程和其他人工智能主题。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P18:L3.2- 深度学习工具库TensorFlow和Keras简介 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学深度神经网络应用课程。在这个视频中,我们将介绍TensorFlow和Keras,并看看TensorFlow如何直接用于进行数学计算,而Keras则成为底层TensorFlow计算引擎之上的神经网络层。有关我AI课程和项目的最新信息,请点击订阅,旁边的铃铛可以通知你每个新视频的发布。
所以,TensorFlow是一个低级数学库,它让你能够访问CPU、GPU和网格计算能力,而Keras是一个高层抽象,它让你把这些数学结构视为神经网络。我这里给你一些链接,指向处理TensorFlow和Keras的各种有用资源。你需要处理的第一件事是,TensorFlow有很多不同的版本。
谷歌在重大变更方面可能非常出色或糟糕,视情况而定。很多聪明的人在TensorFlow上工作,他们对API应该如何设计有着非常明确的看法。随着不同派系的胜负,API会发生重大变化。重大变更意味着新版本会导致以前为旧版本编写的代码无法工作。
他们改变事物的名称。他们改变事物的大小写。有很多很多小的, 有时只是小的烦人事, 有时是大的结构性变化。因此,确保你正在使用本课程指定的Ten flow版本非常重要。这个视频是在TensorFlow 2.0开发阶段录制的。
但是只要你有20或更高版本,我会更新课程。如果由于更新的TensorFlow而导致某些内容出现问题,我会更新视频。因此,你只需运行这个,它会显示你拥有的版本。关于安装TensorFlow,我有一整部视频专门讲述如何在Windows上安装TensorFlow,还有一部关于Mac的视频。
这些涉及到使用CPU安装TensorFlow以获得良好性能。你需要使用GPU,并且你的GPU需要是合适的类型。在课堂上运行的一些作业和示例将需要在CPU上运行, 但这会很慢。而安装GPU并不是世界上最简单的事情。
我可能会做一个相关视频。我个人主要在云端运行GPU深度学习,这样我就不需要安装所有硬件和驱动程序等,但这确实是可行的。我建议这门课的作业和部分内容需要GPU的同学使用Google Colab。
Google Collabab是基于云的,你无需安装Python或其他任何东西。它完全准备就绪。我有一个视频在第一个模块中链接,介绍如何在这个课程中使用Google Coab,我们可能在第一次课堂会议中讨论过。因此,这可能是运行所有示例和完成作业的推荐方式。
这是一个强大的实例。它是一个双核,拥有12GB的内存和一块GPU。你无法超越它。因此,这就是我推荐的学习此课程的途径。至于我为什么为这个课程选择Tensorflowlow,嗯,Tensorflowlow得到谷歌的支持,在Google Cloud中有出色的支持。
它有很好的CPU和GPU支持,并且是用Python编写的。Python正在迅速成为机器学习和AI的高级语言。因此,学习Python和通过Ks以及Python学习深度学习是非常有利的。现在,你可以直接使用Tensorflow。
如果你正在编写非常自定义的机器学习模型,那可能是最佳选择。但总体而言,访问的方式是通过Ks。这使得深度学习变得更加简单。设置起来其实没有太多缺点,除非你确实需要对基础神经网络的计算拥有完全控制。
然后你需要Tensorflow,还有其他深度学习工具。我这里列出了几个。如果你特别喜欢Java,深度学习J绝对值得关注,H2O也是。Tensorflow在以前的版本中,至少是非常图形化的,所以它会后期计算。🤢
Tensorflow 2.0的一个重要特点是即时执行。现在,他们进行了很多更改。因此,如果你之前没有使用过Tensorflow,不用担心,它已经完全改变了。所以这将让你为最新版本做好准备。这只是展示了tensor board,它可以帮助你可视化你创建的神经网络。
我们将直接查看如何使用Tensorflow。我们只会在这个视频中进行这个部分,其他视频将完全使用Kira。所以这将做一个叫做Mandlebro图的东西,你可以在这里看到它。
如果你之前曾与Mandlebrots合作,你一定会认出那幅经典的图。实际上,这是一组非常简单的方程,生成了。
你可以继续放大这个区域,几乎在复杂的景观中是无限的,你可以深入探索。
在这里,我写了代码来基本上绘制曼德尔布罗特图。现在你可以看到这非常简单。那是生成曼德尔布罗特的代码。显示分形的函数在完全渲染后使用,我们在 Tensorflow 中做的实际上是定义。基本上就像是一个复数,它是一个复平面,你在整个平面上绘制曼德尔布罗特。
我不会深入曼德尔布罗特的实际数学,但有很多关于这一点的教程。
我们基本上是在这个平面上进行全面的扫描。我们进行了200次迭代。所以每次绘制时,它都会被画得越来越好。这是一个非常迭代的过程。所以每次通过它时,都会发送到 Tensorflow 进行处理。如果你愿意,可以使用 GPU。
速度快得令人难以置信,你真的不需要实际的 GPU。仅用 CPU 就可以做到。这是计算出来的方程,用于绘制曼德尔布罗特图像。
如果你运行这个,你会看到它实际上运行得非常快。现在为了更精确地观察发生了什么,这里也是直接使用 Tensorflow。我在这里创建了两个矩阵。所以这些实际上是向量。嗯,我想你可以称它为行矩阵,这个是列矩阵。因为这个是横着的。
这是两个值叠在一起,我们要对矩阵1和矩阵2进行矩阵乘法,然后打印出来。正如你所看到的,结果是12。现在我把它转换为浮点数,以便你不会看到所有的张量装饰。这是两个常量,所以是常量乘以常量。
你可以看出这一切都是非常线性代数导向的。现在我们在处理两个变量,我们要从一个常量中减去一个变量。我们这样做后,可以看到结果是负2,负1的行矩阵。我们现在可以重新赋值 X,因为 x 是一个变量,所以我们重新赋值,并能够基本上重新计算上面的计算,得到不同的值。
所以,这些是构建神经网络的基础块。现在让我们开始思考神经网络的层,就像之前那样。我们将使用一个经典的数据集,即每加仑多少英里数据集。这让我们能够。
该数据集为我们提供了各种汽车及其每加仑多少英里的统计数据或计算。所以想法是建立一个模型,利用气缸数、排量和其他汽车统计数据来实际得出每加仑多少英里,从而生成一个这样的模型。
在这里,我们将基本上读取每加仑的自动里程。我们将保留汽车的名称和汽车本身。汽车名称并没有预测能力,它们只是汽车名称。马力方面,我们确实有一些缺失值,因此我们将用中位数填充。
我们之前见过这个,所以我会很快地通过。然后我们创建我们的 x 和 y,x 是预测变量,因此我们在气缸、排量、马力、重量、加速度、年份和产地(即生产国家)上进行预测。我们正在计算这个。
我们试图预测每加仑的里程,这就是你的 x,用于预测的值,y 是你实际预测的内容。然后这就是 Keras 的实际样子,我们创建一个序列模型,这只是按顺序排列的层。我们创建我们的第一个密集层,密集层就是第一层的每个神经元都连接到下一层。
这是非常常见的。通常这就是层的工作方式,尤其对于像现在这样的表格数据。当我们进入图像时,这将有所不同。输入维度将是 x 的形状 1。因此这是我们拥有的列数,因为 x 是输入值。形状 0 是行数,形状 1 是列数。
Activ 是修正线性单元,我们有 25 个神经元。我们在下一个隐藏层有 10 个。我们不必告诉它我们有多少输入,实际上就是来自前一层的 25 个。激活也是如此。输出对于回归神经网络来说仅为一个,输出总是一个。
对于回归神经网络,重要的是你始终使用均方误差作为损失函数,优化器通常在这个类中使用 Adam,还有其他一些可以使用的,我们很快就会看到。然后我们进行拟合。我们将拟合 100 个周期,周期只是神经网络训练的时间。这可能足够,也可能不够。稍后我们将看到如何确定多少周期实际上是足够的。
详细模式意味着在进行过程中打印出数据。如果我们运行这个,可以看到损失在继续时缩小。因此,随着时间的推移,它变得越来越好,更有效。这就是上面详细值的作用。所以这让你可以控制输出到屏幕的数据量。现在,这里的表现并不好,这 100 可能不够。稍后我们将看到我们变得更加高级,这实际上会得到更好的预测。我们计算我们的均方根误差,24,信我。
在每加仑的里程上效果不是特别好,因为这是范围。所以在这种情况下,这并不罕见。你可以重新训练它。可能会给你更好的结果。是的,这确实是一个更好的结果。所以在这种情况下,重新训练就解决了问题。但稍后我们将看到如何自动控制所需的周期数。
你可以在这里看到这应该下降。是的,这好多了。这是尽可能好的表现。你有时会看到它降到3。然后我们可以打印出各种汽车的每加仑里程或预测的每加仑里程。现在你可以看到它们的差距更小了。你也可以进行分类。
我们将使用经典的IIS数据集,这里有四个测量值,可以给出三种不同类型的鸢尾花。你使用的是花萼长度、花萼宽度、花瓣长度和花瓣宽度。这就是鸢尾花分类神经网络的样子。它非常相似。你有输入,那将是四个输入。还有一个或多个隐藏层。
然而,对于分类,尤其是多类分类,这意味着你有两个以上的类别。你将使用softmax和类别交叉熵。如果这是一个二元分类,我们将在下一个模块中看到。那会有些不同。你会有一个二元ALo函数在这里。
但我们将在训练时看到这一点。训练这个模型时,它会训练并减少损失。你还可以打印出物种,这些是我们试图分类的鸢尾花类型。它的输出是这样的,采用科学记数法,这使得阅读有些困难。你可以告诉它不要使用。
你可以抑制科学记数法,但本质上,这三个值是三个鸢尾花中最大的那个,这个被分类为第一种鸢尾花,即山鸢尾。你也可以抑制科学记数法,然后你会看到那些值都是1。
或者至少非常接近1。这意味着它全部是第一类。现在,IIS文件按单个鸢尾花排序,这就是为什么文件顶部的它们都是相同的。你也可以将这些预测转换为数字值,0意味着第一类,1是第二类,2是第三类。这就是如果你只是想要一个字面上的数字,告诉你哪个类别实际上被预测。
你还可以使用这个数组表示法打印出鸢尾花类别的实际文本名称。你可以看到准确率为98%,所以这是非常的、非常好的。你还可以输入临时值并进行预测。这就是你如何输入一个值并预测这些测量值的鸢尾花种类。
你可以一次输入一组数据。这就是你如何输入两个。感谢观看这个视频。在下一个视频中,我们将看到如何加载和保存鸢尾花的神经网络。这个内容经常变化,所以请订阅频道,及时了解本课程及其他人工智能主题。
😊。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P19:L3.3- 保存和加载Keras神经网络模型 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学深度神经网络应用的课程。在这个视频中,我们将看到如何从磁盘加载和保存 Keras 的神经网络。一旦你花了这么多时间训练一个神经网络,你希望能够保存一个副本。
这在你保存一个经过训练的神经网络副本并将其部署到网页应用或网络服务时也很有用。就像我们在本学期稍后会看到的那样。
有关我的 AI 课程和项目的最新信息,请点击订阅以及旁边的铃铛,以便收到每个新视频的通知。现在,当你保存和加载 Keras 的神经网络时,你可以选择几种不同的文件类型。其中两个是文本格式。
因此,你实际上可以打开文件并在文本编辑器中查看神经网络的组件。我通常不这样做,但如果你想的话,可以这样做。在 JSON 中,有很多工具可以读取和写入 JSON,所以你可以直接访问神经网络的保存状态。
所以 Yaml 是一种仅存储神经网络结构的格式,不存储权重。类似地,JSON 也不存储权重。这就是为什么我不常用前两个格式。不幸的是,这些是最容易阅读的文本格式。HDF5 不要与 HDFS 混淆,后者是 Spark 和 Hadoop 的格式。
这是我通常存储这些内容的格式。前两个选项,如果你不需要存储实际的权重,可以使用。这演示了你如何做到这一点。所以这里我们正在打开之前的数据集 auto MPG。我们将构建几乎完全相同的神经网络。
进行预测并计算均方根误差,并打印出来。我们将把这个神经网络保存到网络 JSON 文件中,它将与您的工作簿位于同一目录。我们将保存为 JSON,保存为 Yaml,保存为 H5。
我们可以继续运行这个。现在注意 RMSE 为 7.17。每次你运行这个,你都会得到一个稍微不同的 RMSC。这实际上是一个稍微差的结果,你绝对可以做得更好,但对于测试这个功能来说已经足够好了。现在我们将加载它。注意值完全相同。
这表明它确实是保存到了磁盘文件并被读取回来。因为如果你重新运行并重新训练,那些将是完全不同的值,而这样做效果不好。现在这个技术将在整个课程中使用。实际上,在接下来的部分“早期停止”中,我们将看到可以编程神经网络仅使用其实际需要的训练周期。
它实际上会在最佳点停止并保存神经网络,然后你可以稍后重新加载最佳权重。在本课程的后面,我们还将看到如何将神经网络部署到网络应用程序或类似的地方。能够保存你训练的神经网络非常有用,以便将其部署到云端或其他地方。
现在你已经看到如何保存和加载汽车的神经网络。我们将在下一个视频中讨论如何使用早停法在神经网络过拟合之前停止它,保存和加载在这里起作用,因为神经网络已被保存。
当它达到最佳值时,你需要稍后重新加载它。感谢观看本视频。该内容经常变化。因此,请订阅频道,以便及时了解本课程和其他人工智能主题的最新信息。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P2:L1.1- 深度神经网络课程概述的应用 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff Han,欢迎来到华盛顿大学的深度神经网络应用课程,这是2021年秋季学期的开始。
🎼所以在这个视频中,我将开始课程,介绍它。如果你是通过华盛顿大学上这门课,我将讨论如何提交作业等内容。目前以在线和混合形式提供,在混合形式中,你会在校园上课一次,其他时间是远程的。如果你是纯在线版本,一切都是一样的,除了你观看的是预录视频,或者如果你希望,可以参加直播。如果你只是通过YouTube在网上收看,所有内容都对你开放,只是你不能提交作业或获得我像实际学生那样的个别帮助和指导。上学期我们以完全在线的形式教授这门课程,我一直在COVID期间这样做,而这一学期我们实际上…
我们将根据COVID的情况逐日安排,但目前的计划是这门课程将在丹佛大学校园举行,华盛顿大学的四次会议。我将通过Zoom进行直播,并且会有录制可用。所以这学期我不要求班级出席。我们将在第一次会议和Zoom中进一步讨论这些信息。关于这门课程的所有信息,你可以通过华盛顿大学的Canvas系统获得。
这些链接主要指向我的Github仓库,所有这些内容都存储在那里。这是我在华盛顿大学的页面,我可能需要更新我的照片,我认为COVID时期的胡须可能会留着,但网站链接在这里,这里有一些关于它的一般信息,你会想直接去Github上的课程会议。
如果你是通过华盛顿大学的Canvas系统访问这门课程,它的界面基本上是这样的。所有视频都可以通过YouTube或Kaltura获得。它们是完全相同的视频,你可以根据自己的喜好观看。其中一个很酷的地方是提供了字幕,你可以在视频中搜索主题,这在Kaltura中也可用,你还可以加快播放速度,以两倍于正常速度观看我。
我一直在做视频。这些视频每个都会包含一些内容,所以这是链接到Canvas上Calaltura的视频,然后会有阅读材料和每堂课的作业。如果你点击阅读材料,它会将你带到GitHub,并且如果你直接通过互联网访问,它的样子就是这样,实际上这个课程中的一切都可以在Jupyter Notebooks中获得,而Jupyter Notebooks是进行深度学习的一个很好的方式。
😊,虽然你不需要GPU,但我将在本课程中向你展示的一些内容实际上只用CPU是无法工作的。现在我身后这台电脑有一个相当高端的GPU。我正在使用的这台Mac也是,正是目前Mac的一个激动人心的时刻。如果你有新款的Mac,现在可以使用M1,以便能够使用GPU或加速器来利用深度学习所需的高速数学计算。
我有一个视频展示如何准确设置M1 Mac以满足本课程的需求,如果你使用Linux或Windows,也可以在其中使用GPU。你确实需要Nvidia类型的GPU,因为Keras是TensorFlow Keras所必需的。
这是我们在这节课中使用的。如果你的系统上没有GPU,我强烈推荐你这样做。实际上,如果你不想经历设置GPU的步骤,因为确实需要很多软件配置。
驱动程序和那类有趣的东西,我确实推荐Google Collab,所有我在本课程中提供的Jupyter Notebooks顶部都有一个“在Collab中打开”的链接,所以你只需点击它,它就会在Collab中启动,现在我们在Collab中。
我在使用Google Collab Pro,每月大约$10,这个课程并不需要它,但当我们进入Kaggle比赛时,它会给你带来不公平的优势,这里的“不公平”指的是它是允许的,你可以使用它,一些学生在Kaggle比赛期间确实使用Google Collab Pro,以获得更快的GPU,你在Kaggle内部也会有一个很好的GPU可用,但我们会在第一次课堂上进一步讨论Kaggle。
所以你可以看到所有内容都在这里可用。你可以运行这些不同的部分。第一个课程模块大部分只是介绍性的材料,直到最后才有很多代码。所以如果你运行这部分代码,这会检查你的GPU是否真的可用,你会看到那个小的旋转标志,它正在旋转,并会告诉你GPU是否可用,以及你正在使用的TensorFlow版本,所以这里是TensorFlow 2。
5是我这个学期测试所有代码的版本。由于GPU不可用,这意味着你需要在collab中向下更改运行时类型,启用你的GPU,它会重启你的虚拟机,这没问题。现在我们继续运行,它的GPU应该可用,是的,GPU可用了,这将大大提高所有处理的速度。
如果你想仅使用CPU,你可能可以完成大约90%的课程。我想说Mac M1的支持还是相当新的。我自己只有大约一个月的时间使用这台Mac M1,但我正在运行所有的课程材料,并在遇到不兼容的问题时进行修复,大约95%的课程都能在Mac M1上运行。
还有一个小地方是无法工作的,那就是我们进入stylegan的部分。在那里,你使用Gs生成计算机生成的面孔,因为那段代码是专门为NviDdia cuda创建的。如果你想在Mac上实际运行它,可以查看关于coabab的入门视频。
我有视频展示如何做到这一切。如果你不是那种配置驱动程序的人也没关系,机器学习工程师有时并不是这样。你可以直接使用coab,大约70%到80%的学生使用coab,所以我在这里给你提供说明。
这些是关于如何使用coab以及如何在Mac上设置的链接等等。我还有一段关于如何在Intel Mac上设置的的视频,虽然Intel Mac没有加速,但至少你可以运行一些东西。这些是课程的作业,我们会有一个冰breaker,你需要向其他学生发布一些关于你自己的信息。我会阅读每一个,因为我对你们的背景非常好奇。
如果你对AI机器学习等职业方向感兴趣,我会回复每一个冰breaker问题。如果你问我一些问题或给我一些评论,我一定会回复你,因为我会浏览所有的课堂作业,50%是每周到期的。
对于课程的第一部分,前1节课。这些是小程序,测试你对材料的理解。每个程序可能需要半小时到一个小时,甚至更长的时间完成。每个人在课程中的速度不同,有些部分比其他部分更复杂。第一个程序很简单,你只需运行它,不需要做任何更改,只是证明你可以运行Python代码,因为这门课程完全使用Python,并提交一个结果。我使用自动评分和反馈程序,所以当你提交时,它会自动使用我将发送给你的API密钥。
你必须是我的学生才能获取这个,因为我无法在没有Canvas的情况下给你打分,也没有时间给不是我学生的人评分,所以这是我写的一个项目,完全是我自己的创作。我实际上使用神经网络和正则表达式等工具来进行评分,它并不总能给你准确的分数,但会给你反馈,并告诉你,你可以在此之前提交多次。因此,如果你想一直提交,你应该能够在所有课堂作业中获得100%。它会告诉你哪里出错,并检查你的输出,让你知道它是如何匹配的。如果你不明白为什么你的输出与我的不匹配,可以通过Teams或电子邮件向我提问,这些是与我联系的主要方式。
你将有团队参与这个项目。你可以选择自己的团队,团队可以跨越两个部分。这里有一个完全在线的部分,还有一个在大学见面的部分,总共四次,所以你可以与其他人一起参与,你也可以与不在班级中的人一起合作,通常这是在课堂上的Kaggle中进行的,所以互联网上的其他人也会参与竞争。
我会对提交的内容进行排名,前五名提交者将会在接近期末课时进行展示,这样你们就不必每次见面时都听我讲。我们将在第四节课上见面,完全在线的学生不需要这样做,你们当然可以选择展示。
在Zoom上,如果你是前五名之一,我会联系你们。当我们达到那个真正的Kaggle时,会有可观的奖金可供争夺,这些Kaggle没有奖金,但我可以告诉你的是,前两名我完全愿意为你写一封很好的LinkedIn推荐信,谈论你在Kaggle比赛中获得顶尖位置的出色表现,之前学期的学生都非常喜欢Kaggle,我认为这是这门课中最有趣的部分,它让你可以与其他学生竞争,真正看到你能产生多好的模型,然后是期末项目,如果你是前五名之一,你不需要做期末项目,但期末项目基本上是你的演示。
这是深度学习的顶级会议之一,如ICLR或NIPS等。基本上是写一篇总结,我选择的一些论文是你可以从中选择的,因为我给你提供大约10篇,实际上是华盛顿大学的学者们写的,所以这挺有趣的。这些都是我们第一次在大学见面时的所有作业。
我会逐步讲解如何提交作业,如果你想和我一起进行操作,你就能提交你的第一份作业。再次提醒,如果你通过互联网连接,你当然可以看到作业,但实际上无法提交或评分等。我是你们的讲师Jeff Heaton,我拥有华盛顿大学的信息管理硕士学位,后来在Nova Southeastern University获得了计算机科学博士学位,我是在生活的后期完成的,二人制。
所以我并不是一个传统的博士生。我是IEEE的高级成员。我的电子邮件地址是JT Heaton,加上这个大学的域名。我还有一些其他的认证,你可以看到我社交媒体的一些链接。我从未计划成为YouTuber,但在你们有Calaltura之前我就开始把这些视频上传到网上,结果我发现我有超过50000个订阅者。所以YouTube很有趣,我继续在上面发布其他视频。作为学生,我非常鼓励你订阅我的频道,我不知道是否应该像YouTuber总是告诉你那样猛戳喜欢按钮,但如果你订阅了频道,你将会看到其他超出课程的高级主题,随着我发布额外视频,通常我每周发布一段视频,有时只是课程材料的更新。我每学期可能会重启5%到10%的课程。我有一个Discord服务器,你可以在上面进行讨论。
这是在Canva内部完全开放给互联网的,我有一个链接到Teams,Washoe Teams系统中有一个为学生设置的团队。我强烈建议你尝试一下,如果我有空的话,我经常和学生聊天,这是一个寻求帮助的好地方。你可以在Google Scholar上查看我以前的论文,当时我更多地专注于研究。多年来我没有写过论文,我在researchgate和ORCID上的资料也是我当时发表更多论文时的记录,实际上我就在这里。
如果你要在自己的电脑上安装,我们将使用Python Anaconda。我其实推荐Miniconda,它是Anaconda的精简版。我们将使用TensorFlow。目前,争夺的两个大竞争者是TensorFlow和Pytorch。我也非常喜欢Pytorch。这个课程始于2017年,当时TensorFlow确实是唯一可用的,Pytorch也不错,但这并不意味着它们之间有明显的领导者。
我看到越来越多来自Pytorch的支持,尤其是新论文的发布,特别是带有代码的论文。TensorFlow也得到了我在大型公司担任数据科学组副总裁的日常工作中使用的一些工具的支持。所以什么是机器学习?机器学习就是从数据中学习。
所以,你有传统的软件开发,你会获取输入数据并编写。
程序代码,你会在计算机上运行这些代码,并获得输出。机器学习,你从过去已知的案例中获取输出,所以你有标记数据。也许你有一堆猫和狗的图像,并将其标记为猫和狗,你把这些放入计算机,它给你程序代码。程序代码就是神经网络。所以这被称为数据驱动开发。
这减轻了你需要编写大量代码以区分猫和狗的负担,因为这对于传统编程来说是非常困难的。这是我看到深度学习被广泛应用的三个领域之一:预测建模。
这非常像你有一些输入。你在电子表格中有一个输出,但现在你有新的情况,没有标记。这是未标记的数据,你想形成那些预测,计算机视觉同样适用于自动驾驶汽车。
区分猫和狗,我给你在Caggle的任务将是一个计算机视觉问题,这学期将是一个相当具有挑战性的任务。我总是为Kle竞赛生成所有数据,所以这是全新的,是你无法在网上轻易找到潜在解决方案的,此外还有时间序列预测,比如股市。
想想比特币,想想任何东西。显然,我还没有破解如何预测比特币,因为我还有日常工作和夜间工作。回归、分类,这些都是回归,你是在预测一个数字。分类,你是在预测一个类别?
深度神经网络就是经典神经网络,但它们在卷积层、递归层、变换器、注意力等方面进行了多种扩展,使其超越了以往的能力。真正推动这一领域发展的个人有Jann LeCn、Jeffrey Henton、Yahua Bennjiio和Andrew Ning,为什么深度学习。
与其他机器学习方法相比,如支持向量机、随机森林、梯度提升机,神经网络在计算机视觉领域表现出色,因为神经网络能够自主创建特征。
以前处理计算机视觉的方法是引入额外图像并从中工程特征,查看最大颜色、扫描,尝试找出细节。Andrew Ning对此有很好的描述,旧算法如果你是学术研究人员,旧算法就是你不再研究的东西。
深度学习是他和大多数机器学习研究人员目前关注的重点。
如果你的数据不多,数据较小,旧算法通常会优于深度学习。我们将使用Python,使用TensorFlow,课程中会稍微涉及Pytorch,尤其是用于GNs,因为我们使用的Stata2 AD软件是完全在Jupyter笔记本中编写的。如果你需要课程教材,也可以获取。
我编写的教材基于你所拥有的所有材料,教材请点击这里打开,格式为PDF,超过500页,基本上与GitHub库中的材料相同,只是以可打印的教材形式呈现。最终,我会将其出版为实际书籍,你可以通过Kendall和纸质版购买。
我还没有更新。每个学期我都会更新,所以当你下载时,会有最终的更改,并会标明2021年秋季。就是这样,这门课程的快速概述。我们将在Zoom会议和本学期实际校园的面对面会议中具体讨论如何安装、提交作业。感谢观看此视频。如果你觉得有用,请订阅我的YouTube频道,并考虑点击点赞按钮。
如果你通过YouTube观看此视频。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P20:L3.4- 在Keras中提前停止以防止过拟合 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·海顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将看到对抗神经网络程序员的常见敌人——过拟合的第一个技巧。我们将学习如何使用早期停止,而不是决定训练神经网络的轮数。
你可以预留一个验证集,并训练神经网络,直到验证集上的错误不再改善。点击旁边的铃铛订阅,以便收到每个新视频的通知。
早期停止是一种防止过拟合的方法。在我们课程的进展中,我们还将看到其他防止过拟合的方法。😊!
但早期停止实际上试图避免你过度训练神经网络。这是一个常见的可视化,展示了随着训练越来越多,过拟合会产生的负面影响。X轴显示错误,Y轴显示训练时间。虚线是验证集,黑线是训练集。
那么,随着你不断训练,训练值与验证值的错误发生了什么?通常,验证和训练会相似。随着训练开始,验证可能会稍微差一些,因为训练集会有些过拟合,因为神经网络有这些值可用。
它正在记住其中的一些。它对训练集的拟合非常好。因此,随着你的进展,验证集通常会稍微差一点。然后,当训练集越来越好时,验证集在某个时刻会开始几乎从这个点趋向一个更高的错误值。
你的验证值会越来越差,而训练值会越来越好。这就是过拟合的结果。在这一点上,过拟合真的开始发生。现在,你可能不会在外面某个地方意识到这一点,因为你必须想,好的,情况在变差,或许会变好,或许会变好。现在可能不再变好了。
现在,有些情况下你会到达这个程度,然后又会回落到这里。在这门课中你会看到一个值叫耐心。你有多耐心,来观察这些值再次趋向收敛。
而不是在验证上发散,只是过拟合,而没有得到更好的值。这就是早期停止的意义。你提前停止,在这个点上停止。我们将看到捕捉到最佳或最低验证错误的权重是多么重要,这可能正是在这里我们有最低的验证错误。
然后我们保存这些权重,这样即使我们决定在这里或这里停止,取决于我们的耐心,我们也能返回到这里。因此,这也是一个重要的事情,关于耐心。耐心实际上不会影响你最终获得的整体最佳得分。
你可以根据自己的意愿保持耐心。这只会让训练时间变得更长,因为如果你设置一个巨大的耐心周期,你就需要走得更远。现在,要做到这一点,我们需要将原始数据集分成几个数据集。现在,通常我们只会有前两个,但有时也会有一个保留集。
你甚至可以将其拆分为不止这三组,具体取决于你在做什么。它还取决于你有多少数据。如果你有很多数据,那么你可以将其拆分为多个训练集,真正确保你没有过拟合,确保你不会基于你训练过的任何东西进行评估。你可以让这个过程非常纯净,甚至可以拆分出一个单独的验证集,仅用于早期停止。
但每次你进行拆分时,你都会失去一些训练数据。因此,这是一个权衡,涉及到你希望在训练和验证之间保持多纯净,从不在神经网络训练过的任何东西上进行验证。你希望在训练集上训练多少,因为神经网络通常会表现得更好。
至少到某种程度,你提供的训练集越大。在Kaggle比赛中,例如,我通常会接受一些小的训练和验证的交叉污染。这意味着我可能会使用一个验证集进行早期停止。只是因为我知道我有那个Kaggle最终会给我的保留集。
我不能做太多,否则我会在一定程度上过拟合到Kaggle的保留集。因此,这实际上是一个权衡,我们将在进入超参数调优和其他需要创建附加集的内容时进一步讨论。然而,终极保险策略是,你设定一个最终的保留集,直到最后才使用,并且在训练过程中不使用它,直到你说,好的,我对我的模型很满意,让我看看当我尝试最终时会发生什么。
最终保留集。这就是你通常决定承诺的错误率,关于你的模型实际训练得多好。这实际上是什么样子。在早期停止方面,你要做的是将数据集分为80%和20%,这个20%成为验证集。
80%成为训练集。你将根据这80%来拟合或训练你的模型。然后你将在这20%上进行验证。因此,你会得到一个训练误差。这是它与训练集拟合的程度,但之后你将用那80%训练出来的模型与剩余的20%进行验证。这让你更有信心,这是你的神经网络在看到新数据时真正会经历的误差。
现在我们要讨论早停法,早停法确实需要一种验证集。这会导致你的验证集现在被用作早停法,所以它现在是训练集的一部分。因此,这时候有一个最终的保留集是很好的,你可能希望最终在这个保留集上进行评估,如果你真的将验证集用作早停法,请注意这一点。那么,你可能需要另一个验证集来真正承认一个错误,或者你可以接受你在验证集中可能有一些膨胀,并且你可以真实地使用你停止时的得分作为最终神经网络可能表现的估计。
但请注意,你在此时已经将早停法的验证集转换为训练集。我们要做的是监控这一点。当验证集不再减少并且我们的耐心用尽时,我们将停止。我们将提前停止。我将给你展示两个示例,告诉你如何做到这一点。
我们将使用分类和回归进行早停法。代码大体上是相同的,但这为你提供了一些良好的起始代码来参考。因此,对于这个示例,我们将使用鸢尾花数据集。我们有花萼的长度和宽度,以及花瓣的长度和宽度。现在我们来运行这个,以便加载数据。
当星号消失时,数据已经加载好了。我们运行了它,你可以在这里看到结果。我们先查看结果,然后我会告诉你发生了什么。我们不断训练。你可以看到训练和验证的损失,然后在大约101的时候。
我们决定提前停止,并恢复了最后一个最佳周期的模型权重。我们设置神经网络的方式大体上和之前一样。它将进行分类,因此我们使用Y形状。我们使用类别的数量以及softmax和分类交叉熵。
这三者合在一起告诉你这是一个分类神经网络。确保你像这样设置它。我们现在正在创建一个监控器,这是执行早停法的部分。我们告诉它我们有五个周期的耐心。因此,我们只等待五个周期以停止改进。详细程度设置为1,这样我们就能看到下面那个小通知。
我们真正告诉它,恢复最佳权重。现在我们将进行拟合。但注意我们给了它X训练Y训练,并且传入了验证数据。我们以前没有这样做。所以验证数据,X测试Y测试与X训练Y训练来自上面的拆分。我们将其拆分为验证和训练集。
所以我们将25%分配给测试集。剩下的75%分配给验证集。所以你有X训练,X测试Y训练。这些是期望值,Y的值。现在你有四个测量拆分为训练和测试。并且你有期望类别,实际上被拆分的IR类型。训练和测试。
随机状态42,这只是给我们一个一致拆分的方法。然后我们在这里做的唯一其他事情是传递一个回调,监控。因此这就是我们创建的早期停止对象如何实际插入到训练过程中的方式。当我们调用fit时,它在训练时工作。所以这就是如何为分类实现早期停止。
对于回归来说,过程几乎完全相同。你创建一个监控。你将其传递到回调中。你需要提供验证数据。我给你确切的代码,以便你可以快速使用。顺便说一下,如果我们想查看早期停止的准确性。
注意,准确率非常好。😊因此我们不必猜测训练的轮数。它训练到看到这一点为止。我们训练得足够多。所以这是一种你可以估算而不必猜测给你的神经网络多少轮次的方法。这是一种减少超参数的方法。
关于你的神经网络,你必须选择所有这些会影响行为的因素,比如轮数、层数。我们稍后会看到如何自动选择层和其他内容。但这是一种你至少可以使用数学准确度在某种程度上选择训练轮数的方法,以及回归的早期停止的简单示例。我们使用自动每加仑英里数。这与我们之前做的设置相同。
我们将其拆分为x和Y,使得y为每加仑的英里数。这就是我们试图预测的,X是我们用来预测每加仑英里数的所有其他值。然后我们使用与之前分类时完全相同的代码。我们将其拆分为训练集和测试集,25%的拆分。现在我们进行回归。
注意我们在神经元中有一个输出。我们有均方误差,这表明这是一个回归神经网络。其他部分都是相同的,我们传递了监控。我们提供了X和Y,既用于验证也用于训练。所以你提供了训练和验证的两个方面。现在我们可以运行它。它训练、训练、训练。你可以看到测试结果。
训练损失和验证损失都在减少。在某个时刻,它决定停止。它恢复了最终权重,所以它在这里只训练到了 31 个周期,就失去了耐心。然后你可以测量最终的均方根。这不是一个特别好的均方根,现在是 12。请记住,神经网络是从随机权重开始的。
这让我有机会快速说明一些有趣的事情。记得均方根是 12。现在,让我们重新训练整个模型。现在,重新计算这个值。注意到巨大的方差,这真让人烦恼,但由于它们从随机权重开始,有时会得到不同的误差值。
这使得调优变得非常困难。想象一下,如果你再添加一个隐藏层。当你有 12 个时,但你再加一个隐藏层,天哪,我的结果下降到了 4。这很不错,不,其实只是神经网络中正常的方差。我们将在下一个模块中看到一种叫做自举的方法将会使用。
你实际上只需要多运行几次,取个平均。你如何处理这些事情,比如说,Drop out,有助于至少减轻一点。这只是处理神经网络时的生活事实之一。它们在输出结果中提供了很大的方差。
感谢你观看这段关于早停的视频。在下一部分,我们将看看如何从保存的Keras神经网络中提取权重,并将这些权重放入数学方程中,实际计算出数值。这消除了过程中的所有魔法,你可以看到这仅仅是数学计算。这些内容经常变化。所以请订阅频道,以便及时了解本课程及其他人工智能主题。
😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P21:L3.5- 提取Keras权重并手动进行神经网络计算 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeffine。欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看到如何实际提取Kes创建的神经网络中的权重,并将这些权重放入方程中,以便我们可以实际计算神经网络的输出,并看到这个过程并没有什么魔法。
😊,这仅仅是权重与输入相乘,产生我的AI课程和项目的最终输出。点击旁边的铃铛订阅,以便接收每个新视频的通知。这是Ks和Tensorflowlow的代码,但这实际上适用于几乎任何东西。我将向你展示如何实际提取神经网络中的权重。
这样我们就可以将它们放入图表中,实际进行计算,得出与Tensorflowlow相同的数字。😊。
对于这个,我们将使用一个异或神经网络,即XOR函数。这是它的输入,0,0,任何与与或相关的真值表。预期的输出是。记住XOR的要点是,如果两个输入相同,输出就是0。如果两个输出不同,零和1与1和0相比,输出就是1。
在这里我们设置了一个神经网络。它有两个输入和一个隐藏层,层中有两个神经元。我们追求绝对最小的神经网络,只是为了表明你实际上并不需要太多就能计算一个异或。此外,由于我们将手动计算这个,或者说懒惰一些,我不想给你一个真正深、深的神经网络,然后再手动计算。
这样做是不行的。所以我们将用均方误差来优化它,最终输出将是一个神经网络,这是一种回归神经网络。你可以将XOR用作分类或回归,在这种情况下,我将其作为回归来处理。我基本上在这里训练它。我训练了100,000个周期。
这可能会花更长的时间,因为这里的权重很少,你的初始随机值或权重将对你的训练成功有很大影响。我们可以用远少于这个数量的周期来完成这项工作。这基本上就像用发电机烤奶酪三明治,但我现在并不想向你展示如何调整这些东西。
我只是想设置权重,以便它们适合一个异或网络。我们将把这些放在图表上,向你展示基本上你可以计算相同的输出,这样你就可以看到Kis给你的权重。我训练它,我预测它,这对神经网络来说是好的,因为。这四个权重对应于输入中的这四个。这是科学记数法。
所以负4是0.000。那个数字。因此这两个实际上是0,而中间的这两个实际上是1。所以如果你不习惯看到这样的数字,这可能看起来很奇怪,但这是一个很好的输出,神经网络训练得相当好。然后我们能做的是,我写了这个小程序,它会转储权重。
所以你看到层0的计数是从零开始的。偏置到下一层1的权重。再一次,我们是从0开始计数。神经元1,神经元0,神经元1。这些是偏置。这些是真正的权重。因此,这个神经网络中没有很多权重和偏置,它相对较小。
所以我将在这里稍后画一个图,我们将把这些值复制到图上。然后我们将手动计算。如果你想这样做,我在这里给你代码,你把输入设置为1和0,So1在0和X O R。这是不同的。
所以它应该是1。它输出的是0.96。现在,由于我们是手动计算的,我截断了相当多的数字。所以1.29变成了1.3,当我们画图时会这样做。因此我们失去了一些准确性,但这两个输入神经元,我们将给它们输入值0和1。这就是我们要计算的。
你可以真的计算它,任何你想要的其他值。但对于那四个独占的值,我们还将有偏置神经元。所以像我们在之前的课程视频中看到的,你实际上是在不断计算一个加权和,用于神经网络。
所以我们将计算隐藏神经元0的值。H0。每个零都有来自前面三个的输入。这些都有权重,正如我们之前程序输出所看到的,我将把它们复制过来。因此,这将成为我们用于计算隐藏0的值的加权和。
所以要做到这一点,我们将输入0乘以它的权重,即1.3。我是1乘以1.3。那个是来自第一个,实际上是第二个输入神经元。然后我们必须加上偏置。我们基本上执行这个计算,结果是0。因此隐藏神经元0的值是0。接下来,我们将计算。
隐藏神经元1,即第二个神经元。它也有类似的情况。它有三个权重进入。将从Keras程序的输出中复制这些值。因此这就是简单的1.2,我们基本上再次计算加权和。第一个输入I0消失,第二个输入贡献了1.1.2。
第二个隐藏神经元的截距或偏置为零。这整个内容,加起来,基本上等于 1。2。然后这个值,我们需要通过激活函数。两个都需要经过激活函数。那就是修正线性单元。
基本上,这将是最大值。0 和 1。2。也就是 1。2。所以这里的隐藏神经元的输出是 1。2。上面的处理方式类似,用它的激活函数。它将被最大化,因为它也是这个值。最大值 0,0 是 0。可以使用的激活函数,我可能会在期中考试中给你一个不同的。
在这门课上你会见到的其他激活函数只有 sigmoid 和双曲正切。还有其他的,但这些是用于回归的。如果你在做分类,你可能还会看到 softmax。但主要关注这些。现在输出是最终层,这样我们才能实际获得这个神经网络为我们提供的内容。
这将与之前类似。我们确实有另一个偏置连接。所以你将基本上再次拥有三条有界连接。我们基本上会复制在 Caras 中的输出权重。这里是 0。最终的方程将整个内容联系在一起。
这基本上就是从隐藏神经元 0 输出的内容。乘以 1。6,加上 1。2 乘以 0。8。你可以看到 1。2 乘以 0。8,然后加上偏置或截距,这里是零。然后整个内容等于 0。96。这是你的最终输出,约等于 1。0。
这就是你从异或运算中预期的结果。零和什么。就是这样。这是使用 Kiro 为我们训练的权重计算出来的神经网络。所以我们可以看到,这里真的没有什么魔法。😊 这么简单的神经网络,你实际上可以手动编码这些权重,难度不大。
我可能还会做一个视频,这样你可以看到如何实际手动编写其中一个。你确实需要这个大小的神经网络。你绝对需要隐藏层。
感谢观看这个视频。在下一个视频中,我们将看到可以与神经网络一起使用的更高级的训练技术。😊 以获得更好的结果,并以各种不同的方式测量我们的错误。内容经常变化,所以请订阅频道,以便随时了解本课程和其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P22:L4.1- 为Keras深度学习编码特征向量 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将开始查看表格数据。这是数据,不是计算机图像或音频,也不是深度神经网络特别擅长的复杂数据输入,而是看起来像来自Microsoft Excel的数据,其中有列和行,你将尝试根据其他列预测其中一列。
将这样的数据输入深度神经网络时,通常每一行是一个输入或一组输入,输入到该神经网络的输入神经元中。所有进入神经网络的数字集合,其中一行被称为特征向量。所有进入神经网络的数据都需要是数字形式。在这个视频中,我们将看到如何为我最新的AI课程和项目构建该特征向量。
点击订阅并按旁边的铃铛,以便在每个新视频发布时收到通知。对于这个例子,我们将看到如何编码一个特征向量。我们将使用之前见过的简单数据集。😊。
我将运行这个程序,它基本上向你展示了这个数据集的构成。我们之前已经讨论过这个数据集,但我会快速回顾一下。它有一些分类变量,比如职业和地区。因此,这些需要转化为虚拟变量,而你试图预测的值是对于每个个体,他们购买了哪个产品,A、B、C或D。记得产品的范围是到D的。现在。
使用这个数据集为神经网络准备数据时,有一些需要考虑的事项。因此,如果你进行分类,所需的列是产品。这里有一个ID列,这对你没有用,所以你将去掉这一列。许多字段是数字的,可能不需要进一步处理。
但我们会看到这并不完全正确,神经网络。有两件事可以对数字值进行处理,这将非常有助于神经网络。第一是将它们放在一致的范围内。收入的范围要大得多,达到数万,而年龄则在100以下,这会削弱神经网络的预测能力。
因此,将这些数据调整到一致的范围肯定会有所帮助。我会在以后的一个视频中给你展示一个例子,我们就调整这一点,预测能力会显著提升。你还可以做的另一件事是将这些数据中心化到零附近。现在,中心化到零虽然没有范围调整那么有效,但对神经网络是有用的。
在这里,你希望有一些负值和一些正值,最好负值和正值的数量大致相同,因此数据中心围绕0。快速实现这两个目标的方法是使用Z分数,并将其编码为Z分数,因为Z分数是距离均值的标准差的正负值。
所以我们将继续计算例如工作职位的虚拟变量。当我们运行这个时,可以看到所有的虚拟变量都在这里,每一行是一个虚拟变量集,因此你在原始数据集中有2000行,而有33个虚拟变量,因为每个工作职位有33种不同的职位类型。接下来你需要做的是将其合并到数据集中,这样你就会有一个包含这些虚拟变量的数据集。
我们还会删除工作职位这一列。因为在这两个部分中我们都在处理列。你可以看到虚拟变量已添加到此处,前面有工作下划线作为前缀,正是这个前缀在这里指定的。如果没有这个,我们将仅仅得到PQ,PE,直接合并到数据集中。
而且,很难跟踪这些实际上来自工作职位的信息。我们用类似的方法引入区域,现在我们同时拥有工作和区域。这是很好的,因为我们有了前缀区域和工作。否则,这两者会有点混合在一起。关于收入,我们确实有一些缺失值。
所以我们将从收入中提取中位数,并将其放入缺失值中。现在我们拥有了完整的收入值。理想情况下,你可能不会。你可能希望在这方面做得更复杂一些,拥有多个中位数,也许你会将年龄划分,这样收入可能与年龄相关。你会这样做。
将年龄划分为多个区间。你需要计算每个区间的中位数,然后智能地选择一个中间值来填补缺失值。使用该区间来进行选择,这样可以得到更有意义的缺失值。我们可以看到数据框中包含了所有的列,现在可以获取我们的X列。
我们通过获取与之前相同的列来处理这个问题。但是我们将删除产品,因为产品是我们试图预测的对象。包含产品存在两个问题。如果这确实是你想预测的内容,那么这就是目标泄露,神经网络预测它将是微不足道的。
你可能会在神经网络上获得完美的分数,来自神经网络的完美分数。但对我来说并不是完美的分数,因为你会生成一个无用的神经网络。如果你试图预测一个人购买了哪个产品,同时也告诉神经网络这个人购买了哪个产品。这就是目标泄露。神经网络可以完美地做到这一点,因为你已经提前告诉了它答案。
你要删除ID,因为ID只是数值递增的值,并不是很有用。这里是最终的特征向量x中各个值的名称集合。现在我们需要将其转换为numpy数组,因为神经网络喜欢数值输入。我们只需将之前的x列计算放入其中。
我们得到了实际的numpy矩阵x,使得行数等于数据集的大小,列数等于特征向量的大小。我们将产品转换为虚拟变量,这将成为Y。我们保留实际文本值的列表,产品为ABC。由于只有一组分类,我们不在其上添加前缀。
因此,我们不会做产品A、产品B等。然后我们得到y值的矩阵。所以行数等于数据集的大小,列数等于我们正在分类的产品。我们运行这个。以便查看X和Y。X是非常数值的,这正是神经网络所喜欢的,而Y则明显是虚拟变量。
这就是如何为分类神经网络计算x和Y。确保在分类神经网络中使用分类交叉熵和softmax函数。现在,只有两个类别。这算是一种特殊情况,我们将在该模块的后续视频中看到。你将使用二元类型损失函数。
如果你处理的是回归,X和Y,那么你将使Y成为收入值,而X则与之前一样。所以你需要确保计算的是收入的实际值,而不是虚拟变量。因此,它不是真正的矩阵,而是一个大型列矩阵,每个数据集中的每个值都有一列和一行。
现在,如果收入是目标,请小心,因为某些收入值是缺失的。通常,如果列是你的目标并且在目标中有缺失值,通常会在训练时删除这些行,因为你不一定想在这些中位数收入上进行训练。感谢观看此视频关于特征向量创建。
现在我们有了特征向量。接下来的部分将向你展示如何实际围绕它形成一个神经网络,训练它并生成预测。此内容经常更改。因此,请订阅频道以保持更新,了解本课程及其他人工智能主题。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P23:L4.2- Keras构建深度神经网络多类分类并用ROC和AUC评估 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我将向你展示如何进行二分类和多分类。使用Keras的神经网络了解我的AI课程和项目的最新动态。
点击订阅和旁边的铃铛以接收接下来两个视频中的每个新视频通知。在接下来的两个视频中,我们将查看分类和回归。本视频专注于分类。我们将其细分为两个部分。有二分类,还有多类分类。
我们将首先查看二分类,二分类。
我们将查看摇滚图表,看看如何测量假阳性和假阴性,并探讨我们评估二分类的特殊方法。
你可以将这视为一个医疗测试。因此,我们将查看威斯康星乳腺癌数据库,它包含肿瘤的测量数据。
还有一个目标列,说明它们是恶性还是良性,这些都是恶性的,但也有良性的。我们将首先查看如何根据此来衡量模型的成功。你可以只计算准确率,计算神经网络如何为每个样本预测恶性或良性。
它会简单地返回一个百分比。它得到了90%的正确率,或者得到了70%的正确率。然而,这只是硬币的一面。你可能关心的是它错误地说某人有癌症肿瘤的次数,或者你可能关心的是它错误地说某人没有癌症的次数,因为这两者是完全不同的事情,你可能希望进行不同的校准。
对于一个被错误地认为有疾病的人来说,这可能会更糟。
被告知没有癌症以放弃医疗治疗,然后在一个没有疾病的人身上进行额外医疗治疗。或者反之,如果治疗对个人来说特别可怕。对于摇滚曲线,我们查看假阳性和假阴性。
假阳性是指结果为阳性时。
但假阴性并不是指某个结果返回为阴性。也就是说,真正的阳性是测试真正识别出的阳性,真正的阴性是测试真正识别出的阴性,还有其他名称,比如第一类错误和第二类错误,以及敏感性和特异性。敏感性是模型正确预测你确实有病或阳性的能力,特异性是模型准确检测你没有病的能力,这两者合在一起就是整体准确性。通常对于这些,我们需要定义一个临界值,这就是ROC曲线发挥作用的地方,临界值可能是因为大多数测试都会返回某种数值。
这是你输出神经元的输出,零意味着你可能处于一个不确定的状态;高数值可能意味着你是阳性,负数可能意味着你是阴性。你必须决定在哪里切断这一点,你的切断可能不只是零,也可能不均匀。如果你想偏向假阳性或假阴性,显然你都不希望有,但如果必须选择,你会选择假阳性还是假阴性?然后你可以将阈值优化为敏感性或特异性。接下来,我将运行这一段代码,这段代码并不重要,只是用于显示这个图表。这个图表展示了你的神经网络的输出可能是什么样子,也许当神经网络输出零时,它并不确定你是阴性还是阳性。
如果你更偏向于阴性,系统会输出一个负值,表示你没有这种情况;如果你更可能是阳性,系统会输出正值。现在这些线指明了你可能设置的切点或阈值,当你移动这条线时,你是在调整模型的敏感度,即在假警报和真正阳性案例之间进行平衡。
如果你将线设置在这里,敏感度就会很高;如果你将线设置在这里,特异性就会很高。原因在于,如果你提高敏感性,那么你会倾向于产生假阳性;而如果你倾向于提高特异性,整个负曲线就会偏向这边。显然,你可能不想将其设置在这两者之间,而是想在中间的某个地方。
完全平衡就在这里。所以这是一个重要的认识。你可以得到完美的敏感性或完美的特异性,但你会有很糟糕的结果。如果你想确保你的模型完全敏感,能识别每一个有疾病的人,只需将每个人都分类为阳性,这样你就不会遗漏任何人,阴性情况也是如此。
但显然这并不是特别有用,但它展示了这两者的极端。顺便说一下,这两个范围的 X 是来自神经网络或测试的输出,这就是你如何读取测试的结果是阴性还是阳性,Y 只是我们在这些类别中有多少个值,它们并不总是正态分布的,但这样可以让图表看起来不错,顺便说一下,这是你在统计学中看到的经典图表。
如果你想阅读更多或了解更多,这里有一个很棒的 Khan Academy 视频,我的图表很大程度上是基于这个。这也是机器学习和数据科学中常见的面试问题,我们会给你这个图表,问你这两条线的区别,有时中间的线会缺失。
这是一个更敏感与更特异的测试。现在我们继续,加载这个测试的二元数据。我将运行这个部分,简单地加载数据。重要的是要看到这里我们正在准备 X 和 Y。
注意我如何处理 Y。这是进行二元分类的方法。我将恶性肿瘤标记为 1,良性肿瘤标记为 0。现在我们将定义两个函数,稍后会用到。我不会过多解释这些函数或绘图的内容。
我可以做一个完整的绘图课程,但这将基本上绘制一个 ROC 图和混淆矩阵。这两者对分类神经网络都非常有用。现在我们来看一个 ROC 图的例子,我们将训练一个用于二元分类的神经网络。
对于二分类,我们使用二元交叉熵。这非常重要,我们只想要一个输出,像之前那样的回归并不是这种情况。它看起来像回归,并且确实有一些相似之处,但这仅在处理二元结果的分类时使用,不要使用虚拟变量。你不想做两个,所以这里在X上我们没有使用虚拟变量,对不起,Y上我们没有使用虚拟变量。
我们简单地有一个由零和一组成的列矩阵。我们将继续运行这个模型,使用早停法。好的,我们已经早停了,我们将在下一个模块中看到更多关于交叉验证的内容,这是获取训练集之外的样本结果的一种方法,适用于整个数据集。让我们获取我们的预测并绘制 ROC 图表。好的,这就是 ROC 图表。
这基本上展示了你的模型如何表现,无论你设置的阈值在哪里,查看 ROC 图表可以让你看到关于假阳性率和真实阳性率的整体情况。
在这里,你可以设置不同值的阈值。你通常想在 ROC 图表中查看的是,这个值与虚线有多接近。虚线仅表示随机预测。
如果你的模型低于这个标准,那将是一个非常低效的模型,这种情况是可能发生的。你的模型甚至比随机预测还要差,这真的很糟糕。
越接近这个上部点,模型的准确性越高。你可以通过测量曲线下面积来评估,如果曲线下面积是整个图形,那么就是1.0。所以,曲线下面积通常被称为A,它是1.0,这意味着一个几乎完美的模型。这不是,它的准确率和敏感性以及特异性都在99%左右,但这是一个相对容易且快速训练的乳腺癌数据集,因此这是二分类。
让我们来看一下多类分类,这里我们将使用之前给过的简单数据集。这是一个更难的数据集,因此看起来更有趣,因为它会出错。我们将在这里构建一个分类交叉熵,这非常重要。
这是我在之前的学期中,学生们最常问我的问题之一。
当数据是回归时,他们会设置分类神经网络,或者像这样进行多类分类,并使用二元交叉熵。你想使用分类交叉熵,因为这里是一个多类分类问题。
你不想只有一个输出神经元,而是想要与类别数量相同的输出神经元。那么现在让我们开始运行这个,按我的记忆,它的准确率大约是70%,其实稍微高一点,所以这很酷,这与随机权重的准确率有关。
这个准确率通常在70%左右,所以它的训练结果通常也是在70%左右,你可以看到,它差不多在这个水平。
在早期停止时,我们将计算其准确率,这将与我们上面得到的值相同。
准确率是70%。我们将继续计算对数损失。对数损失与准确率不同。有时准确率的输出与对数损失相似。然而,范围是相当不同的,准确率的范围是从0到1,而对数损失的范围通常在0到三或四之间,这是我见过的最高值。
我从未真正看过实际的上限在哪里,如果对数损失超过一或二,你就有麻烦了。那么我们来计算一下,看看我们如何实际计算对数损失。我们将在这里做预测,并使用numpy来计算。对数损失是0.74,这并不好,但也不是完美的,完美的当然是零。
这就是你如何计算它。几乎与准确率的调用方式相同,只不过你在做对数损失。你将知道是正确的Y值和你的预测传递给它,它会为你计算。
不同于准确率,对数损失考虑了神经网络对错误答案的自信程度。以下是预测的输出。每一行代表一个预测,每一列代表一个它尝试预测的类别。我们可以查看底部的结果,因为我将其乘以了100。
而这基本上就是预测。因此它表示以70%的可能性,它是第三类,并不是100%确定,它也在考虑可能是第二类或第四类。所以对数损失的工作方式是我们为每个值统计一堆对数值。这里在这种情况下,如果这是正确值,它将获得0的对数。
7添加到累加器,最终会取那个对数负值的平均值,因为对数是负的。所以如果你考虑一下,如果这是在训练中,这将会是1。我们会在这里放一个1,所有其他都是0,那将是完美的。所以1的对数是0,问题在于,如果你错误了。
如果你绝对确定错误。所以如果第一类是正确的,我们将会添加0的对数,0的对数是负无穷大,因此你的得分会是无穷坏的,所以它会因为过于自信和错误值而大幅惩罚你。
这就是为什么在内部计算时,零会被稍微提升到零以上,以便你的对数得分会被大幅削减。但它不会变成无效数字,这就是计算的全部内容。你取正确的值并添加那个特定对数的负值,因此,越接近1。
对数加法越接近零越好,因此这就是它如何惩罚你过于自信。但准确性是非常苛刻的,因为在准确性上没有部分得分。如果这一项可以,如果这一项,即第四项是正确答案而你选择了这一项不准确,你将得不到任何分数,而对于对数损失,至少你可以得到一些分数,因为你会添加0的对数。
22的负对数这是计算它的更正式的数学方程,基本上发生的事情是所有值都遍历整个数据集,所以是除以n。负值抵消了对数函数的负性。
然后我们基本上是看Y系数。因此,y总是会是0或1,所以正确的系数会是1,而其他的系数会是0并且抵消掉,所以你基本上只会剩下其中一个,其他的都会抵消,这实际上就等于取了正确值的对数。
再次强调,这个函数其实并不需要。我的意思是,你不需要关注代码。我们对对数的图感兴趣,所以你可以看到如果你接近于正确答案的零,它会非常、非常快地下降,所以你可以看到一个负值或四,我们会取绝对值。一个四的对数损失其实非常糟糕,你几乎要到负二的下降点,对不起,二和小于一的值是更理想的对数结果,当然你不能超过一的正确性。所以这是我们用于误差评估的对数函数的整个范围。现在让我们看看混淆矩阵,我们之前定义了这个混淆矩阵函数,所以我们现在要绘制它。你希望在混淆矩阵中看到的是。
强对角线,这条对角线是正确分类的情况。你可以在下方的混淆矩阵中看到这一点,这是真实标签,这个是预测标签。通常你希望查看归一化的那个,另一个只是计数,而这是归一化的,这显示了一些潜在问题。如果真实标签是A,预测为A,那就是好事。
然而,G由于某种原因,被错误分类的情况相当多,你还可以看到预测值EF和G在这里存在相当大的问题。这些是你在优化模型和特征工程时想要关注的一些问题,试图将一些内容移动到这里,这就是混淆矩阵。
如果是二元分类,它们可以使用,那就是一个二乘二的情况。
但是,如果你有多个类别,那么这是一个好的模型或可视化,可以查看你的模型。感谢观看这个视频。在下一部分,我们将看到如何用回归神经网络做同样的事情。
这个内容经常变化,所以请订阅频道,以便及时了解这个课程和人工智能的其他主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P24:L4.3- Keras深度神经网络回归建模与RMSE评估 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我将向你展示如何在Keras中构建一个回归神经网络。回归神经网络是能够预测数值的神经网络,而不是分类神经网络中类或非数值值。点击旁边的铃铛订阅,以便接收每个新视频的通知。😊
所以如果你正在处理回归问题,我们将看看那个我们多次使用的样本数据集,它预测个体将购买哪个产品。不过在这种情况下,我们想把它变成一个回归问题。所以我们要做的是根据他们购买的产品和他们的其他特征来预测他们的年龄。
所以这段代码和我们之前做的特征工程非常相似。我们在填充缺失值,标准化各种范围。疾病评分使其对神经网络更具预测性,但Y来自年龄。我们还将数据分为训练集和测试集。接下来。
我们将构建和训练神经网络。再次注意我们是如何设置损失的,这是回归,所以我们有一个输出神经元。均方误差是我们的损失函数。我们运行它,训练效果相当不错,验证损失迅速下降。我们得到一个相当不错的结果。
我们将计算均方误差。均方误差本质上是每个预测值和每个预期值之间的差值平方后求和。所以如果我们查看这个均方误差,它是0.45。均方误差的问题在于单位,它很像统计中的方差。
这些单位并没有实际意义。关于均方误差,我能说的就是数值越低越好。如果你取它的平方根,它就变成了均方根误差(RMSE)。你可能之前听说过,它是一个常用的度量。我们对整个数值取平方根,现在单位和数据是一样的。
所以我们可以看到它是0.67,所以我们在计算我们对预测年龄的实际值的接近程度时,约差一年,稍微少于一年。一个对RMSE非常有用的可视化是所谓的Ly图。生成Ly图的方式有很多不同的方法。
有几种不同的方法在流传。我肯定没有发明这个。但这是我使用的最常见方法。所以我们将按照预期输出对数据进行排序。这些是你的Y值。因此实际年龄。数据将按此顺序排列。所以这将是单调递增的,线将向上移动。
向上,向上,但不会再回落,因为年龄是那样排序的。然后对于每一个。X。对于沿着X的每个输出值,我们将。基本上绘制实际预测值的位置,所以这两条线。如果完美的话会完全重叠,但你会看到一些噪声,X轴只是数据的0到100%,Y轴的范围则根据预测值进行调整,所以是从零到年龄。现在来看这个图表。
预期和预测的线应当接近,注意其中一条在线上方或下方,因为在较高的年龄段,你的准确性可能较低,而在较低的年龄段则更好。下面的图表是。通常在较低年龄段更准确,但我们将看到这并不总是如此。
这取决于训练的实际情况。这里的结果实际上是非常好的,我们在较高年龄段有一些异常值。但总的来说,这就是我为什么说它通常在较低年龄段更准确。所以这显示了在经过预期值时,它有点嘈杂。
你几乎看不到预期值,因为预测线正好在其上方。所以这实际上是相当不错的。底部的数字从零到500。我们的测试集中有500个元素,所以这是来源于这里。
感谢观看这个视频,在下一部分我们将深入研究反向传播算法,看看它们是如何工作的。这个内容经常变化,所以请订阅频道以便及时了解本课程和其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P25:L4.4- 反向传播、Nesterov动量和ADAM训练 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff Heaton。欢迎来到华盛顿大学深度神经网络应用课程。在这个视频中,我将向你展示内部工作的反向传播算法。我们将看看经典的反向传播,还有原子,Netroov动量和其他常用的训练深度神经网络的技术,这是AI课程和项目中最新的内容。
点击旁边的铃铛订阅,以接收每个新视频的通知。如此经典的反向传播。反向传播已经存在了一段时间。Jeffrey Henton对此做出了相当大的贡献。以及werebo也是如此。因此,许多人介绍了反向传播的各个方面。
并且多年来一直在继续建立。你在这里看到的这个方程是你非常一般的训练方程。这只是说T。现在T是当前的时期或时间。这是在说权重。这些是theta的权重。当前时间的权重等于前一时间的权重减去当前时间的V。
V。😊。
当前时间只是一个向量。所有这些都是向量,它们保持了我们将改变每个权重的数量。所以单独的这个并不能告诉我们太多。它只是说我们将改变权重。每次都是通过这个变化量的向量。现在,变化量的向量。V子T将会看到一系列的函数,显示我们如何计算V子T。
首先是经典的反向传播。所以如果我们看这个,这是梯度下降。所以你有Eta乘以现在,Eta乘以其余的部分。这本质上是一个单元。这不是。这个东西乘以J函数。这是Nabla或倒置的Delta或者像竖琴形的运算符。
这意味着用损失函数的梯度对先前时间步或先前时期的权重进行梯度下降。所以这基本上给出了所有的梯度。乘以学习率,学习率的常见值是0.10.01。很少你会想要使那一个,这样你就完全将梯度添加到权重中,那将会是太混乱的。
现在,让我们看看梯度到底是什么,以及它是如何实际使用的。这是一个导数。这是一个偏导数,所以你总是取一个多元微积分的偏导数。你用所有其他权重保持不变的情况下取一个单一变量的导数和一个多变量表达式。因此,一个单一的权重与所有其他权重保持不变。
所以这基本上展示了特定权重的误差函数。当你调整权重时,这个权重的误差。所以如果你使权重0,误差就会在这里,然后上升,然后急剧下降。这在你仅改变神经网络中的一个权重时可能是真实的。
错误函数会上下变化其值。通常,我们正在做梯度。所以我们想要把权重完全移到这里的最低点。现在,我们不想要绘制这个整个图表并且在每一个点上对神经网络进行抽样。因为整个神经网络中每一个权重都有不同的图表,这会非常昂贵。
当你改变一个权重时,所有其他的权重也可能改变。这就是你必须进行偏导数的地方。我们只为一个权重做偏导数。假设权重目前为1.5。所以我们只知道误差在这里。我们不知道图表的其余部分或继续。
我们只有这一个点,那个点不告诉我们太多,直到我们对损失函数取导数。然后那告诉我们瞬时变化率。所以你得到了斜率。这个错误函数曲线上的这个点。注意这条线有一个负斜率。但是如果我们只是把梯度加上去,这个负值,无论那个负斜率是多少。
那将减小权重。它会朝错误的方向走。所以如果你真的想要走这个方向,因为我们已经过了那个山丘的顶部一点点。如果你想朝这个方向走,你需要取斜率的反方向。这就是为什么在这里我们进行了子T,因为如果这样,我是说,假设我们就在这里。
那么这条线的方向会非常类似这个方向。并且那将是一条非常负斜率的线。你会想要一个正数。所以你继续走下去。如果我们就在这里,那么斜率将是正的。但我们希望从权重中减去一个来继续沿着这个方向。
这就是经典的反向传播。它由学习率控制。如果你的学习率设置得太大,而不是设置一个梯度降下来,你可能完全跳到它的另一侧。你永远找不到通向这个更低值的路。
学习率描述了我们尝试将权重推向最优值的速度。这个链接非常有用。它展示了一个我写的JavaScript应用程序,带你经历经典反向传播的所有步骤。
因此,你可以看到整个神经网络是如何为XOR计算的。接下来是动量传播。反向传播。所以动量是添加到反向传播中的东西,以防止陷入局部最小值。局部最小值可能在这里。可能在这边更进一步会有更优的值。但一旦权重定居到这里。
它真的很难完全推出那个山谷并继续前行。
这里有一种情况。权重,也就是球当前的位置,实际上卡在了一个局部最小值。这里可能有一个全局最小值。很难知道全局最小值在哪里。这通常几乎是不可能的。因此,这个权重本应该一直下降,但可能会卡在这里。
如果不是动量推动它越过这个山峰并让它继续。动量正如其名。你可以把这些权重想象成在高维空间中移动。动量只是给权重一个推动,并在它保持动量的同时持续这种推动。这是动量的公式。现在我们有两个超参数。我们有Eta。
学习率是学习率。但我们还有lambda,它是动量率。这一部分与经典的反向传播完全相同。你只需计算梯度。乘以学习率。但这里有一个额外的项。这就是动量项。它是lambda乘以V t -1。
所以无论我们之前的delta或更新是什么,我们都在用lambda进行缩放并添加它。你只需将最后的更新缩放后直接加到方程中与其他内容一起。这就是动量的全部。因此,当你向下移动时,你会积累很多动量,因为你可能会比较快地向下移动。
然后,这个变化很大程度上是一个正的权重,应该不断添加到权重上,希望能把它推过山峰,可能从局部最小值中走出来,进入更好的状态。顺便提一下,动量的一个非常常见的值是0.9。
他们通常偏向于较大的动量。学习率通常要小得多。通常是0.10、0.01或其他负的10的幂。接下来,我们将关注在线批量传播,这是传播训练的重要概念。稍后我们会看到,我们可以在TensorF中配置这些值,并确定批量大小。批量大小就是你需要处理多少个训练集元素,因此我们计算的每一个梯度都是针对单个训练集元素的。
所以你可能在训练集中有1000个元素。在你计算每一行训练数据并得到权重的deltas时,不需要每次都更新权重。你可以将它们批量处理,方法是简单地将梯度相加。因此,你处理训练数据的第一行,然后得到一个梯度向量,它等于权重的大小,你可以计算下一行训练数据,并将这些梯度添加到之前的值上。
你不断地向梯度中添加向量,直到达到批量大小。所以批量大小,如果你有一个批量大小为10,这意味着在处理训练集时,它将处理10个元素,然后在这10个元素结束时,它的梯度基本上是整次运行的总和。
然后它会将更改应用到权重上。在线训练仅在计算梯度时,将更改尽快应用到权重上,你一次只计算一个梯度,为一个训练样本计算梯度。将其应用到权重中,继续下一个训练样本,计算它的梯度。
将其添加到权重中并继续进行。拥有批量大小可以显著提高神经网络的训练效率,这也是非常符合大数据的,因为如果你有一个非常、非常大的数据集,你只需从中随机抽取许多批次。因此,许多批量训练是训练神经网络的另一种非常常见的技术,许多批量的大小通常在32到64之间,因此它们相对较小。步长和迭代就是神经网络经历了多少训练周期,步长迭代甚至是现在我们来看看随机梯度下降,它通常与许多批量训练结合使用,随机梯度下降用于提供非常随机的结果。
发生的事情是,与使用整个数据集计算梯度相比,你只选择小组,并且不断处理这些随机样本,带有替换。随着你一个接一个地处理这些神经网络训练数据,每次误差都会减少,有时会增加,有时你会选择特别糟糕的训练数据集,有时你会选择特别好的集合。这几乎完全取决于情况。因此,随机梯度下降通常单独使用或作为其他训练的一部分。
这种方法在计算上是高效的,并通过只关注少量相对较好的权重来减少过拟合。此外,还有许多其他技术,比如我说的反向传播和梯度下降,这只是一些主要的基础技术。
它们试图解决的是学习率和动量。这两个都是超参数。这些是你需要与其他所有参数一起调整的数字。你以为仅仅需要选择隐藏层的神经元数量就已经够糟糕了,现在你还得考虑学习率和动量。
你需要弄清楚最佳学习率和最佳动量,以便能够有效地训练这个神经网络。问题是学习率,如果你调整得太小,它永远无法准确地训练你的神经网络,它只是没有承担足够的风险。如果你把它调得太大,你的神经网络将会非常不稳定。
非常不稳定和动量,如果你把它做得太大,事情会变得不稳定。如果你把它做得太小,它实际上没有什么效果。另外,如果你仔细想想,这个学习率是应用于整个神经网络中的每一个权重的。也许一个单一的学习率是不够的,也许一些神经元学习得比其他的快。
所以他们喜欢把多个学习率的概念放在一起,或者有时你会看到他们会随着训练的进行自动减少学习率。所以我们试图摆脱每个权重都有一个全局学习率和动量的情况,然后也。
转向使这些值非常敏感,非常不敏感,或者非常适应那些选择得不好的值。这些是我过去使用过的一些其他训练技术。有弹性传播。它效果不错。它基本上承认梯度的符号可能是最重要的事情。
它告诉你权重应该朝着哪个方向移动以更好地优化。它也不需要学习率和动量。所以它在早些时候很流行。在深度学习加速的梯度中并不常见。它做的是使用随机梯度下降。
它有助于减少只选择一个非常糟糕的小批量数据的风险,然后损害你已经进行的其余训练。有添加梯度和阿纳德尔塔。这两者都是。在梯度中,基本上它保持一个按权重衰减的学习率。
但它是单调递减的,它永远不会再增加。所以这就是为什么创建了添加Delta来解决在梯度问题中的那个学习率可能朝一个方向去,并减少到几乎为零的问题。还有一些非梯度方法。如果你不能对你的最后函数进行导数操作,这些可能会有用。这包括模拟退火、遗传算法、粒子群。
Nedermeed和许多其他。因此,原子更新规则之前谈论的经典反向传播。这只是我们之前将V计算到这个权重更新算法中的另一种方式。现在原子更新规则。它之所以很好的一个原因是你不需要过多地关注学习率。虽然存在一个学习率,但是你拥有的那些值。
原始论文的作者King Muba,他们对超参数给出了一些好的建议。而且我很少,甚至是最后那个学习率也倾向于负8。他们通常不必改变那些。这是一个相对较新的训练算法。它是在2014年引入的。它是一个流行的算法。
它处理稀疏数据的训练。我们有很多缺失值,还有随机误差函数,误差函数是随机的,因为我们在进行随机梯度下降,因此我们不断随机抽样一个批量大小并基于此更新神经网络。因此,你从一次迭代到另一迭代的改变可能没有帮助,因为你在每次抽取的都是不同的训练数据。关于这个的论文在康奈尔大学的档案里,如果你之前没有接触过档案,那是希腊字母χ,所以是档案档案和矩的矩的矩估计方法,你在这里看到的,这是估计一组值的每个矩的方法,所以就是均值、方差等。我们来看看。
这篇论文实际上与我们看到的其他代码非常相似。所以这只是t等于t加1,表示我们在时间上移动,我们正在初始化第一和第二矩,第一矩是均值。
所以你试图估计的梯度的均值。V是方差。第二矩是第三和附加矩。但我们处理的仅是这两个,第一个和第二个矩。顺便提一下,这就是“加”的名字来源,自适应矩估计,然后我们将时间设置初始化为零。
所以这两个初始估计值为零。我们将计算G,梯度。所以这个梯度,就像我们之前所做的,非常类似于经典反向传播。术语稍有不同,我用的J改成了F,因此这是损失函数,包含权重,正是前一个模块中的符号。我们将获取那个梯度。这两个值处理偏差。
由于这些值初始化为0,因此早期会产生巨大的偏差,因此这只是两个。嗯,抱歉,这里的帽子实际上是在计算,它们处理的是最初的事实,即这些值从零开始。因此M帽和V帽M和VT本身,基本上是在更新每一个。你会注意到这是基于上一个T的M。
它们在执行过程中不断更新,实际上正在逐渐创建对第一和第二矩的估计。这些都是向量,显然它们与权重相关。因此,这基本上是在为每个权重创建一个几乎是学习率的东西。第一个是一次幂,然后是二次幂,所以这是平方的。
我们计算这些调整值只是为了处理这些值最开始为0的事实,然后我们将更新权重。所以权重t,这个非常简单。这部分与我们尝试突出底行时完全相同。但到这里正是我们在经典算法中所用的。我们在减去梯度。
但不是减去梯度,而是使用这个公式来更新参数或权重。Alpha 是学习率,所以通常称为学习率或步长。你在这个基础上进行乘法来进行缩放。然后你放入两个帽值,这些帽值是基于这些数据,以便调整它们,使它们最初不会过于偏向零。
本质上这是 Adam,它比经典的反向传播稍微复杂一些,但并不是特别复杂。我是说,实施起来并不难。在 Java 或其他编程语言中,他们讨论了算法。他们谈到了初始偏差校正,为什么需要,以及如何计算这两个帽值,这是非常必要的。
我承认我没有仔细阅读这部分,觉得它有些复杂。他们在分析收敛,这本质上是为什么它有效的证明。然后他们引用相关工作和实验,通过实验实证证明为什么它有效,并用 E 定理试图谈论它为何有效的证明。相关工作,R Pro 和 Agrad,那是两种在 Adam 之前存在的非常相似的训练技术,这部分是直接来自论文。
但我更喜欢看伪代码。如果你对此感兴趣,我在这里复现了它。这是一个非常好的图表。我没有创建它,我有链接到我找到的地方。是的。所以,无论如何,然后他引用了原作者,确实要给予应有的信用。
这是一个非常非常好的图表。这是一个动态图。这本质上是一个搜索空间。你可以把它想象成一个崎岖的二维平面。星星是最低点。那是你想要到达的地方。这就像😊。就像弹珠沿着山脊滚落。这就是随机梯度下降。
这是最慢的一种。所以这是你经典的反向传播。最终它是可以到达的。最早到达的那个是加 Delta,它看起来像绿色的。动量开始时很慢,但如你所见,确实会积累动量,然后快速超越。因此,这就是你不同的训练方法。
Adam 在这里出现是因为在创建这个时,Adam 还不存在,或者至少不常见。但你可以看到其中一些,比如动量。显然它开始真的在积累动量,小绿球迅速超过。
SGD 只是慢慢有条不紊地在工作,甚至都没能完成。他们放弃并重置,因为其他人都完成了。Kras 和 Tensorflowlow 提供了多种这些技术。你可以看到那些被突出显示的,它们有随机梯度下降和 Adam。
我相信还有其他方法可以达到这些目标。我很抱歉,这些都是 Tensorflowlow 提供的。我老实说不知道 FTRL 是什么,或者我不熟悉其他的选项。我所强调的这些可能是你最感兴趣的。我也会想强调 RMSs Pro。你可以尝试这些,可能会得到更好的结果,你可以在这里和优化器一起指定。
如果你指定了其中一个,这意味着你将在这里传递一个学习率的类,并且实际上也传递参数。你可以查看 Tensorflow 的文档,他们会向你展示如何使用,并给出实际的类名。
但你可以通过将其名称放在这里直接使用任何一个,如果你想指定更多的参数,你需要放一个对象。这是我尝试这些时得到的一些结果,因此你可以看到在每加仑英里数据集上,我们得到了不同的结果,而像单位动量则需要比说的要多得多的训练。
显示最后一次成功或最后几次迭代。因此,Adam 收敛得很快。我对这种训练技术很有好感,并且经常使用它。At agrad 也相当不错。因此在 agrad 上,我非常喜欢 RMS Pro,确实,我已经看到它的用途。我会。😊我会在训练神经网络时在这些之间进行尝试,并且我通常从 Adam 开始。
但我们将尝试 agrad 或者我们的 MSP。可能有更好、更科学的方法来选择这些,但对我来说,这种方法通常效果不错。好的,这个模块到此结束。
感谢观看这个关于如何训练神经网络的视频。在下一个视频中,我们将从头开始实际计算一个神经网络。我们将看到如何从 Keras 导出权重,并使用这些权重实际计算神经网络的输出。这消除了过程中的所有魔法。这个内容经常变化。
所以请订阅频道,以便及时了解本课程和其他人工智能主题。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P26:L4.5- 从头开始计算神经网络RMSE和对数损失 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将看到如何手动计算一些错误指标,这样你就可以真正看到这些数值是如何产生的。我们将特别关注对数损失和均方根误差,关于我最新的人工智能课程和项目,请点击订阅旁边的铃铛,以便收到每个新视频的通知。现在。
我们将看到如何从头开始计算均方根误差和对数损失。我们将从回归开始。😊。
你可以在这里看到代码,顶部的代码演示了如何使用内置函数计算均方误差和均方根误差。通常这就是你想要的,这是我们之前看到的。然而,如果你想看看如何实际计算这个,你会发现我们得到了完全相同的结果。
我们基本上是在计算平方和。这里你可以看到预测值减去期望值。我们将这些平方相加,最后将其除以预测值的长度。所以这有点像平均值,平方用于消除符号。此外,对于训练目的,平方项的导数比绝对值更容易处理。
对于分类,我们正在做类似的事情。只是我们使用对数损失。你可以在顶部看到预期值和预测值,以及你如何逐个计算每个对数损失的部分,并将它们相加,得到与你从内置函数获得的完全相同的值。现在。
我们将看到如何处理这些内容。现在,让我们手动计算这两个值。我们将从对数损失开始。这里是它的公式。好的,这个公式看起来可能有些复杂,但实际上有几个部分,让我分开讲解一下,给你展示一下到底发生了什么。首先。
让我们看看对数的图形,因为这有助于解释一些内容。因此,对于对数,有几个非常重要的点,对数零是本质上未定义或渐近于负无穷。对数1是0,当你绘制对数时,它在这里与0相交。现在。
我真的很糟糕于绘制方程,但你会明白大致的想法。有一点无穷大,在那里渐近。然后,它相对较小地增长。Logar,在我的研究中,这实际上出现了两次,我们关心它实际的样子。
它比那多得多,但就我特别处理的领域而言。如果你处理计算机科学,这个区域特别有趣。因为当你进行算法分析时,N阶的东西,对数规模实际上是相当不错的。与指数级增长相比,它并没有真的那么快增长。
这只是会非常非常非常快地上升。但对于数据科学或机器学习领域而言,日志图的这一部分并不是我们感兴趣的。数据科学和机器学习更关注的是它的这一段。这是我们用来分析错误的地方。所以这是数据科学区域。
这在数学上可能不是严格的,计算机科学和数据科学。我确信这两个领域会交叉到另外两个领域,但这只是一个很好的简化思维方式。所以在数据科学中,或者在我们计算的这个机器学习对数损失函数的区域。
如果你认为1是完全正确的,或者你猜对了。所以你在尝试分类某些东西。如果它是真的,你选择了真的。这意味着贡献给你的错误方程的错误将是0,这是好的。你完全猜对了。你不希望自信地错误。
所以在这些机器学习算法中,如果你想说“真”,你通常不会只是说“真”或“假”。你会说,我认为它有0.9%的概率是真的。你不希望在学校的真假题上也能这样,如果你不太确定,可以说0.5的概率。
意思是我不知道,它可能是真的,也可能是假的。你通常会损失半分。那么,或者你可以说0.75的概率。如果你答对了,你会得到三分之四的分数,但如果不对,只损失0.25分。所以,这就是它们的评估方式。你不希望的是自信地错误。因此如果你说它的概率是100%是真的。
然后如果它是假的,那你就在一个无限糟糕的分数上。我很高兴学校不是这样的。你不能得到无限糟糕的分数。你只能得到0分。但是,在这里你可以糟糕到无限糟糕,这就是为什么通常当你查看这些预测时,你很少会看到0或1的预测,它们会非常接近,因为优化算法通常会将其限制在那个范围。
所以注意,对于数据科学的那个区域,一切都是负数。你可以谈论负错误。你可以说我有负0.025的对数损失或类似的东西。但为了理解,我们习惯于将错误报告为正数。所以这就是为什么前面有这个负号。这本质上将其完全转移到。
对于正范围,那就是所有负值所达到的效果。这个一除以 n。那部分基本上就是平均值。所以 n 是你训练集中的元素数量。你不希望在非常大的训练集中出现极大的错误。
你需要像考试纸上的百分比一样对其进行归一化。这就是为什么你要除以问题的数量。如果你只处理分数。如果你说,我在考试中得了 30 分。好吧,如果满分是 30,那挺好的。如果满分是 3000,那就真的很糟糕。所以这就是负值和一除以 n 的含义。
正在完成。然后我们需要将所有这些日志损失错误进行汇总。这将给你所有日志损失的总和。然后你将它们除以 n。所有的日志损失,零。接近零的值并不是特别糟糕,你是接近真实或虚假的。
或者你所处的更高值。你在很大程度上是错误的。你尝试防止这种情况。你通常会限制这个,以便你不会有 Y hat 值,顺便说一下,Y hat 是你的预测。你在这里看到的两个 y hats,就是你的预测。为什么是真实的。那是你比较的值。我们在每一个值上都有下标 i,以便进行计算。
或者只是因为那是单个编号或单个训练集元素以及你的预测。它的第一部分,就在这里。这部分处理真实情况。然后另一部分处理虚假情况。所以你在分类,是对还是错?
这些被控制的方式有点像数学中的 if 语句。数学家喜欢使用系数,通常用于 if 语句。而你所处理的两个 F 语句基本上在这里。还有那里。如果 y sub I。这是绝对真实的,是你比较的训练集中的值。
如果是真的,那么这将是 1。绿色的 y sub I 将是 1。如果是假的,那么它将是 0。所以在处理真实值的所有情况下,第一个系数,绿色箭头将是 1。而在处理虚假值的所有情况下,红色箭头将是 0。
因为 1 减去。所以这本质上关闭了这两侧。所以其中一侧每次都会抵消,具体取决于它是真还是假。所以如果这确实是真的。则 sub1 y sub i 将是 1。这样就不会抵消,然后理想的日志。
如果真实答案是真的,你希望 y hat 也是真的或者是 1。如果情况是这样,你正好抓住这一点,那么 log 的一将会抵消。但这很好,因为你得到了一个完全正确的答案。而且现在,你不希望有任何错误被贡献。
如果你猜的是0.9,那么log 0.9将被加到你的错误中。但这并不算太糟,因为你仍然基本上越接近零,得分就会越糟。看看我在直角坐标平面上绘制的曲线。现在,从另一个角度来看。
如果是错误的,所以如果正确答案y下标i是错误的或0,那么第一个真值项将被抵消。然后假值将变为1。所以它将具有系数1,1-0是1,乘以1的对数。1减去y下标i。我们现在基本上在反向执行这个操作。
我们现在基本上要处理的情况是。如果在这种情况下你猜的是1。它是错误的,但你猜的是对的,你现在是无限错误,因为1-1是0。这将使你进入对数的无穷大。现在,如果你猜得比较接近,比如0.1,那么1-0.1是0.9。这并不算太糟,你大致在我刚才描述的相同位置。
所以你在对数计算上更接近于0。现在,当你实际实现这个方法时,这种方法在处理计算机科学或将其作为程序实现时会有几个问题。一方面,你依赖于你的编程语言如何聪明,以便消除零的东西。你可能会计算对数两次。你其实不需要这样做。
因为它会抵消。我至少被这个问题烧过几次,如果这两侧中的任何一侧变为负无穷。你实际上是在乘以,即使你希望在大多数编程语言中抵消它。
零乘以无穷实际上是零,或者实际上是无穷。从数学上讲,如果你使用我相信是海塔尔法则,你可以认为它是0,基本上是在一侧或另一侧观察无穷的速率。你乘以好的部分。即使你可能完全正确地回答了这个问题。
它不应该导致方程崩溃,但确实会导致方程崩溃,因为你在乘法的一侧或另一侧有无穷大。然后整个结果会变成无穷大,或者取决于实现可能是NA。现在让我们看看我们将如何实际计算它。所以我将向你展示的计算方式,我们实际上不会。
我们将更像计算机那样做。我们不会逐行取两个对数。我们来看看几个案例。我们将查看的情况就像我之前展示的代码,所以我知道我的数学是正确的。
我大致是在重复我在Python中做的事情。所以我们将有一个数据集,我们将有y。然后是y的帽子。
所以这就是为什么答案正确,为什么预测是这样的?
我们并不是在真正计算差异。在顶部部分,唯一的差别其实就是一个负号,但大体上,这就是我们要得到的。实质上,我们是在计算你与目标之间的偏差,并加上其对数。因此,我在这里计算的差异就是这个。
顺便提一下,这是差异的绝对值,而不是我们在RRC中会做的平方,而仅仅是绝对差异。现在我们需要计算这些值的对数。我们先进行求和,然后再除以n。这个绝对值就是我们在Python中得到的值。
所以这是你如何完全手动计算对数损失。L R在一个海上。铅笔电量低了。我需要赶快。这些天一切都需要充电,连铅笔也是。你有一个1/n,和之前一样。你不需要负号,因为这些数本质上会保持正值。这是平方和。你基本上是对每一个y hat减去Y,顺序并不重要。
因为你会对这些差异进行平方。但这些是我在Python中使用的数值。这让我可以检查我的数学计算,以确保我实际上是正确的。现在我们计算差异。接下来对每个值进行平方,并对其求和,最后除以n。这个值实际上被称为平方误差和。
这个数字,如果你只是编写一个算法并试图优化,也就是说你试图将一个数字推向零,停在这里,使用平方误差,因为在此基础上进行平方根只是为了使其与训练数据处于相同单位。如果你只是进行优化,使用平方就足够了。
但是如果你想将其报告给某人,以便他们实际查看你的偏差,那么你需要进行平方根运算来得到RNSC。
这就是罗门平方误差。感谢你观看这个视频。在下一个视频中,我们将开始研究正则化,这又是一种可以抵抗神经网络过拟合的方法。这个内容经常会变化,所以请订阅频道以保持对这个课程和其他人工智能主题的最新了解。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P27:L5.1- 正则化简介:Ridge 和 Lasso - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这个模块中,我们将开始研究正则化,这是对抗神经网络及其他模型类型过拟合的另一种工具。实际上,许多正则化技术,特别是L1和L2。
这些模型比神经网络更古老,特别是线性回归。我们将从这里开始,看看L1和L2的起源,这将帮助我们理解神经网络的相关性,关于我最新的AI课程和项目的信息。
点击订阅以及旁边的小铃铛,以便在每个新视频发布时收到通知。那么让我们看看L1和L2正则化是如何被引入的。
它们来自Ridge和Lasso回归,这只是线性回归的几种形式。我们将使用汽车每加仑英里数的数据集来展示这些,只使用直接的线性回归,然后在后续视频中我们将看到如何将L1和L2引入Kara的神经网络中。因此,我已经加载了数据,并在这里创建一个报告系数的函数。
线性回归中的系数告诉你各种输入的相对重要性,然后是截距,显示零时发生的情况。因此在此之前,我们将直接看线性回归,我们将使用一个心理学习的线性回归模型,并将汽车每加仑英里数拟合到这个模型中。
所以你可以看到某些事物,比如气缸数,与汽车的每加仑英里数效率是非常负相关的。原产地是非常正相关的。这是1970年代的数据,基本上原产地意味着该车并不是在美国制造的。
如果是在美国制造的,那它的效率相当低。年份也很重要,因为随着年份的增加,汽车变得更高效,你实际上可以看到这些数值,这样你就可以真实地计算一辆车的每加仑英里数。你只需将所有这些数值相乘每个系数,然后加上截距,它就会给你一个粗略的每加仑英里数估计。顺便提一下,我应该将原产地转化为虚拟变量。
但在这里我们只是将其视为基本数值。我发现这并没有给我带来太多提升。让我们看看L1 Lasso。L1 Lasso利用的是。我们基本上在将权重相加,所以我们在对权重求和。我们将权重作为惩罚,因此如果权重变得太高。
权重的绝对值变得过高,这会影响到误差。因此,期望输出与实际输出之间的差异,以及这两者结合在一起。你正在给神经网络设定多个目标。在训练过程中,你会说,好吧。一方面,尽可能准确,但另一方面,不要让这些权重变得太大。
这在某种程度上涉及到奥卡姆剃刀,即更简单的解决方案通常是更好的。现在,绝对值是一个相当尖锐的截断。这会完全消除一些输入。这对特征选择是有好处的。如果你有很多输入特征,并且认为其中一些是不必要的,L1 可以是一个好的正则化技术,因为它可以简单地切除,并让神经网络。
现在,神经网络,线性回归将更关注更重要的目标。我们将继续运行这个。你可以看到,它削减了很多在这里的权重。它将它们压到接近 0,而我们仅关注年份和来源。你还可以看到最终得分并不是那么糟糕,考虑到我们没有使用全部数据。
完整的数据集,数据集的完整列,这些几乎都被消除。顺便提一下,你还会注意到我们指定了一个 alpha,这是权重作为多目标的一个坏指标的程度。因此,你给了它两个目标。每当我的老板来找我说,好吧,这是一个高优先级,这是一个高优先级。
好吧,你有一个加权,哪个高优先级的两个选项中优先级最高。这就是发生的事情。这实际上在告诉神经网络,好吧。是的,回归,正则化很重要,但它仅仅是获得准确结果的重要性的十分之一。然而,尽管如此,这仍然使它削减了一些,所以效果相当不错。
它正在执行你期望它执行的任务,即去除不需要的列。改变这点有什么影响呢?那就是 alpha。你会发现,当你增大 alpha 时,误差会变得相当、相当糟糕。因此,这基本上就是所展示的。所以通常情况下,你不希望将 alpha 调得太大。
但这又是一个超参数需要调整。所以稍后,当我们进入 kle 竞赛模块时,我们将看到几种优化所有这些超参数的方法。因为在神经网络中,这已经变得有很多需要管理的内容。你有正则化,如何选择多少个神经元,多少层。
所有这些都是L2岭回归。与取绝对值不同,你在进行平方运算。这使得它更加平滑。因此,这导致它对试图完全消除单个列的影响减小,而是仅仅寻求保持权重或系数的降低。这就是L2回归。我们将继续运行它。我们在这里使用来自第二学习的岭回归,我将alpha设置得相当激进。
你可以在这里看到结果。它确实推动了一些中间值,但没有其他值那么强烈。顺便说一下,选择alpha为1。基本上,我只是玩一下这些,看看哪个结果给了我更好的结果?在稍后的模块中,我们将看到如何使用贝叶斯优化来帮助选择这些。
还有弹性网。弹性网结合了这两者。所以现在你有一个alpha和L1比率。这允许你,你可以指定。Alpha是L2,然后是L1比率。将它们平衡在一起,所以你现在有两个超参数需要处理。如果我运行这个,你会发现它在某种程度上类似于L2。
这与我设置的两个比率有关。但这又是你可以做到的另一种方式,稍后我们会讨论在何时将L1和L2结合使用。当我们将它们引入神经网络时。现在我们只是看到了如何在线性回归中做到这些,以展示一些基础知识,因为我们无法查看神经网络的权重。权重太多了,并且观察这些相同的情况发生。在下一个视频中,我们将看看k折交叉验证,以帮助我们更好地理解我们的常规神经网络样本预测内容是否经常更新并保持智能。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P28:L5.2- 在Keras中使用K折交叉验证 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用部分。在这一部分,我们将看看如何使用K折交叉验证来很好地估计我们的神经网络在训练集之外的数据上的表现。这将使我们能够产生样本外预测,即对于整个训练集的预测,仅需翻转训练集,让每一部分数据都有机会成为验证集和训练集。
这将让我们看到我们的正则化和其他技术在对抗过拟合方面的效果。有关我的AI课程和项目的最新信息,请点击订阅并点击旁边的铃铛,以便在每个新视频发布时获得通知。交叉验证通常有不同的目标,你实际上是在尝试完成的。k折交叉验证的整体思想是你会得到多个。😊
训练集和验证集,这样你就可以在数据的一部分上训练神经网络,而在另一部分上进行评估。这样做的最常见原因是从神经网络生成样本外预测。我们将看到如何做到这一点,但你基本上可以为整个训练集中的每一个元素生成样本外预测。当与早停结合使用时,你还可以用它来估计训练神经网络所需的合适训练轮次。
我们已经看到过。最后,你可以用它来评估某些超参数的有效性。也许你想要测试。😊,添加另一个隐藏层或其他对你的神经网络的调整是否真的有所帮助。然而,由于神经网络的随机性,通常你需要进行的不仅仅是一组交叉验证折叠,以真正评估你所做的是否产生了任何效果。我们将看看一个称为自助法的过程,以真正评估变化的有效性。
这就是交叉验证的工作原理。你基本上将数据集分成五个折叠,通常是10个折叠或其他数量的折叠。每个折叠中的元素数量应该相对均匀。由于你的数据集不会总是均匀地分成五个折叠,或其他数量的折叠,你将会在每个折叠中有一些额外的元素。
但在很大程度上,它们彼此之间相当。你有多少个折叠,你就要训练多少次。所以你实际上会为每一个折叠训练一个神经网络。这就是在这五个神经网络中你所做的复杂性之一。我们也会讨论这一点。但基本上,你会在每个折叠中选择。
因此,每次通过这五个相同的折叠,它们在每一个中都是相同的五个折叠。你选择其中一个折叠作为验证集,使用其余的,将折叠2、3、4和5连接在一起。这就是训练集,突出显示的部分就是验证集。因此你训练这个,并得到一个模型。
你训练这个,就得到了另一个模型。这让每个折叠都有机会作为验证集,你本质上是在验证集上生成预测。因此,如果你把所有这些黄色区域连接在一起,或者你有外样本预测,如果这是你的目标之一。你可以在这里看到,你基本上对每一个都进行了预测,并将这些预测连接在一起。
现在你有了一个外部预测。😊 在整个训练集上,这很好,因为你不必将部分训练集浪费用于训练,部分数据集用于验证,你能够对整个数据集进行预测。现在,如果你想将这些结合在一起,假设你已经训练了这个,现在你有五个神经网络。
有几种方法可以获得最终结果神经网络,用于处理所有这些新数据,因为你可能是因为想要持续训练某些东西而创建神经网络,比如说你是一家人寿保险公司。
你有历史数据,并且你已经创建了这个,你训练它以试图分类这些人因你的人寿保险政策而死亡的风险。你将会有新的人进来,而这正是你真正想要工作的内容。所以你需要弄清楚你在做什么,你是在选择这些模型中最好的一个,还是把它们全部平均,或者以某种方式组合在一起,这些都是常见的方法。
你可以选择验证分数最高的模型。不过,有一个警告信号,我倾向于关注的是这些模型之间的验证分数有多相似。如果其中一个模型的得分持续低于其他模型,那就意味着在这个验证集中有一些离群值,比如模型4。
因此,你看到这些模型之间的差异越多,意味着你仅仅有几个离群值落在了特别的验证折叠中,这可能是你需要在数据集中考虑的事情。也许你想要消除那些离群值,或者你,但至少你应该意识到它们,新的数据进来。
比如说你的新的人寿保险申请,你可以把这些呈现给这五个网络,然后进行投票或者取平均。所以投票的意思是,如果前面三个说不,不要给这个人投保,而第四和第五说是,那么多数派获胜,你就会说不。或者它给你某种评分或年龄,你认为这个人会活到。
然后你将它们全部平均。这是我可能最喜欢的一个。我更倾向于平均法或这个。所以你在每个上都进行提前停止。你要记录每个完整的训练需要多少个周期。也许这个训练到最优水平用了300个周期,这里提前停止到50。
320,这里,多少个周期。然后你将它们平均,或者取最大值,或者还有其他技术。但是你查看所有这些所需的训练周期数。然后在整个训练集上进行训练。你不使用验证,按照那个训练周期数进行训练。然后这就成为一个希望是最佳的单一神经网络。
在那些中最好,你仍然有神经网络的随机特性。所以你可能想多次训练这个。也许将它们平均在一起。现在,让我们看看一些如何进行交叉验证的例子。所以这里的目标将是样本外预测。
所以我们将进行样本外回归,因为对于每个这些,代码看起来稍微不同。所以你要做的是,分类和回归之间的交叉验证有一些差异,回归肯定是更简单的情况,因为你只需简单地将其划分为相等数量的折叠。
你完成了,但在分类中,你需要确保打破这些折叠不会影响你的类别平衡。如果你正在分类,比如说三种事物。你要确保这三种事物的比例在每个折叠中都是一样的。否则你会给神经网络引入偏差。这不是件好事。
所以这是用于回归的样本外 k-fold 交叉验证。在这里,我们设置了数据分配。我们使用之前相同的简单数据集,预测年龄。就像之前一样,因为这是一个回归问题。所有这些其他值都是为了帮助我们预测年龄。
现在我们假设500个训练周期。我们不打算使用提前停止,因为我们希望我们的验证折叠能真正给我们某种样本外预测。我们可以使用提前停止。所以也许我们会单独进行一次运行,弄清楚需要多少个训练周期,然后可以将其调整为更优的值。
但现在,我们只是假设500个周期,以便获得一个真正的样本外预测,了解500个周期的表现。在这里我们设置了交叉验证。我们使用的是随机状态42。那意味着每次的折叠都会是一样的。打乱总是个好主意。如果你在打乱。
你需要一个随机状态,以便你知道你的折叠是相同的,但每次运行时你的折叠都是不同的,因为你在尝试实验。这将使事情变得不一致,你不会注意到比如说折叠1一直在得到一个异常值。
更改这个值是可以的。但这至少给你一些一致性,以便在实验时使用。然后你得到训练集和测试集的分割。你传入X数据集,并且每次循环时你都在创建一个回归神经网络,因为这就是其中之一,而这就是均方误差。使用Adam进行训练。现在你正在与验证集进行拟合,以便可以报告验证错误。
当你进行样本外预测时,我们正在创建样本外Y值。这只是为了确保我们获得的Y值与我们的折叠顺序相同,以便我们可以进行最终评估,并且样本外预测只是简单地将它们连接在一起。
在进行每个操作时,你会生成样本外的预测,并将各个折叠连接在一起,以便最终得到一个统一的结果。你报告得分,以便得出整体得分。对于这个折叠,整体得分最后会在最后得到。你将把所有分组的样本外Y值连接在一起,样本外预测。然后你将比较这些Y值。
我们想要的价值观与预测值之间的差异。我们将报告一个最终的样本外评分,即这两者之间的差异。这就是你对你的神经网络的实际表现的估计。我们还可以列出样本外的预测。
如果我们想要进一步分析,可以将它们写成一个Cv文件。现在,当我们进行分类时,我们需要做一个叫做k折交叉验证的过程。这是因为我们不想说每一类物品的平衡。所以我们将使用相同的方式,继续运行并加载数据集。
现在我们正在尝试预测产品。因此,无论产品的平衡是什么。也许他们有20%的概率选择产品A。😊你不想改变这种平衡,因为那就是你的真实情况。如果神经网络根据你的数据非常不确定,它总是会说产品A的概率是20%。它会说,嗯,20%的概率。
如果它完全不清楚输入数据的情况。也许输入数据在这种情况下特别困难。所以如果你训练一个神经网络,而真实情况的百分比差异,类A在折叠1中大得多,而在折叠2中则小得多。
这会干扰真实情况,从而影响你的神经网络的准确性。所以我们使用分层 Kfold。我们在这里进行分层 Kfold 采样。我们将有五个折叠,我们将随机打乱并设置一个随机状态。这个看起来是一样的,和 Kfold 一样。
我们将继续在样本外进行预测,就像之前一样。但这一部分有点不同。我们正在进行分割。所以在之前的操作中,我们只传入了 X。但由于我们想要在 Y 上进行平衡,我们必须传入 y。我们必须传入类。
所以它需要知道我们要平衡的类是什么。我们从数据框中传入原始类。我们不想为此传入虚拟变量。这不是为了处理虚拟变量而设计的。它需要一个像 ABC 这样的类,或者其他产品。它使用这个确保每个折叠中的平衡是相同的。
所以这非常重要。你可以在这里直接使用 Kfold,就像在回归中一样,它会正常工作。😊但你会有不平衡的分割。而且通常这会正常工作,但可能会对你的神经网络的准确性产生一定影响。我们使用分类交叉熵和 softmax,以及与我们分类神经网络的类别数相等的输出神经元。
其他一切与回归相同。我们报告每个分数的个别准确性。我们使用准确性而不是我们的 MSA,因为我们在做分类。然后我们打印最终的准确性,这样我们基本上就完成了。现在你可以运行这个,它会遍历每个折叠,并报告折叠分数,最后给出最终的准确性。
所以第一个准确性大约是 66%(四舍五入)。现在你可以看到,我们基本上已经经过了所有五个折叠,并产生了一个最终的准确性得分为 66%,这与这些非常相似。最困难的折叠是第五个。
所以在那个折叠中可能有某种异常值或者其他什么因素使其更加困难。或者这可能仅仅是神经网络的随机特性。通常,你会想要再次运行这个,看看这个折叠是否始终很难。而这也是为什么你想使用随机种子,以确保折叠的一致性。最后,你可以使用交叉验证和保留集进行交易。
这是你在做五个折叠之前设置的保留数据集,这样你就可以做到这一点。这样你就能看到,这给你一个与五个折叠不同的保留集。如果我们运行这个,这也是回归。我们尝试预测年龄。然后我们可以运行它,我会让它运行,这样我们就能看到。
你设置五个折叠,就像之前一样,并且循环整个过程。1回归。你正在训练均方误差,使用原子更新规则。这其实非常相似。所有折叠都是一样的。只不过你保留了这个最终的保留集,以便进行预测,并将报告一个均方根。
所以你会看到两者之间的不同。我们会走过这一切。我们将得到最终的保留值,这就像以前的训练,只是保留集不在其中。这里是我们的最终保留,注意它比其他的更差。现在看来,我们似乎付出了额外的努力,只是为了得到一个更糟的分数。
但这是一个更准确的评分。这里的过拟合更少。感谢您观看这个视频。在下一个视频中,我们将看看如何实际使用L1和L2,以及它们的组合。这些内容经常变化,因此请订阅频道以随时了解本课程和其他主题及人工智能。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P29:L5.3- 在Keras中使用L1和L2正则化来减少过拟合 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看到如何将L1和L2正则化应用于Kira的深度神经网络。想了解我的AI课程和项目的最新信息,请点击订阅和旁边的铃铛,以便收到每个新视频的通知。我们可以将L1正则化应用于Kira,回顾一下L1和L2,我们在这里展示了它们的图形,以便你看到绝对值与平方的效果。你可以看到L1更像是拉普拉斯,边缘更尖锐,这就是它会导致系数或权重归零的原因,而L2则不会像L1那样强迫它们归零。我们可以独立或一起使用这两者应用于神经网络。我这里有一个链接,展示了Kis的实际操作说明,但我们将看一些例子。
那展示了如何将其实际应用于你的神经网络。我们将使用这个样本数据集。我们将预测产品。因此我们在进行分类,让我们继续运行这个,以便将其加载。好的,数据已经可用,所以这是我们将进行L1和/或L2正则化的地方。
这是按层级进行的,所以你可以看到这里有一个活跃的活动。Regizer并且使用O1。我们也可以使用内核正则化器,通常使用活动多于内核。活动处理的是实际的激活。😊,正则化器的。但我尝试了两者之间反复比较,看看哪个给我最佳结果,特别是L2活动正则化器的结果往往更好于L1。我通常不试图完全消除特征,使用它在神经网络上,这可以是一个有用的方法。
你也可以在Kira的文档中稍微阅读一下活动和内核之间的区别,它实际上与计算的哪个点有关,在激活函数应用之前或之后,正则化器被应用,而这就是全部。将其放在第一个隐藏层中会导致正则化器被应用,你也可以选择在这里应用第二个正则化器,简单地通过做L2。
将其从L1更改为L2。随意根据你的喜好进行调整,这又是另一个超参数,所以需要一些优化和试错。当我们到达讨论CAle竞赛的模块时,我们将看到如何使用贝叶斯优化自动优化,或者至少推动它朝着好的方向发展。
我们想对所有这些超参数做的事情。这是我们之前看到的alpha。这只是应用的程度。如果你在这里输入零,它会简单地抵消一,而根本不会应用,1就是完全的力量。你可能不想这样做,这会使训练非常不稳定。你可以继续运行这个,它会经过交叉验证并生成样本外预测,我们只是训练了500个epoch。
我们没有进行任何形式的早停,因为我们确实想要一个好的估计,看看500个epoch会如何表现,以便我们可以多次运行这个,使用不同的L1和L2值,真正了解每个值的效果。现在随着它的进行。
你将看到每个折叠的准确性。这是分类,所以我们向你展示了正确预测的百分比。在第一个折叠中,大约是66%。我会让这个继续快进,以完成其他折叠。好的,现在完成了,最终的准确性是,如我们所见,65,95。
我想给你展示一些有点烦人的特性,这与神经网络有关。我们会发现,当你重新运行它们时,分数可能会有很大变化。所以记住65,95。同时也要记住full2是最好的。我们将快速推进,以便你不必等待。好的,完成了。注意,现在不再是65,95了。它已经改变了。
看起来情况稍微变糟了。如果我们在这里尝试调整,我们可能会错误地认为上面的调整导致了问题,其实并不是一个很好的调整。你还可以看到full2,尽管这次不是最好,但仍然相当不错。
这通常保持不变,因为我们为交叉验证设置了种子值,所以在这里我们将随机状态设置为42。某些折叠肯定会比其他折叠容易,而你希望它保持一致,这样至少可以进行真正的比较。因此,我们稍后会看到这个模块中有一个叫做自助法的东西,我们可以运行很多次,然后将结果进行平均。
这样我们就能更好地了解我们对超参数的调整是否真的有所不同。感谢观看这段视频,在下一个视频中,我们将讨论dropout,这是一种专门为神经网络创建的正则化类型。
这个内容经常变化,所以请订阅频道,以便及时了解这个课程和其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P3:L1.2- 深度学习 Python 简介 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。在这段视频中,我们将介绍Python,并了解一些基础知识,这将帮助你在这个学期的课程中使用Python编程语言。
在这门课程中,我们使用Python 3、TensorFlow和Kes,关于我的AI课程和项目的最新信息,请点击订阅及旁边的小铃铛,以便收到每个新视频的通知。本部分将从Python编程语言的最基本知识开始,因此我们将学习如何打印字符串和数字。
循环和条件语句。
接下来的部分将讨论列表和字典,如何处理这些内容。如果你已经非常熟悉Python的基础介绍,你可能想跳过这一部分,直接进入下一部分,模块1的所有内容都是关于Python编程语言的介绍。
但我们在模块1的后面部分会深入探讨更高级的主题,如pandas和mapRuce。我们使用的是Python3编程语言。因此,重要的是你使用Python 2。虽然Python 2仍然是一个有效的版本,但在语法上有些差异,会导致你在这门课的一些编程代码中遇到问题。像大多数编程语言教程一样,我将从“Hello World”开始。
在Python中,你有函数,所以打印时要用开括号和闭括号,并传递一个字符串。现在在旧版本的Python中,你不一定要在这周围加括号,你可以直接打印空格“hello world”,但这被认为与Python中的函数处理不一致,因此最终被去掉了。因此,如果你遇到没有括号的打印,请确保加上括号。
这是较旧的Python 2内容。你还可以在Python中添加注释,注释很重要,因为它们可以告诉我你在做什么,并且在你提交作业时提醒你自己。如果你的代码没有正常工作,注释会一直帮助你,但我能在注释中看到你对发生的事情有一个大致的想法。
这对我来说是一个很好的鼓励,至少可以给你部分分数。因此,运行这个时带有注释的内容,效果和第一个一样,但注释会被简单忽略。三重引号,即三个双引号在Python中非常酷,这将允许你有多行字符串。所以如果你运行这个。
这就像有三个打印语句,所有换行都为你处理。因此,你在Python中经常会看到这些。现在如果你要放入一个很大的文本块,你可能真的要考虑把那个文本存储在文件中,而不是直接硬编码到源代码里。不过如果你确实需要在代码中有回车和换行,这是一种很好的方式,将所有内容编码为一个字符串。
现在这些有时也用作注释,因为如果你单独有一个字符串,比如说我去掉了打印,去掉了开放和关闭的括号。现在这几乎算是一个多行注释,因为这个字符串对你没有实际意义。现在在Python中,像许多语言一样,你可以有单引号或撇号或直引号。
无论你想如何称呼它们,它们的工作方式与双引号完全相同,所以你可以互换使用,这将像另一个那样打印出“hello world”。在选择使用哪种方式时,有时建议使用单引号来表示更符号化的字符串。字符,而不是文本。如果是人类可读的文本。
那么你可能想使用双引号。现在,我会使用的另一个我觉得有用的技巧是,如果我想在中间放一个双引号。这是完全有效的,我不需要像往常一样使用转义字符。现在,这也是有效的。这将把W放在引号中。
但是由于我们将字符串用单引号包裹,这也是有效的。数字不需要引号,你可以使用变量。Python中的变量没有类型,所以简单来说,a等于10,b等于10(带引号)。Python会判断第一个是整数,第二个是字符串。
所以你不需要提前定义那些类型,它是动态的。现在如果你运行这个,它会输出10和10,所以你可以看到这两个变量类型都被计算在内。变量的好处在于它们可以变化,所以你可以在这里随意更改变量,我们一开始把a设为10,然后加了1到10。在Python 2中,你有时会看到加等于1。
这与第一个完全相同,只是在语法上有区别。你可能也见过这样的东西,在Python中是不存在的。所以如果你没见过,没关系,在Python中不存在。当你想将字符串和变量一起打印时,Python中有多种方法可以做到这一点,但本课程推荐的方式是使用一种叫做F字符串的方式。
F字符串就是字母F,后面跟一个单引号或双引号。然后你开始有一个普通字符串,但你可以在花括号之间放任何你想放的东西。花括号之间的内容基本上是会被打印出的表达式。
它们可以是这样的单个变量。这将打印出a的值是10。你也可以在这里放入表达式类型的值,比如a加5,这将计算该表达式,并为你输出该值。Python有许多方法来打印数字。这些都是正确的。然而,对于这门课程我们将使用F字符串。
如果你以其他格式提交给我,这完全可以。Python有很多方法将数字和字符串一起打印出来,因为Python已经存在了一段时间,所以它积累了相当多的不同方法。如果我们运行这个。我们将看到它们都打印出a等于5,所以我们得到了S字符串。
我们谈到过,这是我在开始使用S字符串之前常用的一种方法。A等于。打开闭合的花括号。然后传入所有的值。如果你在其中有另一个花括号,你会像这样做,某种B。你也可以简单地将字符串连接在一起。这是相对原始的做法。没关系。这可能会让你陷入麻烦。
有时候。如果a不是字符串,你通常需要在a周围加上STR。否则你会得到一个错误。如果你曾经在C语言中工作过。你会习惯一个叫做S printf或Printf的函数。这基本上就是这个意思。那个百分号D表示打印出一个十进制数字。然后你加一个百分号。
你可以传入尽可能多的值。在这里我们只有一个。所以我们打印出if语句。Python有if语句,这些对你非常有用。这也引出了Python被某些人最讨厌的特性之一。我曾经是一个讨厌者,但现在我有点喜欢它。这就是在Python中。
空白字符是语法,空白字符会影响程序的运行。所以块状结构,这里的if语句。所有缩进的部分。在冒号之后的都是该if语句的一部分。因此如果我们想,可以添加第二个打印语句,只要我们正确缩进即可。它将成为该if语句的一部分,else的工作方式相同,如果if条件不成立,那么就执行else。
这个程序会运行,因为五不大于五。它将打印出第二个。现在你可以使用制表符。你可以使用空格,可以使用任何你想要的空白字符用于这些块,但要小心,如果你同时使用制表符和空格,那对你和Python来说都是一种挫折。Python不会真正感到沮丧,只会给你一个错误。如果你同时使用这两者,代码将非常难以管理,如果你使用制表符。
使用制表符,如果你使用空格,保持一致的数量。可以选择两个空格或四个空格来表示制表符,我通常使用制表符。这是一个关于应该使用制表符还是空格的伟大编程辩论,可能在短期内不会得到解决。不同的程序员偏好不同的方式,适合这门课程。
我不在乎。使用空格、制表符,或者任何你想要的,只要你的代码能工作。现在,我们也可以深入多个层次。如果a等于5,那么它将执行那个代码块。但注意到else if。这基本上意味着几乎就像你有那个,但输入更短,所以else if a等于6。
这在Python中有点像一个case语句。所以如果a等于5,注意两个。你在Python编程语言中有这两个等号,双等号基本上意味着它是。等于,单等号意味着赋值。所以在这里我们将计数到9,在Python中看起来像是我们在计数到10。
这是一个常见的混淆来源,我们使用一种叫做range的东西。这基本上意味着我们从1循环到但不包括10。顺便说一下,如果你看到X range,那是旧版Python 2的东西,出于效率考虑。不要,别担心这个。我们使用的是range。如果你看到带有X range的代码,你正在处理早期版本的Python,这将只是打印出循环。
我们正在从1循环到9,你也可以在这些循环中打印数字和字符串。所以在这里我创建一个累加器,初始值为零。我们将对x进行从1到10的循环。累加器加上x,所以我们在累积,每次都在将x加上,然后我们打印出我们在添加的内容以及当前的和。
如果你运行这个程序,它会说添加1,所以当然和是1。然后添加2,它变成3,6,1,10,15,所以系列继续。
它最终停在45。感谢你观看这个关于Python编程语言介绍的视频。在下一个视频中,我们将更详细地了解Python中的列表和其他数据结构如何使用。这些内容经常变化,所以请订阅频道,以便跟上这个课程和其他人工智能主题的最新动态。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P30:L5.4- Keras使用Dropout以减少过拟合 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·赫顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我将向您展示如何使用dropout,这是一种您可以在Keras的神经网络中使用的另一种正则化技术,与L1和L2一起使用。要了解我的AI课程和项目的最新信息,请点击旁边的铃铛订阅,以便在每个新视频发布时收到通知。现在,让我们看看dropout实际上在神经网络中做了什么。dropout是逐层添加的,正如您在这里看到的。
dropout,您可以为该层指定一个神经元的百分比,在这种情况下,这个神经元、这个神经元和这个神经元会被丢弃。这样在每个周期的步骤中都会改变,您不断地改变这些神经元的可用性,即哪些神经元被丢弃,哪些神经元是可用的。
它们保持权重,但不再通过这些虚线对下一层贡献任何值。所以这是我经常听到的比较之一。
就像如果您去上班,每天公司CEO随机告诉一半的人回家,这实际上会很酷。但这样做会确保没有工人特别专注于自己的任务。
它们在这方面非常灵活,且不容易过拟合特定任务。因此,这种方式保持了神经网络的活力。这也试图模拟一堆神经网络,每个都有不同的神经元配置,以帮助减轻我们在上一个部分看到的随机性,您可以多次训练它们,并获得完全不同的结果。
因此,这在一定程度上可以降低神经网络输出的变异性。这几乎就像是内置的集成,您为每一层创建了许多虚拟神经网络,因为dropout是随机应用的。现在,dropout是重要的,当这些缺失的神经元都变化时,所有的神经元都会回归。因此,每一个神经元。
这些子网络在返回后,您就得到了完整的神经网络,以供您在拟合完成后使用。因此,dropout只在训练期间影响神经网络。它是另一个我们需要优化的超参数,可能会影响我们神经网络的有效性。
这是一个相当不错的动画,我很喜欢,它展示了dropout是如何在某种程度上工作的。基本上,在训练迭代过程中,它会随机选择一些dropout神经元来丢弃。白色神经元是仍然存在的,而黑色神经元是被丢弃的。
你可以看到输入和输出神经元仍然保留在神经网络中。还有偏置。你不会丢弃偏置。那么我们来看一下该怎么做。我们将进行分类。我会继续运行这个,以便加载分类数据。我们将从样本中预测产品。😊,就是我之前给你的简单数据集。
这就是如何进行丢弃法。非常简单。你几乎添加了一个层,一个丢弃层,它影响着之前的层。所以这导致前面的层50丢弃50%的神经元。你也可以再添加一个额外的层,通常我见过的大多数文献建议不要从最终的隐藏层中丢弃。
这是在输出之前的层。因此我们会遵循这个。但如果你想把它也加到那个层上,这就是你该怎么做。继续运行这个。它基本上是在为Kfold交叉验证做准备。现在我们可以看到它已经完成了,我们的最终准确率是70%,这实际上是相当不错的。
如果我们重新运行这个,我们可能会得到不同的准确率。但这确实有助于稳定随机权重的一些影响。我们来试一下。让我们再运行一次。可以看到结果是71%。所以实际上,我们可以看到总体上,在我们两个样本的情况下。
这个丢弃法似乎相较于我们之前在其他视频中使用L1和L2时帮助更大。现在它并没有完全消除方差,我们的准确率从70%提高到了71%,仅仅是通过重新运行。
在下一个视频中,我们将看看如何使用自助法,这样我们可以通过多次运行并将结果平均来获得更好的基准。感谢你观看这个视频,在下一个视频中我们将一起看看L1、L2和丢弃法,了解你应该使用哪一种以及原因。这些内容经常变化,所以请订阅频道,以便及时了解这个课程和其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P31:L5.5- bootstrapping与基准超参数 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿。欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将一起讨论L1、L2和dropout。你可能在想太好了。我得弄清楚神经网络应该有多少层,每一层应该放多少个神经元。现在。
我还得搞清楚这些正则化技巧。设计神经网络变得复杂了。在本课程后面的部分,我们将看到如何使用贝叶斯优化来帮助我们解决这个问题。但现在,我会在这个视频中给你一些关于我的AI课程和项目的实用提示。
点击旁边的铃铛订阅,以便在每个新视频发布时收到通知。到目前为止,我们在这门课程中已经审查了不少超参数。😊。
神经网络中的层数,调整这些超参数确实会影响你的神经网络的性能。每层的神经元数量,以及你在每层使用的激活函数。现在我们已经在每层添加了dropout比例和L1、L2正则化值。
而且你知道吗,我们还没有结束。随着我们继续进行课程,我们会添加更多内容。这些是很多超参数,确定应该如何设置它们可能会很困难。在这个视频中,我不会向你展示优化这些超参数的具体技巧,但我会告诉你如何评估你的变化实际上产生了什么影响。
正如你在这个模块之前的部分看到的,如果你重新运行神经网络几次,即使使用五折交叉验证,你最终的准确率RMSE也会有所不同,这取决于你是分类还是回归。
这可能会让事情变得非常困难,因为在你进行任何更改之前,神经网络的准确率或预测能力在自然波动。在这种情况下,可能很难知道你刚刚对其中一个超参数所做的更改是否真的产生了效果,还是只是看到了神经网络由于随机权重而导致的正常变异。
现在我们要看看一个叫做bootstrapping的东西。bootstrapping类似于交叉验证,因为它是一种可以用来获取训练集和验证集以便与你的神经网络一起工作的技术。但它的不同之处在于它不是固定的折叠数。
你只需不断从初始数据集中重新获取训练集和验证集。并且这是在有放回的情况下进行的。现在,当你说“有放回”时,这意味着你第一次从数据集中提取这些元素后,将它们全部放回,然后下一次你从同一组中提取。
所以你可能会在多次抽样中得到完全相同的训练集和验证集。但这没关系。我们将把所有的准确率或均方根误差平均在一起,以获得神经网络的平均性能,随着我们不断进行,我们将继续从数据集中抽取更多的运行,并查看我们进行了多少次运行。
你需要对数据进行多少次拆分,平均误差才会真正收敛到一个一致的值。我们还将使用提前停止,因此当验证集不再改善时,我们将停止训练神经网络。这还将允许我们报告所需的平均轮次,以便你可以开始了解应该训练多少轮。现在,由于我们在进行基准测试。我们需要报告某些操作所花费的时间,因为我们可能想在Google CoLab或其他允许我们获得更多计算能力的云资源上运行这个。
我只是定义那个函数。很简单。让我们看看如何进行回归的自举。所以我会先向你展示一个回归和一个分类的自举示例,然后我们再看看这个的实际基准测试程序,因为这是回归。我们试图预测年龄。这是我们在本课程中使用过多次的简单数据集。
我将继续运行它。它会简单地加载,加载完成了。现在我要进行自举。所以让我把这个勾选掉,因为它需要一点时间来运行,并开始解释。这里,我们定义拆分的数量。这是我们要进行的多少次运行。我选择了50。
50对交叉验证来说有点大,因为你会得到一个验证集。数据集中有1/50的样本,而在更小的数据集上,这可能会导致问题。但是在这里我们要做的,是进行洗牌拆分。就像交叉验证一样,当我们进行分类时,我们将使用分层拆分,因为我们不想意外改变类别平衡,因为那样会引入偏差,导致可能训练出一个不正确的模型。
至少会有一点偏差,因为它会在错误的平衡上进行训练。要分类的类别部分。0.1告诉我,我正在从数据集中抽取10%的样本作为验证集。我们使用42,这样可以确保从中采样得到的结果是一致随机的。
在引导时做随机状态并不是那么重要,因为每次运行时。我不知道你是否真的关心分割一在再次运行时会与分割一相同。但在交叉验证中,保持一致的折叠会比较好。我们将进行分割。使用这些训练和测试进行运行。我们将构建神经网络。
所以这些是你想要尝试的超参数。你需要将这些更改为不同的值并运行它,尝试了解这一特定超参数集的有效性。我们稍后在视频中会查看这个,我们将看到如何构建基准。我们将使用早期停止。所以,由于我们使用早期停止,而我们的验证数据也是来自早期停止。
我们不能将那个验证集作为神经网络实际有效性的真实指标,因为我们同时使用同一个验证集来停止神经网络和进行评估。但这无关紧要。我们更关注的是不同运行之间的相对值。
并不是这个神经网络的真实预测能力。我们只是想优化超参数,实际上在这里。所以我们会拟合需要的剩余步骤,然后进行预测。我们将跟踪平均误差和所需的平均纪元数。大约纪元,然而。
你想要发音那个词。我们还跟踪误差的标准差,因为标准差让我们了解特定超参数集给我们的方差有多大。神经网络的准确性或R messy在不同运行之间的变化。
现在你可以看到,我们做了相当多的分割。在开始时,我们得到了0.688的分数。显然,这仍然是均值分数,因为只有一个。第一个没有标准差,因为它没有偏离任何值。我们继续获取分数。你会注意到,分数相当波动,Sc等于0。
88,分数等于0.56等等。我们继续这个过程。当我们到达36时,也就是它达到的程度。我们可以看到标准差相当不错。因此,波动大约在±0.18之间。我们可以看到均分数,它有些收敛。大约在74左右,仍然在10的范围内波动。
但是你可以真正看到,在这些开始趋于相当之前,你想要平均多少个。这些纪元。看起来大约在113到130之间。这些值变化很大,但均值纪元已经收敛到1,1,8,11,7。因此均值纪元看起来是117到118。这就是你真正需要训练的纪元数。
然后,平均分数。它说那里,没有太多收敛。它大约在0.75到0.74之间。因此,我们处于相当高的7.4和低7.5之间。所以它大约在0.75左右。但是如果你仅查看这里的平均分数,可以看到随着它的进行,平均值有很多方差。这是回归。现在。
如果你想进行分类,这真的很相似,除了……好吧,你会加载我们将预测的产品数据集,因为它是分类形式。在这里,我们将使用分层洗牌拆分。这将确保这些类在分类中保持平衡。我们使用10%。
就像之前一样,随机状态为42。然后我们要进行拆分。但注意,我们需要除了X以外,还要传入产品,以便我们知道类是什么,以便能够均匀拆分,然后我们再进行相同的拆分,就像之前一样。其余部分实际上是相当相似的。
我们有分类交叉熵,并将最终输出神经元计数设置为类的数量。因此,这就是典型的分类方式。我们打印出之前的相同结果。因此,我们跟踪平均周期和平均分数,以便能够了解我们应该训练多长时间,以及……相对于其他超参数设置。
当前超参数集的有效性。现在,为了使用这个基准,我们将做一个回归问题。所以在这里,我正在设置数据集。为了基准测试,我们将做一个分类问题。因此,我基本上是在设置,以便在产品列上创建虚拟变量。我们将用对数损失评估它。我将运行这个,以便我们能够得到它。
我将开始基准测试,并在进行时解释。所以你会注意到这非常相似。我们正在进行分层洗牌拆分,就像之前一样。拆分次数。这次是100,因为这给了我更收敛的分数,以便实际使用10%的测试集大小进行评估。因此,我们像之前一样循环。这里最大的不同是。
我确实花了一些时间尝试调整这些。你会注意到我使用了不同的激活函数。我们将看到更多关于这个Prelu的内容。它像一个泄漏的relu,只是泄漏的程度是一个由神经网络优化的参数。当我们进入kagle模块并谈论如何真正自动调整这些超参数时,我们将看到一些更现代的激活函数。
所以我使用了那种激活函数。我在前两个隐藏层上有50%的丢弃,但第三个没有。这就是我尝试的主要内容。我尝试了几种不同的方式。这实际上给了我对数损失最低或最佳的结果,因为通常希望对数损失较低。这是我得到的一些其他尝试和各种平均分数。
我大约得到了这个结果,接近0.65,这大致是均值分数收敛的值。标准差稍微低一些。我将其归因于使用了dropout,并且你可以让这个过程持续进行。这需要一点时间。因此,这可能是一个非常漫长的过程,我通常会让我的常规计算机和我的Google Coab账户同时在特定问题的不同方面工作,因此这个过程会继续进行。你会看到这个分数收敛到大约0.65左右。
感谢你观看到目前为止的视频,在本课程中,我们主要处理的是表格数据,神经网络在这方面表现良好。然而,现在我们将开始进入一些使神经网络真正成为一种备受关注的模型类型的内容。
具体来说,我们将从图像开始,但我们也会进入时间序列。如何让图像实际成为神经网络的输出,以及其他相关内容?
这个内容经常更新,所以请订阅频道以保持对本课程和人工智能其他主题的最新了解。这个内容经常更新,所以请订阅频道以保持对本课程和人工智能其他主题的最新了解。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P32:L6.1- 基于Keras神经网络建模需要的图像处理 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff Heaan,欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将开始研究计算机视觉中的图像。我们将从一些基本的Python图像处理能力开始。如果我们要查看图像,就需要知道如何将JPEG和PNG加载到Python中,以便调整分辨率。
控制它们是否是彩色的,或者将它们裁剪到特定边界。有关我AI课程和项目的最新信息,请点击订阅,并按旁边的铃铛以接收每个新视频的通知。在Python中有许多处理图像的包,我们将使用pillow包。
安装相对简单。你只需执行Pip install pillow。这个包在我们第一次上课时的安装列表中。因此,你可能已经安装了它。它也包含在Google Co Lab中。Python中还有其他图像处理包可用。
你常常会看到的一个是叫做open CV的东西。它的安装稍微复杂一点,而且我们并不需要它的一些高级视频功能,所以我们坚持使用pillow。现在,pillow允许你将图像直接加载到你的Python环境中。它来自PIL包,这就是你实际访问它的方式。
我们可以使用Maplotlib来实际查看我们对这些图像进行的一些变换的结果。我们将从网址加载一张图像,这就是我们获取大部分图像的地方。在下一个模块中,当我们进入GNs时,我们将需要大量图像,我们将直接从Cale获取。因此,我将向你展示如何做到这一点,这个过程会稍有不同。
但我们仍将使用一些相同的命令来处理这些内容。在这里,我们使用requests包和Python,这让我们可以直接从网址读取数据。我们基本上是获取这张图像,加载它,然后可以显示出来。所以,当我们加载这张图像时,由于它是实时从互联网获取的,因此需要一点时间。
你可以看到图像的数值形式,也可以看到图像的视觉形式。
在新的Eric表单中,你会注意到这些数字是以三组3 Bte的形式出现的。这是由于红、绿和蓝。因此是RGB。你可以看到许多颜色在彼此的范围内非常相似。你也可以在Python中创建图像,而不仅仅是简单地加载它们。
你可以从零开始创建一幅图像。你可以生成像素,Python实际上会为你将其转换为图像。
首先,让我们直接运行这个,以便你能看到它到底在做什么。它基本上是在创建一个红绿蓝的图标,几乎像一个微软Windows的标志。这个过程的工作原理是我们在创建高度和宽度。所以这是64像素乘以64像素,并不大。我们正在创建一个数据。
在NumPy中设置或矩阵来保存这个,高度和宽度。然后是3。所以这是3D的。它更像是一个张量而不是矩阵。这个立方体将保存高度和宽度,然后三个深度是红、绿、蓝这三种颜色。数据类型很重要,我们需要将其设置为无符号8位整数,基本上是字节。
因为一个像素的三个组件是现在有时会有第四个。颜色其实不是颜色,而是与红、绿和蓝值相关的透明通道。但在这一点上我们不使用透明通道,因为这是64乘64。我们将希望绘制每一个这些方块。
这形成了一种棋盘式的红绿蓝黄色。因此,对于黄色,我们将做行32列32。现在我们正在做所有这些,因为每个子方框都是32乘32。所以432乘32创建了64乘64,我们循环遍历所有这些,并在那个位置设置数据为255, 255, 0,这是黄色的RGB代码。所以由于我们只是指定行和列而没有添加任何东西。
这是我们正在处理的左上方的方块。因为是32乘32,所以我们简单地填充整个红色方块。我们在所有这些中以相同的方式开始循环。因此行现在被偏移了32。所以我们实际上在向下移动。列仍然在这里。
所以我们没有移动,这里绘制的是红色。如果我们在行和列上都移动,这里就是绿色。如果我们只在列上移动,这里就是蓝色。所以你可以看到我们基本上循环遍历并实际为整个图像中的每个像素分配颜色。然后我们从数组创建图像,表明它是红、绿、蓝。
还有其他编码方式,而不是RGB。但我们将主要使用RGB。所以这向你展示了我们从零开始真正创建了一幅图像。在下一个模块中查看生成对抗网络时,我们将真正从像素开始构建面孔。你也可以转换图像。这是一个常见的程序。
有时你可能需要裁剪图像或将其更改为灰度,或做其他事情,以便让它们准备好进入神经网络。这是在逐像素水平进行转换。所以我将继续运行这个,以便你可以看到最终输出,在我们查看如何实现之前。它告诉你有多少行和列。图像在这里。
现在确实花了一点时间来生成这个。这是因为我们实际上在遍历每个相对高分辨率图像的像素。这是我们之前的同一张图片,但我们将其转换为灰度图像。我们基本上像之前一样加载图像。这一切与前面的例子相同。我们获取行和列并打印出来。现在我们将创建第二张图像,这张图像与我们在前一个例子中创建的小棋盘非常相似。
我们将基本上渲染成那个图像,所以我们将遍历每一行,每一列。我们要计算每个像素的平均值,所以每三个三像素的红绿蓝值都要相加,然后取平均。这是一种非常原始的灰度化方法。还有更高级的灰度化方式使用加权和。
但这是一个很好的例子,展示如何逐个转换每个像素。这两个循环是占用一些时间的原因。当你运行这个时,你会注意到几秒的延迟。然后我们基本上通过使用数组从图像中获取图像。
现在我们准备展示我们的修改图像。你通常也会想要标准化图像。这是将不同尺寸的图像缩小到相同大小的过程。😊这是一个非常常见的程序。通常,这将在图像数据集中为你完成。但如果你真的在收集原始图像,你需要自己进行一些标准化。
我给它提供了一个来自维基百科的图像列表。这些只是华盛顿大学不同建筑的图片,维基百科有它们的所有图片。我在这里创建一个名为make square的函数,所以我们获取图像,获取行和列。我们检查一下行是否比列多。
这处理了图像不会具有相同宽高比的事实。让我实际展示一下这是什么样子。这样会更清楚,所以这基本上是在裁剪这些图像,使它们都变成完美的Instagram方形,然后逐个进行裁剪。
然后我们可以使用类似之前的代码逐个加载这些图像,使每个图像变为正方形。我们调整它们的大小。所以一旦它们被调整为正方形,我们就可以将它们调整为128乘128。这可能是增大,也可能是缩小。大多数情况下,这是缩小。我们还在将这些图像数组展平,以便得到一个列表。
组成该数组的值是你通常将数据输入神经网络的形式。你常常会看到这个命令,我们正在做的事情。我们实际上是将其转换为一个范围,范围在负1到1之间,以0为中心,因为图像有256个可能的值。这个值的一半是128。我们从中减去128,这实际上使其以0为中心。
然后我们将其除以128,以使其大致在负1和1之间。你会看到所有图像都完全加载并标准化为128乘128。我们有时也会想给图像添加噪声。当我们进入自编码器时,我们将看到这一点,因为我们将创建去噪自编码器。
或基本上是在教学。神经网络从图像中去除噪声。我们先运行这个,这样你就能看到它的样子。好的,这里是同一幅图像,里面加了一些随机的方块,这些基本上就是噪声。添加噪声实际上是创建了一幅图像的副本,我们正在提取行和列。
我们将遍历并放置100个方框。我们在这个范围内生成随机位置。这有点有趣。我们使用了nuy。看起来我们只给0分配了一个值,但实际上我们在一个范围内进行分配,一个在y和y加S之间的矩阵范围。所以S是每个方框的大小,加上x的那个大小。
所以S真正做的大小是这些方框相对于图片的大小。它们基本上是行和列的1/120。因此,如果行是较小的一个或者列中的任一个是较小的,我们就取它的1/120,这就成为这些方框的高度和宽度。感谢观看这个视频,在下一个视频中,我们将研究卷积神经网络,用于我们为深度学习引入的两个非常著名的数据集。这个内容经常变化,所以请订阅频道,以便随时了解本课程和其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P33:L6.2- 用于MNIST和fashion-MNIST的Keras卷积神经网络 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff Heaton。欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看看如何使用卷积神经网络。我们将从一个经典的神经网络数据集开始,这个数据集在许多不同的模型中使用,除了神经网络之外,这就是MNS数字数据集。
接下来,我们将查看一个非常相似的新数据集。它被设计为MNS的替代品,这就是男性时尚数据集。在我们完成这些之后,我们将能够看到卷积神经网络的更高级主题。想了解我最新的AI课程和项目,请点击订阅,并点击旁边的铃铛以获得每个新视频的通知。
所以你会注意到,我使用Google Coab而不仅仅是简单地使用我的笔记本电脑,就像我在许多这些视频中所做的那样。
我们使用Google Coab是因为我们需要使用GPU。如果不使用GPU,这将运行得非常慢。实际上,有些事情在GPU上可能需要五分钟,而没有GPU可能需要两个小时。因此,拥有可用的GPU非常重要。
我有一个完整的视频,我会链接到这个。它与这个课程相关,展示了如何将Google Coab与此课程结合使用。基本上,如果你想运行我的任何课程材料,最好打开带有Google Coab的GitHub仓库,并将文件导入。
这正是我在这里所做的。你可以在这里看到。我已连接到GitHub,并导入了这个类6。现在,让我们看看如何将其与Kira和卷积神经网络一起使用。首先,让我们更改运行时类型。我们确实想要使用。
所以它在Python 3.6中说,华盛顿大学。这是一些本地内容。因此,当我尝试运行时,它会对此抱怨,因为Google Coab不知道那是什么。这是我拥有的本地Python环境。我将其切换到Python 3硬件加速器。我们想要GPU。我们稍后会进入TUus,让我们继续保存。现在。
每当我在这里运行东西时。它会用GPU运行。所以我们将查看计算机视觉数据集。在这个中,我们看到几个。😊。
课程模块,接下来我们将在本学期后面进入一些更高级的内容。经典的计算机视觉数据集是MNS数字。这些基本上是28x28像素的手写数字,它们在研究论文中被反复研究和使用。因此。
有一个与此非常相关的数据集被添加到这个名为Minced fashion的项目中。它看起来非常相似,只不过是手袋、鞋子和衬衫。所以你试图检测的是衣物,而不是数字。但我们需要通过这些mins数字。我们想看看这是如何运作的,因为它是。
这是你典型的hello world程序。对于机器学习和计算机视觉来说。这些数字来自哪里。标准化考试,越来越多地,这正在变得在线。但你们可能做过填泡的那种标准化测试。当我上小学、高中,并为ACT和SAT考试准备时,准备上大学。
这是唯一的方式,你可以字面理解这些学生正在创建完美的计算机视觉训练数据,因为学生们会在这里画个三,然后填空。所以你得到了X,即他们画的内容和Y。
他们填入小空白的期望标签。现在这个数据集中有噪声。一些学生,特别是我。在参加这些考试时字迹非常糟糕。有些学生会撒谎。他们会在这里画个三,然后在这里填个四。R是一个合法的错误。
所以这基本上就是它的工作原理。我还记得一些我在身份盗窃前的天真时代参加的考试。你会在考试纸上写上你的社会安全号码。可能会出什么问题呢。所以这就是被挖掘的数字。Minced fashion基本上是与mins digits完全相同格式的衣物。
所以这是一种可替代的解决方案。我们将查看这些数据,因为它非常出色,并且对于机器学习来说比minst更具挑战性。机器学习变得更聪明了。所以我们需要更聪明,而不是更聪明,而是更困难的数据集来挑战机器学习。
你可以看到有鞋子、裤子、衬衫、裙子。
时尚物品基本上是让神经网络去识别的。所以你有10种不同类型的时尚,而不是10个不同的数字。它也是CR数据集。C 10,我们会使用它,因为。
我们将在本课程稍后查看resnets,这是他们首次真正展示自己能力的数据集。所以我们将看到如何将resnet应用于这些全彩色的数据集,这里你有不同类型的飞机、汽车、猫、鸟。
顺便说一下,这些事情的共同抱怨是一些机器学习数据库后来的版本试图修复的问题,即这些数据中有多少百分比是动物。飞机不是鸟,猫,鹿,狗,青蛙,马。好的,所以大约60%是动物。
所以在学习的特征方面并不是完全平衡。我想向你展示其他资源。在斯坦福,有一整门课程专门讲卷积神经网络。就像这门课程一样,他们将所有材料都放在网上。
所以如果你特别对卷积神经网络感兴趣,想要查看一下。Andre Kpathy是一个我从他读研究生时就关注的研究者,他是一个非常有趣的人,做了很多计算机视觉的工作。他的论文是关于图像字幕的。你可能有一张猫骑滑板的图片,神经网络会真的以文本形式写出来:猫骑滑板。这是我认为他论文中的一个图像。
他最初在斯坦福教授这门课程。我想他现在在特斯拉工作,所以他可能不再教这门课程,斯坦福大学的所有信息都在线上。他还写了Convenet JS。这是一个完全用JavaScript编写的早期卷积神经网络库。现在你可能会使用Google的Tensorflow for JavaScript。
但值得一看,因此我们将研究卷积神经网络。卷积神经网络,很多深度学习和神经网络的一般应用,来源于Janang Laon,他是深度学习领域的Tring奖的共同获得者之一,获得者还包括Yshua Benjiio和Jeffrey Hinton。这个有什么?与之前的神经网络相比,真的很强大。
还有其他传统的机器学习模型,比如支持向量机,可以进行扫描。所以我们这里有数字A,注意这个小框与卷积层相连。卷积层是我们现在拥有的几种新类型层之一。我们有密集层,现在我们得到了卷积层和最大池化层。
我们在这门课程中之前也介绍了dropout层,但这两个是新的。卷积层使用这个正方形。用于扫描,所以你指定那个正方形的大小,扫描区域的大小。它会在整个图像区域内扫描,并在过程中学习。如果正方形就在这里。
它会学习顶部隆起的特征,呈现出一个角度。现在,其他字母可能也有这样的特征,这些通常被称为过滤器或神经元。它们大致相当于普通隐藏层中的神经元。会学习这些属性。也许其中一个会学习一条在这里停止的线。
也许其中一个学习了一个倾斜的线,另一个学习了与线垂直的连接。顶部的隆起。这些都会被特征图学习,而这些在卷积神经网络中。卷积层。特征图是卷积层的另一种说法。
然后在你学习完这个后,你可能想要进行下采样并降低到更低的分辨率。这就是最大池化层。我们稍后将看到所有这些层如何工作,确切地说。😊然后你有一些额外的卷积层,现在学习在这个大大缩小的图上找到特征。所以由于它的分辨率较小,你现在真正要寻找的是第一层学习到的构建块。
所以这个第一层可能学习的是垂直连接线和线的末端。现在仅仅使用这些构建块,这一层然后构建更高层次的抽象。所以也许它学习到,好的,凸起连接到两条线。然后我们通过一些全连接层,这些是稠密层。
这些上面有各种术语在流传。😊稠密层基本上就是我在过去五年文献中看到的称谓,然后高斯连接。基本上用于分类。所以输出有10。因此有10种不同类型的数字。有趣的是,他指定了10个输出。
但是在这里有个字母,如果他在教的时候,可能会期待26个字母。但这篇论文使用了挖掘的数字。你可以画一个“A”,它可能会认为这是一个“A9”,上面有奇怪的线条。尽管如此,这是来自La在1998年原始论文中的原始图表,为后来的很多内容奠定了框架。
卷积层。你需要在它们上面指定的是过滤器的数量。过滤器的大小。那是扫描的正方形的大小。侧边是那个正方形在扫描时跳跃的像素数,填充基本上是你放置在图像周围的边框,因为当那个正方形到达边缘时。你并不希望它就这样掉出图像的边缘,而没有完整的像素集,所以你可以在它周围放置填充,基本上是黑色背景的零,同时你还需要指定一些激活函数。
通常是ReLU或类似的变体,如PReLU或Leaky ReLU,那一类。通常卷积层基本上添加权重和参数,就像其他层一样。它添加的参数量将是过滤器大小乘以过滤器大小,因为扫描正方形总是正方形,因此过滤器大小被假定为水平和垂直相同,乘以过滤器的数量,这基本上就是卷积层内部的权重。
一旦它扫描整个图像区域。它们通常被称为共享权重,因为这意味着在图像上方检测到的东西也可以在图像下方被检测到。位置不变性。基本上,你可以让某个东西移动,而它仍然可以被检测到。这就是你可以考虑卷积层如何工作的本质。
你将有这个方形。现在,这是处理灰度图像。因此,每个像素上并没有红、绿、蓝三个独立元素。如果这是彩色图像,基本上只会有一个深度组件,每个像素将有三个数字。但这个蓝色区域基本上是扫描,它在扫描时横跨而过。
它必须在每次预测或训练的每一步中完全遍历整个图像。现在是最大池化层。这里是你减少分辨率的地方。所以说你想将分辨率减半。你将基本上取一个6乘6的区域,降到3乘3。所以它将分成这些区域。
你将取最大值,因此是最大池化层。这个单元中的最大值是8。所以你得到8。这个单元中的最大值是2。你得到2。依此类推,我这里有一个链接可以提供。如果你想了解更多关于卷积神经网络低层的信息。我们来看看如何处理数字数据集,我将继续运行这里的区域。
它显示了信息。所以我们的训练集有60000个,测试集有10000个。现在,注意我们并不需要自己拆分训练和测试。他们不希望你这样做,以应对庞大的数据集。这是因为这个数据集几乎以竞争的方式用于论文。所以他们希望每个人都使用相同的训练和测试集,以便能够进行合理的比较。因此,如果你说你在这个数据集上得到了某个结果。
这不仅仅是因为你在训练和测试之间选择了一个幸运的结果。如果我们想显示数字,我们可以简单地运行这个。这显示了这个数据集中实际包含的内容。现在,注意,我们确实是直接从Kis提取数据集的。Kis为常见的数据集提供了这个便利。
但如果你尝试使用自己的图像,这可能会非常麻烦。我们将在未来的视频中讨论如何提取你自己的原始JPEG和PNG图像。不过现在,我们将使用这里的便利方法。你可以看到其中一张图像。它非常大。你可能会看到某种螺旋形。如果你想实际显示它。
你可以运行这个。它以某种方式显示出来。这是第105个数字,如果你想选择下一个数字,它将显示出6。所以这本质上是Matplot Live提供的热图。它提供了一种方便的可视化方式。如果你想查看很多数据。
你只需做子图。在Mapllib中运行它。它会显示一堆数字。所以这是可视化这些数据集的一种好方法,显示它们确实只是为你提取的图像。你基本上需要将原始PNG和JPEG文件转换为张量,变成高宽度乘以颜色深度的立方体。现在,让我们构建一个神经网络来训练这个。
在这里我们会很高兴有GPU。😊 实际上构建这个并不需要太多时间。它显示了我们的一些超参数,我们选择的批处理大小是128。我们对数据集进行一些基本转换,以确保一切符合Tensorflow的要求。通常,我们需要一个高度乘以宽度乘以颜色深度。
我们将看到如何实际做到这一点。如何处理原始图像。当我们加载自己的图像时,这是重要的。这是在进行一些基本规范化。所以我说神经网络最好处理的数据总是在相同范围内。好吧,你的RGB每个颜色分量始终在0到255的相同范围内。但这里。
这将获取所有在0到1之间的值。因为正常范围是0到2.55,为了获得更好的结果,你甚至可以将其围绕0居中。所以你可能需要减去128并除以128。稍后我们将看到一个例子。我们打印出有多少训练样本。这里是我们构建神经网络的地方。
我们在层中添加了一些卷积。你实际上没有3D卷积,可能会有一个,但通常你处理的是2D,因为你在识别2D图像。如果有人找到了发送3D图像进行识别的方法,我不会感到惊讶。你可能需要两个相机来捕捉这些。
但我们只处理2D图像,而不是3D。然后我们加入最大池化层,添加一些dropout。在从这些2D层转换到我们之前提到的密集层时,总是需要扁平层。所以一定要加上这个扁平层,因为一旦扁平化,你就不能再回去,或者至少没有一些非常特殊的重塑。
永远不要说永远不。然后你使用一个密集层。这是分类。因此我们使用类的类别交叉熵和softmax,就像我们以前看到的那样。现在,当你想训练并适应它时,注意我这里的时间,这在CPU上需要近两个小时,而在GPU上只需13分钟。
在GPU上并不会花你太多时间。这个谷歌免费提供的GPU比我大约一年前运行时用的GPU要好。所以你免费获得的东西真是太棒了。让我们继续运行这个。我们将继续训练,这段代码与我们之前看到的训练代码一样。
我会计时,所以我们将确切看到这需要多少时间。现在你想运行它。启动时通常需要一点时间,但我们已经进入第一个纪元。它,真的很快。我们在第二个纪元,它,实际上只需要大约4秒每个纪元。所以我会继续快进,但它是。
这不会花费太多时间。想想看,这可能在一些 CPU 上需要两个小时。而我们只用了 53 秒。我喜欢 GPU。现在,你正在处理两种类型的 GPU。有 K80,我认为这是它的名称,Google 免费提供给你。那是更便宜的,可能在 $500 到 $700 的 GPU 范围内。这是 2019 年的情况。😊,好吧。
我会确保在这个视频发生重大变化时已经更新了它。还有一个更先进的 V100 企业级 GPU。我在亚马逊云上使用这个。它大概是 $6000 或 $7000 的 GPU。你可能会认为在那个上运行会更快,但并不会。这个神经网络并不复杂。
在这个 GPU 上的运行速度与另一个差不多。因此,当你在像亚马逊云这样的环境中运行时,你需要真正地进行平衡,避免过度使用高级 GPU,否则你只是在浪费金钱。你正在处理亚马逊云上更先进的 GPU,至少在今天的价格上。
每小时大约 $4,而 Google 提供给你的这个 GPU 每小时不到 $1。因此,肯定要使用 Google 的那个。在我给你的一些作业中,你将需要 GPU 级别的处理性能,否则你将花费数小时进行训练,并且将花费很长时间。因此,在讨论这些作业时,我会说明,因为每个作业都有单独的视频和解释。现在,让我们评估准确性。
让我们运行这个并看看准确率,99%。这就是为什么引入 Fashion MNIST 的原因,因为这是一个不错的 Hello World,如果你想对这个进行任何研究,你将会得到 99.9999 的结果。说你将准确率从 99% 提高到 99.9999% 是毫无意义的。现在,还有一件事在评分时也很有用。
这是在发送数据以获取预测值时,如果你在使用 GPU,你可能会遇到资源耗尽错误,这仅仅是因为你一次性向 GPU 投入了太多数据进行评分。因此,你有几个选择,这通常在训练期间不会出现,因为你使用的是小批量。但是如果你试图对像一百万行这样的大数据块进行评分,它可能无法适应 GPU。
这里有几个选择,评分通常非常快。你可以将其发送到 CPU,无论大小,只要在合理范围内都没关系。或者你可以将其分成几部分,一次将每部分发送到 GPU。你可以使用这样的代码来实现这一点,如果我只想评分前 100 个。
我给你举个例子。现在,让我们看看时尚数据集。我们正在使用便捷的方法加载数据,这样我们就不必拥有所有时尚项目的数据集。我们将继续运行,这正在下载。因此,当你第一次运行这些时,它会下载数据。
如果我们想像之前一样显示这些,这正是,顺便说一下。与数字的代码完全相同。因此我不打算重新解释这一切。只是稍微给你展示一下它的样子。让我们来运行一下。我不应该真的说是数字9。这是时尚服装的第九号,也就是一双鞋。
如果我们想像数字一样显示一整系列的物品,我们是可以的。因此,有一组时尚物品正试图展示出来。再次强调,这非常相似。训练时间。我将继续定义。神经网络就像之前那样。它已经定义好了。我们现在将进行训练。我们会发现训练时间确实非常相似。
与我们之前处理的情况相比。注意,准确率并没有直接上升到99%。大约在89%。90%。所以这显然更困难。你需要。你必须付出更多努力才能将其提升到更高的准确率水平。而且我没有查看。这并不是一个太真实的数据集。
我想它在研究中有一些使用,但我没有查看过具体在哪里。一些更先进的研究人员将其提升到哪里。但看起来我们大约在92%的验证准确率。并且看起来它是。
大致停在这里。感谢你观看这个视频。在下一个视频中。我们将继续讨论计算机视觉,并研究残差网络(resnets)。这部分内容经常更新。因此请订阅频道,以便随时了解本课程及其他人工智能主题。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P34:L6.3- 在 Keras 中实现 ResNet - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿。欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看一下 ResNet,这是一种可以在 Keras 中实现的神经网络,它利用了残差,真正让这个神经网络独特的是它有跳跃连接,不仅仅是连接到下一层,关于我 AI 课程和项目的最新动态。
点击订阅并点击旁边的铃铛,以便接收到每个新视频的通知。ResNet 真的展示了 Keras 的灵活性。Keras 目前没有 ResNet 层。因此我们将字面上构建我们自己的 ResNet 层,这并不是特别困难。我在 Keras 网站上找到一个实现的函数。
我们将看看 Keras 可以做到什么。这在 I SVC 分类挑战中引起了很大的轰动。这。😊!
使用 C far 10 数据集并且仅仅取得第一名,击败了所有其他的。这是描述这一过程的论文。我从论文中提取了一些这些图像。首先,让我们谈谈什么是残差。那么什么是残差神经网络,或称为 ResNet,残差。如果你查看米里亚姆·韦伯斯特。
这是一种经验或活动的内部产物,影响后续行为。在这些神经网络中,它就是这样。它是一个跳跃层。我更喜欢称之为跳跃层,而不是残差,但无论如何,两个术语都同样有效。现在,同样重要的是要注意它跳过了两个层,两个正常加权的。😊 RellU 层。
现在,激活函数通常是在加权层之后应用的。所以这很正常。几乎就像我们注意到这一层的输入是什么。我们激活这个其他的加权层。但我们还不应用这个值或任何非线性。但我们把这个 X 输入直接加到这里。所以这里的输出会加到那儿。
在某种程度上,这个值有点像。这几乎是递归神经网络的反面。我们很快就会看到递归神经网络。与递归神经网络向后运行不同,它是向前的。
为什么你想这样做呢?简单的答案是,它提供了更大的预测能力,让你可以更深更深地训练。论文对此有更多讨论。但它显示出,当你训练更深的神经网络时,结果会越来越好,然后你会遇到一个瓶颈。
随着你添加更深的层数,你的结果会越来越差。这已经在100层、100个隐藏层及以上进行过实验。我认为甚至有过几次尝试达到1万层的情况,但这些并不一定显示出完全有前景的结果,不过这方面的研究变化很快。
这就是其中一个样子的,别担心VGG。神经网络,也就是说,更多的是传统的卷积神经网络,还有一些其他的调整。基本上是他们试图在这次比赛中超越的竞争对手。这是一个34层的简单网络,就像我们刚刚学习的卷积神经网络一样。
这一切都是基于卷积的。这是34层残差网络。 所以这实际上是它的样子。你可以看到这些跳跃层,跳跃层,跳跃层,等等。不同的颜色,64个滤波器,128个滤波器,256个滤波器,等等,然后它们最终进入一个平均池化,SC是完全连接的。这。
VGG使用了多个全连接层和类似的卷积。结合池化,这使用的是平均池而不是最大池,尤其是在最后阶段。让我们来看看运行这个的代码。这是使用Cf数据集。它需要下载,当前在谷歌上使用Google Coab。
你会发现自己经常需要重新下载这些。你要小心,因为谷歌只保留你存储在谷歌云盘中的内容。我关于如何使用Google Coab的介绍视频已经解释了这些内容。现在,我们要抓取数据。😊,这些数据以pickle格式存储,所以我们要。
提取我们刚下载的数据并准备进行训练,现在我们已经下载了它。让我们展示一下,这段代码的作用是展示这个数据集中的一些样本。汽车、狗,依然主要是动物,但这就是这个数据集。
这些是一些描述我们在实现中的参数。我们将使用200个训练周期,即使使用GPU,也需要一段时间来训练,这个过程持续几个小时。批量大小为32,类别数直接从数据中提取。它有10种颜色,我们直接从数据集中提取,包含红、绿、蓝三个通道。
像素减法的意思是这基本上是将其中心化到0。这有助于提高预测的准确性。ResNet有两个版本,ResNet版本1是原始版本,ResNet版本2有一些改进。我稍后会在这个视频中谈到。我们在选择深度时,基于图像的大小和颜色的数量进行计算。
我们根据版本和颜色选择深度。这是一个有用的函数。这是遵循论文的。这是学习率调度器。这基本上将在跨越多个训练周期时降低学习率。因此,每当我们更改学习率时,都会在这里报告。这可以非常有效。
我们在原子训练中使用这个。通常,你希望随着进展减少学习率。所以这展示了这一技术。你可能希望在Cagle比赛或其他事情中利用这个。你需要进行实验,以查看它的具体效果。顺便说一下。
我从Keras网站获得了所有这些数据或代码。所以这只是一些示例。我已将其更新到最新版本的Tensorflow和Keras,并稍作调整,使其更易读,并将其分段到一个Jupyter笔记本中。这基本上创建了一个Resnet层。因此包括两个普通层和跳跃连接。
它基本上在创建卷积2D层。它确实在其中放置了一个批量归一化层。批量归一化😊,是一个好的层,你可能想使用,它基本上帮助解决消失梯度问题,防止其过于严重。
这不是一个大问题。它在每个批次、每个小批次上进行归一化。我们还使用了一种特殊的权重初始化器,称为He正态分布。这又是,遵循了原始论文的做法。我们还使用了L2的核正则化,同样遵循了论文。这实现了Resnet版本1。
这主要是我们在这里处理的内容,但我包括了这两者。Resnet版本1和版本2。这指定了输入参数,指定形状。本质上是将那些层堆叠在一起,最终形成密集输出。它构建了那些单独的Resnet块。一个Resnet块是两个卷积层堆叠在一起。
所以它创建了两个Resnet层。现在,上面提到的Resnet层基本上是Resnet块的两个部分。我们在跟踪这些。所以我们在这里有Y。X作为输入。然后第二个是传入这里。这部分实现了跳跃层。
最后,我们进行一个平均池化。在最终的密集层中,我们也会这样做。我将继续运行这个,以便我们将其保存在内存中。我们也有Resnet的第二个版本,完整的V2变体与V1的主要区别是每一层之前使用批量归一化。这总体上带来了一些改进。我们主要处理版本一。
但两者都在这里,你可以尝试这两个。看看归一化之间的差异。在每个点还是仅在那些Resnet块的末尾。这里是我们实际运行的地方。因此我获取输入形状,获取训练和测试。如果我们想减去像素均值。
这正在进行中。它使其更有效地集中在0附近,输入一个好主意。我们运行resonnet V1或V2,具体取决于我们有什么,我们编译它并生成一个摘要。所以这只是构建神经网络,并没有实际运行。它已经准备好了。它再次向你展示网络的整个结构,试图与原始论文相匹配。
这是我们实际执行和训练它的地方。我将运行它,只是为了让它继续,因为这将需要很长时间。我们获得学习率调度器,这会使学习率降低,直到达到平稳状态。当我们达到平稳状态时,它会降低学习率。所以如果我们不使用图像增强,顺便提一下,我们确实使用了,我们就进行正常的拟合。
图像增强对于让模型学习不对训练数据过拟合非常有用。这允许它在图像中移动和变化。每一种变换都是你可以对图像进行的各种随机变换,基本上是在训练过程中以各种方式扭曲它。所以每次它都会获得全新的图像。
但它们都是基于训练集图像的。你可以随机水平和垂直翻转它。我们是水平翻转,但不再垂直翻转。我基本上遵循Kira示例的设置。所以你可以尝试一些其他的值。这可能会给你更好的结果。
你可能还想使用图像数据生成器,这在处理图像数据时会对你自己的神经网络进行这些变换。然后我们基本上拟合它并运行。我们重新报告时间间隔。这需要几个小时。通常情况下,你可能根本不想在CPU上尝试这个,除非是GPU。
我还没有尝试运行它,可能要等一天。我真的还没有在CPU上尝试过。感谢你观看这个视频,下一个视频中我们将看看openC。这个内容经常变化,所以请订阅频道,以便及时了解这个课程和其他主题。
还有人工智能。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P35:L6.4- 在 Keras 中使用自己的图像数据 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用课程。所以到目前为止,我们看到的大多数图像示例,比如 Menst 和 CFFAR,是在使用 CAs 提供的便捷方法加载数字。这确实使得代码变短,并且免去了自己加载这些图像的繁琐工作,但了解如何处理原始图像是很重要的。
原始的 JpeEgs 和 PGs 实际上可以导入到你自己的项目中。我们将在这个视频中学习如何做到这一点,了解我最新的 AI 课程和项目。点击旁边的铃铛订阅,以便接收到每个新视频的通知。现在,为了使用你自己的图像,我们首先来看一下使用便捷方法时的情况。
所以,如果你查看 Tensorflow Carra 的数据集,这基本上让你可以访问已经内置于 Cars 的大量数据集。这些数据集很容易获取,只需谷歌搜索 Tensorflowlow Carras 数据集,你将看到一整份列表,我认为不到 10 个,但接近 10 个不同的数据集已内置于 Cars 供你使用。我们将使用 C4R 10,并且我们也会使用 nuumpy 来帮助我们查看,但让我们先看看实际加载时的样子。
所以我们运行这个,如果你之前没有使用过这些数据,你可能会看到一个小下载条,它正在访问这些数据,因为这些数据并非全部内置于 Cars。它会下载到一个临时目录,但基本上你得到了这个低数据命令,它隐藏了所有正在发生的事情,在许多数据集中,Cars 实际上会为你拆分训练和测试,正如我们在这门课程之前的视频中所见,拆分训练和测试的原因是为了获得一致的训练和测试结果,因为这些数据集通常用于学术论文,你确实想将你的结果与前人进行比较。现在,CFR 10 方面并没有很多活跃的研究了,它几乎被用到了极致,并且他们在上面得到了非常好的结果,现代论文中你可能想看看更高级的东西。
当前的数据集及其内容。关于图像的有趣事情正在发生。我们将在下一部分讨论这个。所以如果我们现在查看这些数据的形状。X train,我们得到了 X train 和 Y train。这是你的预测变量。这是期望的输出 Y,测试数据也是类似的形状。
你需要将图像转化为的格式,以便实际使用。在Keras中,是一个不规则的张量。我称之为张量,因为它比矩阵更复杂。训练集中有50000行,每张图像为32乘32。这就是经典Windows和Mac系统上图标的大小,仅供你参考。
然后颜色深度为三。所以这些都是非常小的低分辨率图像,我们在前面的部分看过Resnet,这就是你需要将图像转化为的形式。所以你会将你的JPEG和PNG加载到内存中处理它们。
你会希望将它们调整到相同的大小,因为你需要有某种方式来重塑图像,以便它们都是相同的大小。在计算机视觉领域,这种情况非常常见。如果你想处理不同大小的图像,如果你要将它们提供给神经网络进行预测,你需要在预处理时将其调整为适当的形状。考虑到许多自动驾驶汽车和其他计算机视觉机器人,你将始终处理一致尺寸的图像。
因为你的视频流将通过某种摄像头传输,该摄像头将具有一致的分辨率。现在,如果你在编写一个网络应用程序,就像我们在课程后面看到的那样,并且你会接收到各种上传的图片。比如微软有一个相当著名的应用程序,可以告诉你你养的是什么品种的狗。
你需要将这些图像缩放到一致的大小,处理各种宽高比以及不同的尺寸。我们将看到,特别是在我们从Kaggle竞赛和其他图像数据库下载PNG和JPEG文件时,我们将如何做到这一点。
它们都是不同的大小。所以这是目标。你想将所有图像转换为基本上是X乘Y乘3乘颜色深度。这3,通常是3或1。有时你会看到4,但那是一个掩码,用来显示图像中需要剪切的部分。
但通常你不会将掩码或 alpha 通道发送给计算机视觉。让我们看看单个元素的样子。这有50000个。如果你查看其中的第一张图像,它将是32乘32乘3。但这就是它的样子。我不是很漂亮,不是形状。我可以查看它的形状。
它的值将是32323。你可以看到基本上这是很多行和列。所以这是单独的一行。然后在这一行里面。你有单独的颜色。这些是RGB值。这就是你拥有的三个颜色通道。这是红色、绿色和蓝色。它们的范围是0到255。这是你经常会看到的,将0到255的缩放应用于神经网络。
他们可以处理这个,但如果你将其缩放到0和1之间,你会得到更好的结果。这是相当流行的。更受欢迎的是负1到1,因为现在它围绕0居中。所以我们将看到如何做到这一点。现在这些数字,这里并不是所有的50000个元素,这只是其中一个。而且它没有显示M并不是be。那种情况发生在太多的时候。
这只是一个图像。我们需要做的是看看如何利用我们已有的一堆图像进行训练。我把这些放到了网上。其实我并没有把它们放在这里,它们之前就已经在维基百科上,所以基本上我们可以从 Google Coabab 或本地运行这些,如果你想使用自己的本地图像,始终会找到那些图像,通常你会这样做。我们将看到相关的例子。
在下一个模块中,当我们进入 GNs 时,目前我们将直接使用它们从互联网获取,这样方便,我们不必担心这些图像实际存放在哪里。所以我们会获取所有这些图像,我们最终会努力将它们转化为我们在上面看到的格式,即50000 x 32 x 32 x 3,因为这样就可以准备好输入到 Cars。Carass 已经准备好处理这个了。所以现在让我们看看我们这里有的东西。我有一个名为 make square 的函数。
就制作正方形而言,这几乎是你能做到的最原始的方法。看看任何图像。如果你想把它变成正方形,有几种方法可以做到。最简单的方法就是裁掉长的一边。所以如果某个东西不是正方形,意味着它要么更宽,要么更高,不管是更高的那一边。
如果它更宽,你就从右边裁剪掉一些。这几乎是你能做到的最原始的方式,但这给你提供了一个很好的起点。这是我在一些作业中比较喜欢的做法。所以你可能会看到这一点。我可能会要求你做一个更高级的正方形制作。
作业会准确描述这一点。但我们在这里要做的就是找出,是更高还是更宽。是有更多的行还是更多的列,然后我基本上会裁剪掉多余的部分,返回你需要处理的图像,这两个部分必须分开处理。更多的行。所以我基本上就是在调整这个数量。
我们有的额外空间,我正试图中心对齐抓取的部分,以免只从右边裁剪掉。我试图从两边裁剪。这是一种可以使用的技术。所以我们继续运行这个,但我们在这里下载这些 URL 的部分,其中我们有响应等于请求 URL,这样就能通过互联网获取它们。如果这些文件已经在你的硬盘上,你就不需要这个了。
你也不需要这个字节 I/O 部分,你需要的是这个。这将是一个通过互联网的流,将为你提取并实际加载它。如果你使用磁盘,仍然会有这个。首先,我们使其变成正方形,改变它的纵横比。
改变了最长的尺寸。接着我们会将其调整为我们指定的图像高度和宽度,并使用抗锯齿技术,这是一种图像大小调整技术,用于填充额外的值,平均边缘附近的值,使图像整体看起来更美观。然后我们将图像添加到训练数据列表中。现在。
重要的是,这个列表只是一个普通的 Python 列表。所以我们将所有这些不规则数组添加到 Python 列表中。这是不可行的。这几乎是 Python 列表和 nuy 张量的混合体。所以你想要。你想要这样做,以实际重新塑形,使其成为我们之前定义的图像高度和宽度,并且通道数将是三。
我们还这样做是为了将所有内容置于负一到一的范围内,并围绕零进行中心化。所以我们会运行这个。现在如果我们查看训练数据,它确实全部是 nuy。现在看起来非常像这样。不同的是,这里仅包含一个方括号。在这里的数组表示 nuy。请注意,这些值在零到 255 之间。
它都是不规则的。它是一个一、二、三、四维的张量。目前,这些值在负一到一之间。你有一个不规则的张量,一个 4D 数组,本质上准备好了。你可以在这个基础上进行训练。这就是你的 X,标签则包含在你的 Y 中,具体取决于你对图像的处理。我们会看到,涉及图像时。
你并不总是仅仅进行经典的分类和回归。而在下一个部分,当我们看到叫做 Yo 的东西时,你会发现我们会同时进行回归和分类的混合,这正是神经网络相比传统模型的美妙之处。现在,一旦你设置好这一切,并且有了你漂亮的 4D 矩阵。
你可能想要保存这个,因为处理所有这些图像并进行处理需要一些时间。相信我,当我们进入下一部分,处理 ganNs,并处理成千上万的图像时,你会将它们导入你的 Google Drive。
你希望一次性完成这些操作,而不是每次都要重复。这通常是你对某个内容进行序列化时所做的,序列化是将 Python 对象以二进制形式存储的标准方法,以便你能轻松回忆起来。然而,我们将以 nuy 的自定义格式保存它。因为这些。😊。这文件并不大,仅仅是几张图片,但相信我。
当我们进入GN和更大的训练数据时,你将会有一个多吉字节的文件,有时甚至更大。所以你会想把它保存在可以处理这么大文件的格式中。既然你在处理nuumpy,我们就将其存储为nuumpy文件和MPy。这很像pickle,只不过它是专门用于nuumpy。我们运行这个,看看它现在已被保存。
你在没有扩展名的情况下传递文件,它会把点My放上去。如果你放了一个MPy B,就不要使用nuy nuumpy。所以不要,你不想要两个这样的。现在我们可以处理自己的图像。这一点很重要,因为使用细分数字和C即使以细分方式也很无聊。你想在自己的图像上做这些事情。那时这东西真的会变得有趣。
只是为了提前窥视下一部分,你可以看到我在使用自己的图像。我们将在下一部分讨论这个。感谢观看这个视频。现在你已经看到如何加载Kiras包之外的图像。我们将在接下来的几个视频中使用这个进行更多示例。这个内容经常会改变。
所以订阅频道以保持对本课程和其他人工智能主题的最新信息。😊。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P36:L6.5- 使用YOLODarknet识别多个图像 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿。欢迎来到华盛顿大学的深度神经网络应用课程。在这段视频中,我们将讨论Darknet和Yolo。我不是指像互联网那样的暗网。我是指,暗网,像多个物体检测。你可能会看到我周围的所有这些框,因为系统能够检测各种事物。😊,我们将看看如何使用Tensorflow在Python中利用这项技术,了解我AI课程和项目的最新动态。
点击订阅并按旁边的铃铛以接收每个新视频的通知。好吧。你会注意到我在这次的视频中使用了Google协作布局。我们将利用GPU。所以让我们开始,确保你打开了我的第6节课。😊,Google Collaboratory。这在Github上。我在本视频描述的底部有一个指向Github存储库的链接。
我们将去运行时,改变运行时类型。我已经把它放进去了。但确保你有GPU。不要担心这个Python 3,6黄色。这是我本地环境中的。Google没有那个。所以你要Python 3。然后我们会保存它。让我们向下滚动到第5部分。
因为这就是我们所谈论的。我们将看看我如何拍摄你在这之前看到的视频,其中有所有的方框。😊。
但我们将开始,看看如何现在通过卷积神经网络识别多个图像。像我们几部分前看到的单个卷积神经网络可以识别多个图像。如果它足够大。它能够查看图像并标记这些。所以你会看到微波炉旁边有人。嘿,我是一个人。还有几瓶坐在我的窗台上。这是真的。这就是。
这是我的厨房。实际上,水槽开始为我做晚餐,而不是为狗。但它在那里想看看我在做什么。每当我们做饭时,它总是在附近。但这个图像正是用相同的方法训练的。😊。
我们在卷积神经网络中看到的技术。这是一种叫做Yolo的东西。我给你一个链接到论文。Yolo代表你只看一次。而这项技术的酷之处在于,它使用的是一个具有相当复杂输出层的单个卷积神经网络。所以这不仅仅是简单的分类,还有回归。
它确实向你发送了所有这些找到的图像。所以这就是卷积神经网络真正酷的地方。你可以让输出层发送几乎任何你想要的东西,实际上。你可以让它在这种情况下,发送多个边界矩形以及它认为每个矩形中的内容。
😊,在下一个模块中,我们将看看GANs,看看它甚至可以输出一张图像。输入到GAN的不是图像,而是一个像种子一样的数字。输出将是图像。所以卷积神经网络,输入可以是图像。输出也可以是图像。输入和输出都可以是图像或其中之一。
因此,我们将在这节课的多个模块中研究卷积神经网络,因为它们非常多面化。你可以将它们用于自然语言处理图像。现在,你也可以在直播中运行这个。所以这只是我妻子用手机拍的照片。😊。
这是,嗯,这也是用手机拍的。这并不是我用来录制这节课的正常相机。所以当我在视频中谈论这些时,我无法正确地讨论它正在分类或错误分类的某些内容,因为它是录制到视频中的。
我在这里的本地电脑上没有连接强大的GPU。我通常在云端做GPU以直播这种视频。如果你想直播这种视频,Titan V的GPU将非常合适。大约3000美元。所以我目前并不拥有这样的设备。
我想过这个,但大多数我做的事情并不是直播视频。所以我只是在云端做这个,我使用B100s,这些与那些相似。但每小时4美元,而不是一次性投资几千美元。这完全取决于你要做什么。如果我每天使用那个设备数小时。
做这个3是有意义的。如果你看一下,这确实显示出一些限制。注意它在我的书架上正在分类每一本书。😊。有趣的是,在我厨房的这个图像中。它没有,它分类为这里的一小部分东西。它正在分类成百上千的东西。
处理时间是一致的。你只需看一次,它并没有查看那些书籍中的每一本。我们稍后会看看这如何运作。但是你可以看到它正在分类电视监视器和其他东西。这里的黄色东西实际上是一个工具箱,但它一直认为它是一个遥控器或其他东西。它在视频中正确地分类了我的笔记本电脑,但并不总是正确分类。
它将我分类为两个人。我的头是一人,剩下的我是另一个人。我也站着这个。因为如果你看过我很多视频,希望你能去订阅,以便在我坐着时可以看到我通常介绍和总结视频的姿势。
它没有识别我。它只是识别了我所有的书。谁在乎呢?这太无聊了。我想让它识别我。并不是说我觉得被忽视。它还识别了我的椅子,这很好。其实就一把椅子。那么,让我们谈谈Yo。😊,现在,这正是多图像检测的最前沿技术。
你可以用这个做一些非常、非常酷的事情。我的意思是,假设我想在我家后面放一个狗门,而我只希望狗可以通过。我可以写一个非常简单的程序来实现。只要我在某个地方看到一只狗,它就会打开门。希望如此。
它不会把浣熊误判为狗。那么Yolo是如何工作的呢?这也是一个卷积神经网络,就像我们看到的那样。我们创建一个S乘S的网格。对此有几个标准尺寸。通常不会太大。通常在十几的范围内。它基本上会调整你的图像大小,或者在其上放置一个网格。
它运行卷积神经网络,并获得了很多这些方框。这些潜在的边界框被称为预测。但大多数都不够好。我们把它们扔掉。我们设定一个阈值,只保留高于这个相对确定的阈值的东西。
我们要实际展示吗?所以你可以调节它在这方面的敏感度。现在,这是一个卷积神经网络。所以我们需要看看这个。😊,它是如何工作的。输出层非常有趣。我之前展示的神经网络都是分类或回归。这是两者兼具。技术上,论文称之为回归。所以我想这算是回归,但。
我几乎将其视为分类的混合体,因为发生的事情是。基本上,很多边界框被返回。当我第一次看到Yolo时,这让我困惑。你会看到这里返回了一堆方框。没有那么多。神经网络的输出层是固定长度的。除非它们是生成型神经网络,否则不会改变长度。
但当我们进入自然语言处理时,我们会更深入地讨论。但这些在这方面不是生成型的。它们只是给你一组固定的输出神经元。输出神经元的数量是固定的。这是一个张量。我起初在想。它是如何给我一个可变的列表的。好吧,答案是。
更明显的是来自论文中的这个图。这是整体网格。这就是你展示的S乘S。它返回类似这样的东西。它返回大量的边界框。返回的边界框总数始终是固定的。因此,输出神经元的数量是固定的。只需扔掉那些它不太自信的较弱的。
在这里,你可以看到边界框的黑暗。所以真的。😊。
那是黑暗的,那是黑暗的。那是星星,那是黑暗的。所以狗与车。所以这些最终都是超过阈值并被考虑的标签。让我们看看输出层实际是什么样子,因为输入层及其以上的部分。这只是一个典型的卷积神经网络。它有卷积层。
最大池化层和密集层。就像你拥有的任何其他层一样。然而,输出神经元返回的是一堆边界框。每个边界框。这些是你输出层中的值,它们只是这六个值不断重复。
所以你有X坐标和Y坐标。这是这些边界框的中心。嗯。它们不是框,而是矩形,宽度和高度。因为这些不必相同。所以它们是围绕各种事物绘制的矩形。然后是标签。这是你可以得到很多标签的地方,因为你可能有成千上万的标签。
在这里,你可能只有几乎一百个。每个标签代表像“人”、“狗”、“房子”这样的东西。这基本上是这些标签的独热编码。所以你得到的是。
对于标签,无论哪个标签的值最高,这就是它实际选择的标签。所以“人”可能会在该标签中具有最高值。你也可以查看第二高的值,看看是否可以认为它是这个人的亚军。单靠该标签,并不能反映你所寻找的整体置信度。
你在看这个置信度。这个置信度是一个数字,指示它是否认为那里真的有东西。因此,所有这些其他框你都不会显示。你甚至不计算那些。因此,这就是你本质上得到的变量数量的值返回。你总是得到相同数量的边界矩形返回。
你基本上是抛弃了大多数标签。现在让我们看看实际的神经元数量。返回的是一个3D张量。所以这并不仅仅是一组简单的线性输出神经元。你可以这样想,它实际上是S乘以S。因此,无论那个网格有多大,比如说10乘以10。将会是100乘以B,B是每个网格单元可能的边界矩形数量。
你要使用的方程式基本上直接来自于论文。5来自于X、Y、宽度和高度的1、2、3、4,然后是置信度。所以一共是5。再加上我们拥有的标签数量。这样就是独热编码。而C是我们拥有的类别数量。所以你必须处理这个问题。
它只能为实际已知的类别进行分类。这样你就可以得到所有的边界矩形。你运行它。这就是全部。现在,看看卷积神经网络的实际样子。这是你输入的图像,大小为 4,4,8,论文使用的正是这个尺寸。
这是一个 7x7 的扫描卷积层,进入另一个卷积层。还有其他卷积层,及最大池化层,和我们之前看到的一样。这没有什么新鲜事。这里唯一的区别是我们有一个 7x7x30 的张量作为输出。这些是论文中的示例图像。他们甚至展示了一个错误分类的示例,这里他对从汽车上跳下来的人有问题。
嘿,他是一架飞机。不,他不是,他的行为很像飞机,但他并不是飞机。论文中也提到了这一点的某些局限性,比如如果有一群鸟在远处,它就无法识别,因为它在识别非常小的物体时有困难。
高密度的事物群体。如果我们之前看到的书籍要小得多,它们的表现就不会那么好。现在在 Python 中使用这个。我在这里给你一些链接。这是给 darknet 的。现在我也使用这个。这是它的 C 版本。我已经编译了它,并且基本上可以从命令行运行。
我还没有在 C 程序中使用它,但很多人已经使用过,它当然是可用的。我们将更多关注 darkflow。Darkflow 让你可以在 Python 中使用这个。我们不打算训练一个黄色网络。你可以。我们将继续安装 darkflow。现在你有选择了。
你可以在 Google Coabab 上执行此操作。这就是我要演示的,这样我们可以用 GP 运行。会快一点,主要是为了识别单独的图像。如果你想实际录制实时视频,那你真的需要在系统上有某种 GP。
使用单独的图像就可以。使用 CPU 没问题。处理单个图像大约需要 5 到 10 秒。我们将从 Google Col 运行 dark low Yolo。我将快速带你完成说明。这并不困难。我们需要一些文件,所以我们需要权重,因为我们不打算训练一个 Yolo。
我们将使用论文作者为我们准备的原始权重。这是在引入迁移学习的基础上,我们将稍后学习这一点,在这里我们可以使用那些由在高训练环境中进行训练的人生成的权重。
我们有许多 GP,并且可能花费了许多周来训练它们。因此,我们将能够利用这些权重并加载它们。这开始变得有趣。我们将在这个模块和下一个模块中都进行此操作。我们将从已经训练好的神经网络中受益。
我们并没有把它们发送到云端。我们实际上在我们的计算机上有这些权重,并且可以在需要时查看它们。所以你需要三个文件来运行这个,你需要把它们放在你的 Google Drive 中。你需要权重,Yolo 的权重。我们还需要配置文件。我们需要标签文件。现在,我有一些脚本可以在这里运行,帮助你轻松完成这个操作。
所以我们首先需要做的事情是。😊,安装 darkflow 和 GitHub。所以我们来做这个。我们正在重置所有运行时。我之前运行过这个,因为我测试过它。它仍然需要重新克隆。Google 删除了你放在这里的所有内容,除了你放在 Google Drive 的内容。所以请始终记住这一点。我们已经克隆了它。现在我们要进行特殊的 Pip 安装。
这将把 darkflow 安装到 Python 中。现在我在 Google Colab。每次我重新启动环境时,都必须执行这个操作。注意我给它指定了一个目录。那就是我们刚刚检查过的 darkflow 目录。这很方便。我运行它,我们现在正在进行 darkflow 的 Pip 安装。现在我们已经安装了 darkflow。
现在如果你在本地计算机上执行此操作,你需要基本上进行完全相同的步骤。但是你需要一些先决条件才能运行 darkflow。你需要安装 Python 和 OpenCV。因此,请确保你安装这些并了解如何操作。对你来说,使用 Google Colab 是更简单的方法,我将挂载我的驱动器。
这就是我如何在这里使我的 G Drive 可用。我正在运行这个以进行一些安全设置。我必须选择我希望成为谁。现在是我。😊。出于安全原因,我正在阻止所有这些。然后你复制并粘贴它给我的这个小令牌。回来 Google Colab,把它放到这里。现在我可以解锁这些命令。
这些是 Unix 命令。这可以让你免去拖放所有单个文件的麻烦。我将继续运行这个,所有的操作就是在我的 Google Drive 中创建一个名为 projects 的目录,然后在里面有 Yolo。
所以我通常在我的 Google Drive 中创建一个 projects 目录,所有这些我在 Colab 中需要的东西,我只需把它们放在这些不同的位置。因此,在 Yolo 中,我们有一个 bin 和一个配置目录,希望这一切都能正常工作,所有这些文件现在都已下载完毕。你将在本地运行,以下是来自作者网站的说明链接,关于如何做这件事。现在我们要运行这部分。
首先选择你想要的内容,所以我们需要切换到我们实际运行此程序的目录。如果你在本地驱动器上下载了这个,那么你需要根据你的路径来存储东西。但在这里,我将我的Diy改为我的Google Drive到黄色。然后选择选项。如果你使用GPU,那么你希望这一部分是GPU 1。否则,你就不需要。
所以我们将使用GPU来运行它。我们将从互联网上拉取一张图像。我们将使用cook JPg,那是我在厨房里做饭的样子。你早些时候看到过我和我的狗,让我们继续运行这个。现在它将加载来自预训练神经网络的权重。你看,它正在构建它。
我们看到了所有的卷积层,这是一种相当复杂的卷积神经网络,但这只是一个卷积神经网络,学习识别所有不同的图像类型。这真的是非常酷。我们在GPU模式下运行,它完成得非常非常快。现在,谷歌给你的GPU非常棒,节省了我们数小时的时间。
但这与下一个级别相比,简直不值一提,比如Titan V,😊。我还没有在那个高端上运行过。我可以在亚马逊的企业级V 100上做到这一点,但那会更快。而这正是你进行实时视频所需的,因为你需要能够做到每秒30帧左右。
如果你真的想要接近实时的范围。现在,让我们运行它,看看结果。现在,不是得到带有边界框和文本的图像,而是得到我们之前讨论的输出值。我们看到人,狗,猫,瓶子,微波炉,水槽,所有这些不同的东西,以及置信度。然后是坐标和大小。
所以我们基本上看到左上角和右下角。它将中心、宽度和高度转换为边界坐标。这很好,你可以在自己的程序中用这个来检测图像中的各种事物。😊。
感谢观看这个视频,在下一个视频中我们将开始研究GAN神经网络。此内容经常变化,因此请订阅频道以保持更新,了解本课程及人工智能的其他主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P37:L7.1- 用于图像和数据生成的生成对抗神经网络(GAN)简介 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeffhein。欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将看一下GANs,即称为生成对抗神经网络的成对神经网络。你有一个生成图像的神经网络,另一个神经网络则试图判断这些图像是假的还是现实的。
并且它不一定非得是图像,实际上可以是任何类型的数据。在本课程中,我们将看到几种数据类型,想要获取关于我的AI课程和项目的最新信息,请点击订阅并按下旁边的铃铛,以便接收到每个新视频的通知。那么我们来谈谈GganNs。
GAN是生成对抗神经网络的缩写。这实际上是两个神经网络共同工作,以生成一个高度逼真的图像或其他类型的数据。所以你在这里看到的这个人是完全虚假的,他们并不存在,是由一个学习了许多数据的GAN生成的。
许多,许多人脸。
如果你想玩玩这个技术,可以访问这个网址 doesnotexist.com。这是我用来生成这个的网页。在本课程的后面,我会告诉你如何使用这些人所使用的完全相同的技术,以及如何完全使用自己的计算机或谷歌Colab来生成。你确实需要一个GPU来运行stylegan,除非你对它进行一些修改。让我们稍微谈一下如何识别这些fakegan图像,如果你看这个人,首先最明显的事情总是要看背景。
看起来有点超现实,如果你看其中一张图像的背景,乍一看似乎是现实的,但如果你仔细检查,就像梦一样,这里并不真实,也许那是一种大理石背景,她站在前面,另外一边也有一种从一侧到另一侧的强烈变化,所以这也是值得注意的地方。
看一下他们的衣服,关注肩部的位置,她的肩膀在哪里?并不是完全对齐,这通常也是你在这些gan中看到的头部肖像,从脖子到头部,因为他们不想让衣服过于复杂,因为那对于G来说要处理起来要困难得多。
并不是说一些较新的算法没有做到这一点。我见过一些G现在可以做全身照。但让我们刷新一下,看看其他几张面孔,因为这确实是G特别著名的地方。现在,这张背景是比较单一的颜色,经过一些Photoshop处理,你可以去掉G的背景。
😊,并替换成不同的背景。这更涉及到图像处理技能。但你可以看到这些头发与背景融合在一起。如果某人的Photoshop技巧不太好,他们会把那部分剪掉,头发看起来像是有额外的丝线延伸到背景中。
我们还会讨论另一件事,耳朵通常不像你预期的那样对称,尤其是如果它们有耳环。看看我能否找到一个带耳环的人。通常两边的耳环会完全不同,所以让我们看看这项技术实际上是什么。生成对抗网络是由伊恩·古德费洛在2014年引入的,这项技术确实在深度学习中引起了轰动。2014年的第一篇论文生成了一些相对基本的面孔,包括卷积神经网络和不使用卷积神经网络的情况,这远远超出了仅生成数字图像的范畴。
伊恩·古德费洛最初处理的多伦多面孔数据集中的相对简单的面孔,他还从CR数据集中生成了图像和照片。你会看到一些超现实的、幽灵般的狗、猫、青蛙等图像,这些图像的生成方式实际上是。
生成,意味着它生成某种东西,生成模型通常使用某种随机输入,并在输出中生成某种东西。对抗意味着有对抗者。所以这意味着你需要至少两个东西在相互对抗。
所以有两个神经网络在一起工作,但又互相对抗。一个是判别器,另一个是生成器。判别器学习识别假数据,因此它学习识别假面孔。另一方面,生成器学习生成能够欺骗判别器的数据。
这两个模型在某种程度上有一种军备竞赛或博弈,因为它们试图变得越来越好。判别器试图变得越来越擅长检测生成器的欺骗尝试,而生成器则试图变得越来越擅长欺骗判别器。
现在,在所有这些训练的最后,你通常会扔掉判别器或生成器。通常是判别器。所以你会得到一个非常擅长生成面孔或其他你希望神经网络创建的假数据的生成器。
然后判别器对你来说实际上并没有太大的用处。稍后我们会看到,当我们处理半监督训练时,这是一种能够在可能非常大的数据集上训练神经网络的方法,而你只在其中少量数据上有标签或预期结果。
当你有这样一个数据集时,你可以使用半监督训练,这样它就可以从标记数据和未标记数据中学习。在这种情况下,鉴别器是你保留的部分,而生成器则被丢弃。我们将在这个模块的后面部分4中处理这个问题,实际上会涵盖半监督学习,以及如何在非图像数据上使用它。
你通常会看到这一点用于生成面孔,但这并不一定是唯一的情况。在这个模块中,我们将逐步介绍几个部分。这第一部分只是给你提供了技术的概述,讨论这些是如何训练的,以及我们如何利用GANs进行图像等的处理,以及它们是如何工作的。我们还将看到如何从头开始构建这些模型。
因此,我们将学习如何构建鉴别器,如何构建生成器,并输入这些随机值来创建面孔。你需要一个GPU,因为这个训练相对密集。你可以使用Google Colab来训练一些模糊的面孔。然后随着我们在这个模块中的进展,你还将看到如何使用NVIDIA风格的GAN,这就是我在本视频早些时候查看的那个网站上生成面孔的技术,接下来我们还将看到如何将GAN用于非图像数据。
只是生成一些随机的额外数据,以补充你可能已经拥有的数据。最后,我们将看看GAN研究中的一些新方向,因为这个领域确实非常火热。我认为GANs是当前深度学习中最有趣的技术之一,或者至少它们正在获得大量论文和其他关注。😊
感谢观看这个视频。在下一个视频中,我们将看看如何在汽车中实际实现。这部分内容经常更新。所以请订阅频道,以便及时了解该课程及其他人工智能主题。😊
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P38:L7.2- 在Keras/Tensorflow2.0中使用生成对抗网络(GAN)生成人脸 - ShowMeAI - BV15f4y1w7b8
生成对抗神经网络,这些你看到的面孔都不真实。它们是由一个G创建的。这种类型的神经网络可以用于创建不真实的数据。现在,我是真实的,至少我这么认为。但这些神经网络可以用来创建这种面孔。现在,我将开始,不向你展示如何创建这些由Nvidia软件为你生成的高分辨率面孔。
这是stylegan,我们将在下一个视频中看到。但在这个视频中,我们将实际从头开始构建这种东西。你将创建更像这样的面孔,但这只是个开始。这是你获得代码并运行以生成这种数据的垫脚石。嗨。
我叫Jeff Heaton。欢迎来到与华盛顿大学合作的深度神经网络应用,查看我关于Cagel神经网络和其他AI主题的所有视频。点击订阅按钮和旁边的铃铛,选择全部,以便接收到每个新视频的通知。
我确实提供了完整的源代码。我建议你像我在我的Github链接中那样在Google Coab中打开它。我这里有一个指向这个Github代码库的链接,里面包含我所有的代码。我刚刚将我的G代码升级到Tensorflow 2.0。因此,这应该能够很好地与最新版本的Tensorflow通过Ks配合使用。
在我们进入代码之前,先从概念上看一下我们想要做的事情。对于一个G,你有两个神经网络,而你以完全不同的方式训练这两个神经网络。理解这种区别很重要,如果你真的想理解这段代码是如何工作的。
这实际上是这个视频的目标,向你展示如何从头开始创建自己的GN。😊。
两个神经网络。其实并没有那么复杂。如果你逐步来看。你有两个神经网络,一个是鉴别器,另一个是生成器。这两个神经网络的输入和输出是完全不同的。这就是我在看到神经网络时,如何思考学习新技术的方式。
我想知道输入是什么。我想知道输出是什么,以便我能真正了解这个东西在鉴别器中实际上在做什么。这个神经网络在这个世界上只有一个工作。它用来判断输入是真实的还是不真实的。这里有一张图像进入它。我把这个当作真实的图像来使用,但实际上这是我用stylega创建的,以便我不在视频中使用任何随机的面孔。
所以图像进入神经网络。现在这就是神经网络与其他类型模型相比的精彩之处。输入几乎可以是任何东西,输出几乎可以是任何东西。所以这里输入是图像,这是一个3D张量。所以它是高度、宽度和颜色通道。输出是一个单一的数字。这是一个预测。所以0。
97意味着判别器在说,这实际上有97%的概率是一个真实的面孔。只要把它当作一个真实的面孔,而不是从我个人的矩阵中来的东西。好吧,现在生成器,这部分在你构建面孔生成神经网络或其他类型的生成神经网络时会非常有用。通常你在训练完成后会扔掉判别器。
但判别器确实是有用的,我们将在后面的后续视频中看到,当你处理半监督学习时,可能你并没有所有内容的标签。所以这两个都可以有用,但如果你只想要一个面孔生成器、汽车生成器、猫或牛油果生成器。
这就是你真正需要的,生成任何东西在这里基本上。😊,在随机种子中。所以随机种子。你可能在像Minecraft这样的电子游戏中见过这些,我知道这样做。你输入一个随机种子,基本上会为你创建一个完整的世界。这就是这个概念。因此,在Minecraft中,并不是说某些种子是坏的,而某些种子是好的。
它们都会给你随机的世界。每一个随机种子都会给你一个随机的面孔。由于神经网络被训练出来的。所以你要记住的就是,这不仅仅是一个数字。这是一个向量。所以它是一个数字的数组。通常是100或者更高维度的这些数字的数组。你也可以做一些非常有趣的实验,改变向量中的某个数字,看看向量的不同部分实际上是用于什么,在stylegan中你可以做一些这样的实验,你可以让头发变长。
你可以改变眼睛的颜色,而不改变其他所有东西,但这更多是针对下一个视频,我们讨论stylegan。这是从零开始创建自己的东西。所以你给它这个你生成的随机种子。😊然后你给它,它会给你一个输出图像。现在。
我在其他视频中收到的一个问题是这些数字应该在什么范围内。好吧。没关系,但它们必须在你训练时相同的范围内。所以当你训练它时,你给它一些随机的范围和分布。确保保持一致。不要在范围是0到100的数字上训练。
然后突然间放入一百万,这样做是不会好的。所以这就是这两个神经网络在其一般使用中的样子。诀窍是我们如何训练这些。这是对抗神经网络。所以它们是互相对抗的。这是一个生成式神经网络。
这只是意味着它在生成东西。它在生成面孔。首先,让我们看看我们如何训练生成器,因为这比训练判别器要简单一些。训练这两个的重要性在于,注意到我展示的权重是静态的。两个神经网络都需要到位,才能训练任意一个。
但是你不能同时更新这两个的权重,这样根本行不通,这里我们是在训练生成器。所以如果在训练生成器的同时允许修改判别器的权重,那就是作弊。生成器基本上是在不断优化它的权重,以便能够欺骗判别器。整体目标是在训练过程中欺骗生成器。
所以如果我们允许对这两个进行权重训练,那么反向传播会说,好的,让我们移动权重,使生成器变得更好。哦,让我们影响判别器,使得权重在欺骗判别器的结果上也更好,你不想修改判别器来进行欺骗。这就像是在跑道上训练一名运动员,让他变得越来越好。
但又看到其他运动员,有一天他会对抗那个人,并且会绊倒那家伙。所以这些运动员中只能有一个在训练,否则你最终会得到较弱的结果。你需要有竞争在进行。因此,当你进行训练时,像我们在本课程中看到的每个神经网络一样,你有X和Y。
X是输入到神经网络中以生成预期的Y。你的神经网络实际给你的被称为Y帽。它是带有小三角的Y。因此在这种情况下,X是随机种子。我们将创建一堆随机种子。在这个例子中,我只是展示三个。
但我们会将这些输入到生成器中。生成器会创建三个随机的面孔。现在生成器可能起初不太好,但它会越来越好。判别器也会越来越好,它会说,啊,这些面孔,它们不是真的。判别器会接受这些输入,并给出预测。它会说。
好的,这张脸45%。这张脸55%。最后那张,看起来好一点,65%。这些是y帽。这些是在训练过程中,判别器此时的实际预测。现在,y是我们真正想要的。这是预期的输出。这是通常来自你的训练数据的。但看看这里有趣的地方。
这是训练生成器。我们没有使用任何训练数据。我们的训练数据是一堆你下载的真实面孔。我给你一些示例网址,你可以去获取这些真实的面孔。但在训练生成器时,我们根本不使用任何真实面孔。
生成器从未见过真实面孔。它只是慢慢地学习,慢慢地生成更好的面孔,或者在欺骗鉴别器方面变得更好。所以这可能看起来有点奇怪。Ys。这些y通常来自训练数据。Ys始终为1。
这是完全不平衡的数据。这是最糟糕的不平衡数据。你没有任何零。因此你并没有在任何虚假案例上训练生成器。但它有这个鉴别器需要去欺骗。如果没有这个,生成器就会学习到“哦,你总是想要1”。好的,那我就总是给你1。
但是生成器的输出被直接输入到鉴别器进行训练循环。这是一个比我们之前遇到的更复杂的神经网络。你几乎可以将我用鼠标圈住的整个区域视为目标函数。目标是欺骗鉴别器。所以这并不重要,它是不平衡的。
这并不是真正的不平衡。这只是因为我们希望它总是尽可能接近1。生成器能做到这一点的唯一方法是生成更好更好的图像来欺骗鉴别器。因此你会在代码中看到,当我们稍后查看时,我们实际上是在为目标函数创建损失函数。
数据集我们选择无论批量大小,无论我们当前步骤训练什么。这些数量由配置参数设置。我们生成那么多随机种子,生成随机面孔。然后将这些发送给鉴别器。
获取Y帽,计算反向传播梯度,应用它,然后你应用链式法则。所以你对一步进行这样的操作。会有多个步骤。所以无论你的批量大小是什么,那就是一步。然后我们做足够多的这些,以覆盖整个训练集,直到整个周期。所以这里需要注意的事情可能看起来有点奇怪。😊
生成器从未见过训练集,Ys始终为1,因为我们渴望完美。1.0。实际上我们无法训练生成器,我们不希望生成器生成零。这就是为什么训练集看起来不平衡,但实际上这一整块在一起工作。
生成器是真正的损失函数。好的,让我们看看鉴别器是如何被训练的,这里有更多的内容,但不多。注意这里是平衡的。我们有零和一。这就是一点不同。我们会深入讨论这一点。还要注意,训练数据实际上在这里被使用。这三张图像。再次。
这些不是现实中的人,但假装它们是。我不想为了我的图表支付使用真实人物的许可权,Nvidia的StyleGAN已经足够了。这些是由我的生成器生成的。这就是X和Y在这里的样子。首先,我们需要生成足够的假图像以填充批处理大小。
然后我们需要从训练集中放入足够的真实图像,以填充该步骤大小。因此,对于批处理来说,真正的图像和假图像各占一半是完美的。现在我们有这些假图像和真实图像。这六个现在会更大,以适应小批处理,不会大很多。进入鉴别器,鉴别器为这些概率进行选择。
随着鉴别器变得更好,你会看到生成的概率越来越低,而另一个的概率越来越高。但这时你无法真正查看这两个损失。我编写的程序显示生成器和鉴别器的损失,这本质上是一场军备竞赛;一个变得更好,另一个也会变得更好。
你会看到这两个值都保持在大约0.5左右,如果它们确实是相互增长的。理想的情况是,如果生成器能够如此有效地生成这些,以至于鉴别器根本无法分辨,它的结果将是大约5050。
所以这将是理想的情况。在这种情况下,X是所有这些图像拼接在一起的真实和假图像。Y hat将是分配给每个图像的概率,而实际的y将是我们知道不是现实的图像的假值,以及对于那些实际上是现实的图像的真值,这就是该技术的训练方法,可以用于几乎任何事情。
你创建一个神经网络,输入种子并基于这些种子生成随机数据。如果处理图像,使用卷积神经网络是有帮助的;而对于时间序列,可能需要使用LSTM或CNN,具体取决于你想生成什么。
然后你使用你的训练数据,即真实数据的示例,与鉴别器进行共同训练,逐渐地,神经网络学会生成这些图像,更好的是,数据中某些东西的分布将与原始数据匹配。例如,它会学习到,如果某人的脸部有特定的肤色。
另一半可能不会有不同的肤色。就像,如果我们提供人口数据,它会学习到,随着人们变老,他们可能会有不同于年轻人的名字,因为不同的命名风格变化不同,或健康特征可能不同。
让我们看看代码,看看它是如何运行的。这些是损失函数,在这里我们可以看到我们使用交叉熵进行训练,因为主要是 logistic。这里的判别器损失我们创建了真实和虚假的样本,就像我在图表中展示的那样。现在,我们使用的是一和零。然后总损失将是这两个加在一起,因为你必须在真实样本上表现良好。
所以你必须在虚假样本上表现良好。这就是一切的要点。我们将真实和虚假的一与零相加,这将是你的损失。训练将尝试最小化这个损失。现在,生成器的损失更简单。它只是交叉熵。注意我们只在一上进行,因为正如我所说,这是不平衡的。
但没关系,效果很好。我们训练的是希望在虚假输出上得到一。这个过程是反向的。这些是虚假的,但这些是一,但这就是我们所要的。😊
我们的目标是欺骗判别器。我们在这两个网络上都使用 Adam 优化器。现在,我在之前的版本中得到了很多问题,人们试图提高分辨率。当你提高这些的分辨率或进行其他更改时,你将不得不重新调整。我主要针对我在代码中上方的符号常量所指示的不同分辨率进行了调整。
但如果你提高分辨率,特别是,你可能需要将这些学习率调整得更小。这是单个训练步骤的样子,我想向你展示我们在这里如何训练,因为这与我们之前训练的神经网络有很大不同。我们经过这些额外步骤并直接处理梯度,是因为我们不想修改错误神经网络的权重。
在这两个训练操作中,我们有两个神经网络在发挥作用。我们完全分开训练这两个网络,但我们不希望交叉。我们只希望一次修改一个神经网络的权重。为此我们使用梯度带。在课堂会议中我谈到过这个问题。
但这本质上就是 Tensorflow 如何进行自动微分。所以它为你的神经网络计算导数,这个过程复杂无比,最终你会使其变得如此。我还有其他视频讨论这个话题。比如,如何创建导数,以及我会在这个视频的描述中提供该视频的链接。
但这基本上展示了你如何做到这一点。所以我们正在创建两个梯度带。之所以称其为带,是因为它几乎像是在记录所有通过的数学函数,然后向后展开以找出导数是什么。
然后我们基本上创建,处理鉴别器。鉴别器有两个方面。所以它有真实输出和你提供的虚假输出。所以我们需要知道真实图像的输出是什么。我们需要知道虚假图像的输出是什么,然后这让我们能够为生成器计算损失。
生成器因为只处理虚假。生成器无法生成真实图像。它只能生成虚假图像。我们在此计算损失。我们为鉴别器的两种输出类型计算损失,因为它看到了这两种类型。我们计算生成器的梯度。我们计算鉴别器的梯度,以便不交叉这些,然后我们应用梯度。
这本质上是训练的一个步骤。我们变得更加手动。我们不让TensorFlow和Keras为我们应用梯度。实际上我们是在自己做这件事。这有点幕后揭秘,展示了如何根据这些应用梯度来修改权重。这就是正在发生的事情。
然后训练相对简单。我们创建了一些固定种子。这让我们能够跟踪相同的面孔。你可以看到这个视频在播放。这个视频展示了这些面孔在实际训练中是如何演变的。所以我创建了这些固定种子,以便你看到的这些演变图像是一致的。
否则,我们只会看到不同面孔的随机混乱。但这展示了个别种子是如何随时间演变的。我们经历了请求的epoch数量。我们记录了在一个epoch上花费的时间。确实使用GPU,使用Google Colab来做这件事。如果你在本地计算机上没有GPU。
它运行得更快。然后我们。😊。
对每个epoch进行循环。我们遍历之前划分的每个批次。我们将图像划分为批次,因为每个epoch是覆盖整个训练集的完整批次集合。我们计算生成器和鉴别器的损失,并在此过程中持续显示。
所以你可以看到这里的每个损失。这些不是准确率损失。我之前提到过,你可能希望在这些上达到50对50,这更多的是你看到的对数损失,但如果你想的话,也可以计算准确率损失。
但是你将优化日志损失,日志损失和交叉熵本质上是相同的范围。这个过程在这里进行。你实际上并不能让这两个完全一致,这就是我之前所说的。你最终会得到像这样的面孔,这实在是太令人惊讶了。训练一个从未见过训练集的神经网络,实际上能够创造出这种程度的逼真面孔。要真正调整并获得正确的面孔,这里面有很多步骤。我有一些相关论文链接,如果你真的非常想要微调并深入研究创建逼真GAN,肯定需要购买一些云计算时间,以便获得足够的处理能力,或者你可以简单地引入谷歌的StyleGAN权重,抱歉,是NVIDIA的StyleGAN权重,这样你就可以转移,并突然拥有一个经过高端训练的神经网络,能够生成非常逼真的面孔。未来我可能会做一个关于如何从零开始构建高分辨率GAN的视频,这将超出界限。
我们的课程将探讨什么。如果你对此感兴趣,可以将其视为一个附加视频。请一定点赞,我会关注这些,以了解你们的兴趣。感谢观看这个视频,在下一个视频中,我们将看看如何使用迁移学习,利用NVIDIA的StyleGAN软件,将这些权重立即转移到你的神经网络中,以便你能够创建如这些一样非常逼真的面孔。
😊感谢观看视频。如果你想看到更多内容,请订阅我的频道。非常感谢。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P39:L7.3- 使用NVIDIAStyleGAN2- ADAPyTorch和Python3生成人脸 - ShowMeAI - BV15f4y1w7b8
欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看看如何使用NviDdia stylegan 2 AD for Ptorrch来获取一些非常高质量的G面孔图像。现在,以前我们看到可以使用我们自己定制的神经网络生成GN,但面孔看起来并不是特别好。要真正获得高质量的面孔,如stylegan所示,需要大量的计算能力和聪明的算法。
我们将要查看Stgan2 AD Ptorrch,这确实是该领域最新的技术。
🎼。好的,我们来看看代码。这是描述中有链接的模块。我在这里提到一下,这个模块需要pytorch。因此,我教你的这门课程大部分是在Tensorflow中进行的。至少在录制这个视频时,有两个部分我确实使用了pytorrch。
这是针对强化学习以及stylegan的。这主要是因为这两个非常重要的库,在强化学习的情况下是stylegan。稳定基线已经切换到Pytorch,实际上神经网络几乎在你所做的一切之下,因此你几乎不会注意到它。我在这门课程中添加了更多Pytorch组件作为可选方向,以便你能看到一些与Pytorch相同的技术,Pytorch正在获得很多势头,特别是在研究领域。
这是一种非常常用的技术,是实现深度学习的框架,所有的基本原理都是相同的,即使是我在NviIDdia切换到Pytorch之前用旧版本stylegan创建的pickle文件,这些pickle文件。
保存的神经网络可以直接加载到Pytorch中。因此,这些技术的基本原理在这些之间都是相同的。现在你会看到,使用stylegan2 AD可以生成所有这些非常高质量的面孔,这些都不是现实中的人,它们是通过stylegan to ADA生成的,顺便说一下。
结尾的AD代表增强,你在这里可以看到。可能在原始版本中只有一张猫的图片,但随着训练,他们提高了增强发生的概率,增强是计算机视觉领域的一项重大突破,它通过旋转和其他变形来扩增图像,以便在训练这些GS时拥有额外的训练数据,我会向你展示一些我在这门课上从头训练的ganNs,我们主要讨论的是从已经训练好的网络生成你的owngans。
你需要高端GPU,我的意思是你可以用Colab,但Colab Pro真的需要很多计算资源。我生成的大部分图像都是在我让其运行四天的高端GPU上生成的。但在这里你可以看到这些图像,它们看起来都非常逼真,不过有些东西会让你意识到你看到的不是现实的图像。
起初,这些看起来非常非常逼真。但如果你看背景,通常是一个明显的迹象,表明你看到的是生成的图像。背景有点异想天开,有点神秘。你不太确定自己在看什么。还有。
非脸部的东西看起来不会那么好,比如耳环。耳环的表现很差。注意她的耳环,很少会出现对称的耳环。此外,衣服,我的意思是,那里可能有一个按钮,我承认。我不是总能让我的衣服整洁得体,如果你看过我的视频的话。
但领子对我来说通常会有点凌乱。那看起来完全正常。我想它无法分辨一个脸和两个脸之间的区别。因此,尽管NVIDIA在策划训练数据和支付人们去去除某些东西方面做得很好,但其中一些却有多个面孔。你可以看到,这个家伙在这里有一个双胞胎。
而且它极度扭曲。类似地,手。她把手移到了画面中,看起来并不好。很难判断她的帽子。我是说,帽子可能会非常奇怪,尤其是在高端时尚中。但通常帽子会和头发融为一体,就像你在这里看到的那样,不真实。而她的脖子真的,真的很细。看看这些,你可以看到另一件事。
如果我要制作一个视频,展示各种随机面孔。你会注意到他们的眼睛总是在完全相同的位置。我的意思是,两个眼睛。现在,他们的脸和头可以稍微移动,但眼睛却固定在这里。这是因为NVIDIA训练这些模型的方式的一个特性,他们使用特征检测器来检测眼睛的位置进行裁剪,因此他们围绕眼睛居中每张图片,因为你知道人们会处于各种奇怪的位置,这些图片都来自Flickr的训练数据。所以这是你在处理这些类型的图像时会注意到的一些事情。现在,我想向你展示如何生成一些这样的图像,所以我将去Colab打开这个,因为你需要有GPU才能运行这个。
现在,你可能可以在没有GPU的情况下很好地运行这个训练,但生成时可能会很快。但这是NVIDdia的软件,所以他们假设你有一个GPU,这就是它的工作方式,尤其是Pytorrch,你需要为GPU和非GPU以不同方式编程,因此你看到的很多Pytorrch代码。
仅仅因为原始研究人员以那种方式编程,所以需要一个GPU。实际上我需要更新一下,我会去掉这一点。我们实际上并没有使用Tensorflowlow 1。x。这是NviIDdia升级之前旧版本的一个问题,他们使用了非常旧的Tensorflowlow版本。但现在他们使用的是最新的hightorrch,至少在录制这段视频时是这样。
所以我会继续运行这个,我相信我自己,我创建了这个笔记本。我将这样做,以便我可以访问我的G驱动器。你可能也想这样做,因为如果你生成了一些图像,你可能想保存它们。所以我把它放到那里,这并不是安全漏洞,我让你看到那段代码。
你只需要这样做就可以真正安装它。你需要克隆它。Piytorrch在collab中默认安装。你还需要ninja。Ninja是NviDIdia为此使用的Pytorrch添加功能。如果你查看stug into8A Ptorch,你会看到这里的最新版本。
我们刚刚将其克隆到我们的内容中,coabab是你存储所有临时内容的地方。一旦你退出coab,这些内容就会被清除。所以要注意这一点,这就是为什么我们每次都需要重新获取它。现在我将生成一些图像。我们将使用NviDdia的预训练人脸代码生成6600到25的种子。我稍后会解释这一点。现在让我们继续运行这个。
这些种子只是随机数种子,会使随机数生成一致的随机数字。再次说明,实际工作方式是你是从一个512数字向量生成图像,而那个512数字向量中的每一个数字都生成图像的一部分。所以如果你稍微改变其中一个数字,它会稍微改变图像。
这就是如何制作这种过渡图像和视频的方法,实际上你在这里观看的这些视频,在我进行这个部分时,我将向你展示如何创建你自己的那种视频。现在,这需要一些时间来安装所需的一切。
现在有两个Nvi使用的内核来加速这个过程。实际上,由于他们有自定义内核,这在CPU上是无法工作的。所以我收回之前说的话,你必须重新编码这些内核,那样可不有趣。所以这里有生成的图像,它们现在保存在我的内容结果中,如果我想的话,我可以基本上将它们复制到我的G驱动器。
我会向你展示另一种获取这些图像的方法。所以如果你查看,可以看到它们在那里。现在如果我们运行这个部分,如果你在这里得到这个错误,你会看到基本上是stylegan 2。不是一个目录,这仅仅意味着你没有在你的G驱动器上创建文件夹。我刚刚纠正了这个。所以如果我运行这个。现在它们被复制过来了。所以如果我去我的G驱动器。
你会看到我有一个项目stylegan 2,稍微刷新一下。你应该能看到生成的图像,它们都在这里。所以你可以点击这些,单独下载它们。这些是stylegan生成的图像。现在,我将运行这段代码,它基本上只是设置一些代码,以便我们可以将这些种子转换为实际的向量,因为我们想修改那512个数字向量。
做我们将在这里做的一些事情。这只是一个快速的函数来显示图像,这是我写的一个函数,它使用NviDdia的代码来实际生成图像。现在,你会看到的一些事情。😊。
在这里你还会看到我们也在处理标签。我在这个视频中不会真正深入标签。我当然可以做一个关于这个的视频,通常你会有你使用的GN,而我们在这里使用的是所有预训练的ganNs,必须已经为标签进行过训练。所以例如,假设你在小狗和小猫的图片上训练了你的gan。
如果你不在那里放标签,它会表现得相当不错,它会给你猫,会给你狗,也会给你看起来有点像狗的猫,反之亦然。你可以给它打标签,这样你就告诉它是什么类别,然后你可以在生成时请求生成更像猫或狗的东西。
实际上,他们在NviDdia的stylegan页面上有一个为此训练的模型,它从C图像集中生成非常低分辨率的图像,如果我没记错的话。是的,CR 10的那个,如果你用过这些,它们是10个。这些是32乘32的图像,早期在机器学习中使用的10种不同类型的图像数据集。所以如果你查看CR,我忘了CR的10个类别是什么。飞机,汽车。
鸟、猫、鹿、狗,这个数据集混合了这10个类别,为了获得最佳结果。你创建了一个标记的G,然后可以选择想要生成的类别。否则,Gans在没有区分不同事物的标记时效果不佳。我会给你展示一个广泛训练的GN示例,等我们讲到那时。
你可以传入一个截断的Pi变体,这将改变你所得到的质量。你也可以引入噪声。我保持它恒定。如果你引入噪声,你会看到头发和其他小东西会改变一些小细节,所以它不会变成完全不同的人,但看起来几乎就像头发在风中飘动。如果你将这个设置为随机而不是恒定,然后再调整类索引。
我实际上并不在这个课程中使用它,所以我不会有这个。你运行这个,然后在这里选择哪个预训练的模型。我将使用fishgan。这是我自己的一个。我训练了这个模型,使用Flicker获取了一堆鱼的图像,这基本上就是向你展示如何加载一个预训练的gan。这只是一个pickle文件。我实际上是在旧的Tensorflow版本上训练的。
所以它展示了这些模型的兼容性,我将从1000到1003生成随机鱼。这里有三条随机鱼。你可以看到它们看起来真的很不错。如果你查看不同的样本,有些确实不如其他的好。这条鱼这里有一个眼睛,还有一个很长的嘴巴,而这条没有眼睛。
这个鱼有一个眼睛,但有一种不寻常的鼻子,不过它们看起来,真的很像鱼。😊 如果你再放入更多的种子,你可以生成更多的鱼。你会发现这些鱼看起来真的很不错。这条鱼看起来相当不错。
那有点抽象,现在你可以改变潜在向量。那个512数字的潜在向量实际上创建了这些图像。所以我。😊 我将使用F F HQ,所以我将使用真实的面孔。我将运行我写的这段代码。这段代码的作用是加载。
面孔,所以我现在可以使用它。我将进行1000、1003和1001之间的过渡。让我运行这个,以便它可以进行。这样做是我使用100步在1000、1003和1001之间进行过渡,所以这些单独的种子。如果你从种子1000过渡到1001,那将会是一个完全不同样子的人。
如果你拿到那个由512个数字组成的种子生成的大向量,那么你将会得到更渐进的结果。现在我正在为这些人生成图像。我正在从1000过渡到1003,再回到1001。你可以看到生成这些图像需要一些时间。
这段话生成了一整堆帧,当我逐渐从一个向量偏移到另一个向量时。你可以看到我基本上得到了我的 vector1 和 vector2。我采用这两个向量的差异,按线性代数的方式,将差值除以步数。
这是我每次使用的值,作为我的步数。所以我添加了那个步向量。它慢慢地加到原始向量上,最终到达第二个向量,差不多完成了。让我们快进一下。好了,这部分完成了。然后我使用一个叫做 FF Mpeg 的工具将所有这些帧转换回视频,现在我们可以下载这个视频。
它正在准备视频,我会打开视频,你可以看到过渡。我基本上是在过渡这些我选择的关键图像,你能实时看到那些人的转换。现在你可以训练你自己的 GAN。这些是我训练的一些 GAN,其中有一个是鱼 GAN。我也训练了一个关于 Minecraft 的,科学幻想图片。
然后我想尝试一些非常疯狂的事情。我拿了一些随机的圣诞假期视频。我的意思是,那里有灯光,有圣诞树,还有各种各样的圣诞老人。因为没有什么特别的,所以 GNs 在这方面做得不是很好,这导致了一些非常狂野的、类似于《圣诞前夜》的图像。如果你想生成自己的 Minecraft 图像或其他东西,我给你所有的预训练模型的链接。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P4:L1.3- Python 列表、字典、集合和 JSON - ShowMeAI - BV15f4y1w7b8
嗨,我是 Jeff Heaton,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将更深入地研究 Python 编程语言,并了解如何使用列表和字典。这使得可以在 Python 编程语言中创建复杂的数据结构。
它非常类似于 JO,你可以字面上在 Python 代码中模拟 JsonN 语法。就像你在 JavaScript 中那样构建这些复杂结构一样。有关我最新的 AI 课程和项目的信息,请点击订阅,并点击旁边的铃铛,以便收到该部分每个新视频的通知。在这一部分,我们将深入研究 Python 列表、字典、集合和 JSON。因此,如果你已经在这些主题上工作过。
你可以安全地跳过这一部分,继续往下进行。像大多数编程语言一样,Python 确实有数组、列表、字典和集合的概念。Python 处理这些的方式很有趣。
这与 JavaScript 的处理方式非常相似。构成这些列表的代码通常在 Python 中是有效的 JSon,只要你正确书写,它始终是有效的 JSON。所以我们在 Python 中看到的是可以有一个值的列表。这是一个数组。这是一个预定义的数组。这里面有字符串,单引号,单引号。
当你在 Python 中打印列表时,我们可以将这些打印出来。它通常看起来是这样的。你会有一个打开的大括号,关闭的大括号,然后里面的内容。某些列表。如果你使用的是“lumpumpy”列表。我们稍后再讨论这个,那里会看起来更复杂,但基本上还是同样的东西。
你在这里有多个值,在许多编程语言中,数组是固定大小的,而在 Python 中则不是。你可以向它们添加内容。所以 C 做到的 Yi。将会在列表创建后放入其他内容。因此,这非常方便。你可以遍历一个列表。
这就像许多编程语言中的 for each 循环一样。因此这将循环遍历每个值并打印出来。所以你得到了那个集合或列表中的值。Python 还有一个很方便的功能,它允许你跟踪你在列表中的当前值,如果你想跟踪索引的话。
你需要做一些像这样 index 等于 0。打印,你会打印出你拥有的 S,然后也许是它所在的索引。然后你必须记得每次都增加这个值。现在你可以跟踪你在列表中的位置。否则你就不知道你在列表中的位置。
列表的每一次迭代都是完全相同的,知道你实际所处的位置。所以我们就这样保持不变,但在这里我们可以使用一种叫做枚举的东西,这样你就不需要有那个其他值。所以现在我们在循环i和C,i将是你的索引,C将是在那个特定索引处的值,所以现在你知道你在这个中的位置。
这将是有用的,因为也许你想要在那个特定值上修改集合,并将其更改为其他东西。我们不会这样做,但这就是它可能有用的地方,或者如果你只是想打印数字以配合这些内容。现在,Python中的所有内容都是零基的,列表和索引从零开始,你也可以通过添加值来定义你的列表。
这不是错字,确实要有两个C,因为这告诉你一个列表总是有方括号,可以有多个值,多个项目具有完全相同的值。如果你使用一种叫做集合的东西,这非常有用。你可以使用集合来消除重复项,随着你添加这些项。
第二个C不会被添加,因为它说,嘿,我已经有一个了。要定义一个集合,你只需做C等于set,然后关闭括号。现在。你会注意到它在打印时确实有大括号。所以它有点像一个字典。现在,列表可以添加和移除值。所以在这里我们有ABC。
我们现在插入A0,注意我们在位置零插入,因此它放在开始的位置。然后我们打印出来,看到它被放到了最前面。接着我们将从C中移除B的值,所以我们也可以在索引处移除C的集合,如果你想移除第一个,这就是你做到的方式。这就是你如何非常动态地向数组中添加和移除值,它不像某些编程语言那样要求定义固定长度的数组,只有这样。
现在这是有趣的部分。你可以定义字典和哈希表,并创建相当复杂的结构。所以在这里我创建了基本上是名称值对的东西,这本质上是字典和哈希表本身。
字典、映射、哈希表,这些名称都表示非常相似的东西,并且基本上可以互换使用。在大多数情况下。这里我创建了一个字典,一个字典就像一本书,你查找一个词并找到其定义。这基本上就是它在这里的作用,所以名称是杰夫,地址是123主街,如果我打印出D,当我运行这个时。
你首先看到的是字典的打印输出。如果我打印出来。这是如何查找的,如果我打印出 name。并使用方括号,它会找到 Jeff,并打印出 Jeff。这是你检查某个东西是否在字典中存在的方法。如果你尝试访问字典中不存在的东西,比如如果我试图打印出 name2,它会给出一个错误,所以你想检查一下,如果 name 确实被定义了,实际上是的,而 age 是未定义的。
使用字典时要注意这一点,这是 Python 的一个非常常见的特性,我们在本课程中肯定会使用。你也可以访问其中的单个键和值。所以如果你运行这个,它会显示键是 name 和 address,现在注意到它说这是一个字典的键。
这基本上是一个列表,你可以把它当作列表来处理,或者你可以通过将其传递给 list 来轻松地将其转换为列表。值,这些就是值。所以你使用 keys 函数和 values 函数来获取字典中所有内容的访问权限。
你也可以组合它们,所以这里非常常见,你会看到一个列表。然后这里的每个映射或字典本质上是一个记录。所以在第一个记录中,它说明了这个人的名字或者名字,我和我的妻子。Jeff 和 Tracy Heaton,我们有三只宠物,两只鸟和一只名叫 Hickory 的狗。还有宠物。
由于我们有多只宠物,你必须在其中放一个列表。如果只是 Winton,我们可以直接用冒号和 Winton,只要你定义格式为那样。约翰·史密斯这里有一只叫 Rover 的宠物,由于我们定义的格式为列表。我们期待一个列表,即使他只有 Rover,显然是一只狗。我们不。
需要真的有列表,但这使得它方便,因为我们可以期待一切都是列表,保持一致性总是好事。约翰·多没有宠物,所以我不知道他的问题是什么。这就是客户的完整列表。我们可以将其打印出来,或者我们可以逐一遍历它。所以这将整个内容打印出来,直接输出到你的屏幕上,或者在这里我们可以循环遍历它们。
或许你可以处理每一个,你可以计算每个人拥有的宠物数量。顺便说一下,这对客户有点方便。所以如果你确实获取而不是仅仅是大括号。然后你可以提供一个默认值。所以这里的默认值是没有宠物。如果这个人没有宠物,正是 J Doe 的情况,它会简单地说没有宠物。
顺便说一下,这段代码开始看起来非常像 JSON。在这里。使代码不再是 JSON 的原因是 JSON 要求在这里加上引号,如果你把它改成那样,你就不再是有效的 JSON,更复杂的列表,这种做法相对整洁。你可以将两个列表合并,所以这里我们有 1,2,3,4,5,5,432,1 对于 B。
我们将打印出A和B的zip,它会将这两个连接在一起。现在,这给你一个对象来实际查看。你这样做。这些是元组。在Python中,元组和列表非常相似,我们实际上不会深入讨论它们之间的区别。在神经网络的研究中,但你可以看到第一个是这里的1、2、3、4、5,然后是5。
4、3、21是另一个,所以现在创建了一系列的元组在列表中。因此,你有一个包含这些元组的列表,然后这些元组是那两个列表的并集。或者是那两个列表的连接。你也可以像这样使用它。所以现在你正在使用每个列表中的X和Y。
我们已经看到了枚举,但这基本上是为了让你跟踪每个值所在的位置。所以你知道1在位置0,依此类推。这在你想打印出每个索引所持有的内容时是很有用的。这在Python中是一个列表推导式。我们会使用这些一些。🤢,基本上,这就是它为你动态构建一个列表。
所以这表示对于10中的所有x,以及你在这里放入的任何内容,如果你在这里仅仅放入X,它会重复列表。但是因为是10,这就创建了一个第二个列表,其中每个值都乘以10。这是一种动态构建列表的非常方便的方法。
你也可以动态构建一个字典。我在处理CSV文件时经常使用这个。因此,当你处理CSV文件时,你会得到它们的标题列表。😊,所以你可能会有列零、列一、列二和列三,你可能想要一个查找表,以便现在可以查找call2的文本,这可能是一个地址或其他什么。你可以将该字符串传入,然后如果它的位置发生变化,它会移动到正确的索引。
你创建这个查找值。查找字典表示列零是零,列一是一个,列二是二。现在,如果你在这里添加一些东西,比如,我不知道,就那样。那么现在它将跟踪这些。因此,列三被推到了右边。所以它仍然是4。这就是你如何在代码中进行更改时保持代码不崩溃的方法。
所以这非常方便,因为现在你可以查找该列的索引并发现它实际上是两个。感谢观看此视频。在下一个视频中,我们将研究如何利用文件,无论是图像还是文本,以便在导入数据到深度神经网络时使用。这些内容经常变化,所以请订阅频道以保持对本课程和其他人工智能主题的最新了解。
😊。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P40:L7.4- 在Keras中用于半监督学习的GANS - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeffine,欢迎来到华盛顿大学的深度神经网络应用。在这段视频中,我们将探讨如何使用GAN生成额外的训练数据。想了解我最新的AI课程和项目,请点击订阅并按旁边的铃铛,以便接收每个新视频的通知。GAN有广泛的用途,不仅仅是你常见的面部生成,它们确实可以生成其他类型的图像,但也可以处理表格数据和任何试图让神经网络生成应该是真实的或可能被分类为虚假的数据。使其成为GAN的关键要素是有一个区分器来区分,并且生成器实际生成数据。我们看到GAN被大量用于半监督训练。因此,让我们先谈谈什么是半监督训练,并看看如何使用GAN来实现这一点。首先,让我们谈谈监督训练。
训练和无监督训练,你可能在之前的机器学习文献中见过。但以防你没有,监督训练就是我们到目前为止所做的。我会说本课程绝大部分内容都是在监督学习领域。在这里,你有多个X,在表格数据或图像数据的情况下,你有某种输入进来,也就是X。而你知道正确的Y是什么。
你将训练模型以在拥有这些x时产生这些Y,因为后来你会有未知Y的x进来,而这正是你希望神经网络或其他模型能够给出Y值估计的地方,无监督训练是指我们拥有X的情况。
它可能看起来就像这样,它可以处理图像数据、表格数据或几乎任何东西。但没有Y,允许神经网络或任何模型工作,通常你不使用神经网络进行无监督训练,这通常是像K均值这样的领域。
聚类和其他方法。你的经典无监督训练只会将输入进行聚类,使得相似的样本在一起,这些可能是相似的图像,也可能是表格数据中的相似输入等多种情况。半监督训练实际上比无监督训练更接近有监督训练,我认为这就是GA的优势所在。在半监督训练中,你有x,就像在其他情况下一样,但并不是每一个都有标签或Y,你可能只有少量数据,并没有完整的数据集按照传统方式标记。通常情况下,未标记的值会被忽略,因为没有办法将它们输入到传统的有监督学习中,或者你会在你拥有Y的那些数据上进行训练,使用经典的反向传播或任何你在训练特定模型时使用的方法,然后你会创建预测。
为什么要预测所有缺失值,然后在预测值和其他值上重新训练整个模型。在实践中,我在这种技术上从未取得很大的成功,但在半监督训练和GNs中确实有一些理论基础。如果你考虑一个孩子在日常生活中看到各种交通工具的情景,他们与父母或其他人在一起,看到街上经过的各种车辆,而这些车辆并没有标签。
没有人告诉他们那是交通工具,他们只是看到大量的图像。随着他们的成长,他们学习边缘,学习其他各种事物,他们通过观察学习如何分类某物是否在其他物体之上,而不需要特定的标签。
最终,有人说,“嘿,那是一辆车,那是一辆公交车,那是一列火车,那是一辆自行车。”利用他们得到的那小部分标签,当有人告诉他们自己在看什么或他们独立验证时,这就是半监督训练,因为它建立在多年来未标记数据的基础上,而他们不知道自己在看什么。
但他们知道自己在看着某样东西,这给他们提供了额外的参考。这与有监督训练完全相同,即使我们没有Y,这些值对神经网络学习数据结构仍然是有价值的,因为它在学习预测我们实际上拥有的那些信息。所以让我们来看一下结构,这是一个普通的图像生成GA基线的结构,可以说是研究的起点。我们之前见过这个,但为了快速回顾,我们有实际的图像,它们进入一个判别器。
我们有生成的图像,这些图像是由生成器产生的。所以青色部分。这两个神经网络的随机种子值导致生成器生成图像。鉴别器正在不断学习,更好地区分真实图像和生成图像,而生成器也在不断学习,创造出更好更能欺骗鉴别器的图像。一旦这一切完成,你就保留生成器,因为它为你生成图像,而你可能会丢掉鉴别器,它只是用来让生成器进行练习的。我们会看到在半监督学习中这一点会有所改变,在半监督学习中,我们更关心鉴别器,而不是生成器,通常我们会丢掉生成器。
这就是你训练一个半监督分类神经网络的方式。这与我们刚才看到的图非常相似。在这种情况下,我们关注的是如何在表格数据上进行训练,比如医疗记录。鉴别器会学习识别生成的虚假医疗记录和真实医疗记录之间的区别。
这部分与之前的一样,这部分也是。不同之处在于我们现在训练它,不仅仅是区分虚假和真实。这些是真实的,而这是虚假的。我们在教它学习类别,因此我们正在关注的可能是四种不同类别的医疗记录,或许是四种不同的健康水平。我们在教它作为分类神经网络,区分五个事物:四个我们真正感兴趣的类别,以及它是否是虚假的。训练完成后,我们得到了这个能够区分虚假和真实类别的鉴别器,我们还拥有一个能够生成这些虚假医疗记录的生成器,但我们可以丢掉生成器,真正使用鉴别器作为我们的实际神经网络,现在用于医疗记录,尤其是当我们缺少标签时。所以我们仍然将这些数据输入进去,只是现在我们评估它时,不是基于它是否正确分类,而是基于它是否能够区分虚假和真实。街道房屋视图数据集是一种图像数据,常用于展示半监督学习。
Lning 和我有一个链接到 Akira 的示例,外部的类展示了这一点,如果你对这种技术感兴趣的话。这个示例使用了建筑物侧面拍摄的图像上的数据,并不是所有的数据都有标签,或者你可以模拟这些数据没有标签的情况,你会发现 ganN 能够学习分类这些 10 位数字类型,即使每个数字都没有标签。如果你想为回归做同样的事情,这会变得非常相似,你会有两个输出,所以你有一个多输出神经网络,一个是你试图训练的实际回归值,另一个是生成的假记录的概率。这些我正在用表格作为示例,这些可以是医疗记录,也许回归输出将是健康水平,或者是患者的年龄,或其他值,或许是他们当前是否有疾病的预测。
这是在处理医疗记录时,当我们不知道 Y 输出时,这两个相同的操作。当我们输入医疗记录时,我们希望看到这个假记录的回归,当我们输入值时,我们有医疗记录但没有 Y,我们只想确保假记录的概率相当高,而这被纳入了训练中。
我们并不太在乎它在回归什么,或者对于我们确实有回归输出的情况,回归输出是什么。我们会根据它与期望的 Y 之间的距离来惩罚它。就像分类问题一样,当我们完成这一切时,我们会抛弃生成器,鉴别器成为在此基础上训练的半监督神经网络。如果你想进一步了解这种半监督学习技术,我给了你几篇文章的链接。
对此我发现很有用。有一个链接到实际的房屋数据集。这是一个相当有趣的数据集,值得关注。它包含所有房屋号码。你可以用几种方式处理它。你可以处理单个数字的分类,给出整个数字集的边界矩形,如果你愿意的话,所以你可以分类数字,也可以分类整个地址。这完全取决于你如何设置问题。我在这里给你的例子使用数字,这是首个开始研究无监督表示学习的论文,使用深度卷积生成对抗网络。我们将看看一些前沿的、非常活跃的研究领域,内容常常变化。
请关注该频道,以获取有关本课程和人工智能其他主题的最新信息。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P41:L7.5- 生成对抗网络(GAN)研究领域的一些新主题 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff E,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将看看GANs中一些最新的研究领域,并了解这种令人兴奋的神经网络类型可以做的一些有趣事情。要获取我AI课程和项目的最新信息,请点击订阅和旁边的铃铛,以便在每个新视频发布时收到通知。现在,让我们看看一些我觉得特别有趣的GAN项目,其中一些是纯GAN,有些则是与GAN结合使用其他技术。
在这里,我给你一个链接到GitHub的网站,基本上有Kra对许多G项目的实现,你可以在论文中找到。这是一个非常有用的网站,我用它获取了我在这堂课中给你的一些例子的资料。
所以一定要查看这个。这也是一个很棒的Dethub库。这是一个精心策划的精彩G应用和演示列表。这个项目能够使用G生成中文书法字体。😊这个项目能够生成动漫角色作为面孔。
这就像我们见过的常规面部生成对抗网络,只不过它是在生成动漫角色。老化效果很有趣,它能够逐渐使面部老化,并让你对一个面孔在更年长时的样子有个概念。超分辨率也很有趣,这是将相对低分辨率的图像提升到更高分辨率的过程。
这在大屏电视的升级上非常受欢迎,也适用于老视频游戏。😊,以非常高的分辨率输出,我发现一些特别有趣的项目,仅仅是想看看深度伪造,媒体对此非常感兴趣。
特别是2020年美国大选即将到来,我们正进入一个时代,在这个时代,我们的敌人可以让任何人看起来在任何时间说任何话。即使他们永远不会说那些话,其他人也会。像乔丹·皮尔这样的人。这是一个危险的时期。现在,深度伪造通过获取源视频图像并将其结合在一起,以便你可以创建一个图像,创建一个说话的人,基本上可以让他们用自己的声音说你想让他们说的话,正在出现一种新的方法,即少量对抗学习的真实说话头。
🎼这个你最近在媒体上见过。他们对蒙娜丽莎做了很多事情。
🎼Paint我们呈现一个可以学习真实说话头模型的系统。🎼值得注意的是,学习新的头部模型只需要少量图像。在这里,我们可以看到,在某些情况下,模型可能对标志的几何形状非常敏感。
而你看到的大多数扫描实际上只是处理面部,但。
他们正在进行全身引导生成。
这是一篇论文,他们能够生成整个身体,并根据你这里的这些点来摆姿势,所以你现在可以。我不知道,我觉得神经网络可能是在试图让人类模型失业,也许我不知道。
但他们现在可以基于Gs智能生成全身图像。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P42:L8.1- Kaggle简介 - ShowMeAI - BV15f4y1w7b8
嗨,我是Jeff Heaton。我们在华盛顿大学研究深度神经网络的应用。在这个视频中,我们将概述Cagel。Cagel是竞争性数据科学,课程中的一个项目涉及到Cagggel竞赛,最新的AI课程和项目可以点击旁边的订阅铃铛以接收每个新视频的通知。
Kagel在数据科学界非常重要。它就像美国的世界杯或超级碗。在这里,数据科学家们互相竞争。他们这样做是为了获得kgel排名。不同的kgel排名有很多种。稍后我们会谈论这个。但你最感兴趣的将是我将给你一个kgel课堂。
这是kgggel的一个特别区域。它并不是一个真正的完整kgel竞赛,你并不是在与成千上万的其他数据科学家竞争,但它使用的界面与Kagel完全相同。这让你熟悉kle竞赛并进行学习。😊
如何处理这些类型的数据集。我将给你一个关于Kagggel的概述,我们将看看如何提交内容到Cagel,因为这个课程的一个主要项目是一个向当前学期的学生以及互联网开放的kaggel竞赛,通常还有一些不在华盛顿大学实际课堂上的人也参加Cagel竞赛。
这非常有趣。我有时甚至会看到之前的学生回来参加随后的kgel竞赛学期。有些在课堂kgel竞赛中竞争的学生也参加了其他kgel竞赛。一个学生甚至在实际的kle竞赛中进入了前5%,比我在Kaggel的成绩还要好,这真是太酷了。稍后我们会详细讨论这些百分比排名的含义。所以Cagel,看看这个,你可以看到顶级的kgel用户。这只是一个指向Kaggle网站的链接。
现在这确实把我放在了顶部,但这只是因为我是我,我绝对不是Cagel的零号位置。这些是一些来自Cagggel的最高排名数据科学家。你可以点击一些个人资料,进入一个描述他们更多信息的小页面。有时他们会有Github和LinkedIn的链接,有时则没有,就像这个当前排名第一的家伙一样,Kagggel上确实有时会与这些人进行采访,以便你可以了解更多。
我还有一个链接到顶级Kaggle个人资料,但我们没去过。这是我的Kaggle个人资料页面,让你看到我在这方面做了什么。这显示了你当前的排名,我被称为比赛专家,这意味着我完成了两场比赛并获得了铜牌,这是成为比赛专家的最低要求。对我来说,下一个级别是Kaggle大师,甚至是Kaggle大宗师,这需要获得一些这些。
黄金级别的完成标准是如何获得铜牌,实际上是Kaggle的前10%胜利。我们前10%的完成。对于Kaggle,我大概在这两场比赛中表现最好。一场是前10%,另一场是前7%的完成。所以这足以让我成为比赛专家。现在我大约有两年没参加Kaggle比赛了。希望能再次参与其中。
不过,这确实需要相当多的时间,和我的日常工作一样。所以我们看看未来会如何。大多数Kaggle比赛。我们来看看一个典型的Kaggle比赛。我们会查看Titanic比赛。Kaggle将其网站分成多个比赛。因此,如果你去Titanic的比赛摘要页面。这是一个教程比赛。
你当然可以参与其中。 从参与的团队数量就可以看出,几乎有12000个。 大多数大型比赛会有1000或2个,可能还有三个。所以这无疑是一个非常大的比赛,赢得Kaggle的比赛。没有。
赢得Titanic Kaggle比赛的概念,因为它是持续进行的。实际上没有真正的截止日期。他们通常将Titanic的当前截止日期设定为当年年底。你会发现,他们通常会将截止日期推迟到明年的年底。Titanic数据集是那艘在大西洋中遭遇了非常灾难性命运的邮轮。
它沉没了。有些人幸存了下来,有些人没有。你可以去维基百科查找谁幸存,谁没有。因此,你可以在此获得完美的排行榜得分。排行榜显示了参与者中,谁在前列,谁不在。现在。
看,这里有很多完美的得分。这些是准确率。因此1.0意味着在这样的教程比赛中100%的准确率,结果公布在维基百科上。事实上,这些人有100%的得分,意味着他们在复制和粘贴方面非常擅长。在Titanic上获得0%得分是不可能的。
重新考虑过拟合。我会非常惊讶地看到“过拟合泰坦尼克号”是一个完美的例子。有几个相对年轻的个体,本应该是女性,也应该成功逃离这艘船,但并没有。没有人确切知道他们为什么没有,可能是在灾难的最后时刻与父母走散了。所以这就是排行榜。数据页面对你也非常重要。
在这个模块结束时,我会带你了解本学期的比赛。这是数据页面,展示了训练集和测试集的样子。你还会获得数据字典。例如,他们是否幸存。是或否,票类,第一、二、三舱,性别,年龄和年数,兄弟姐妹数量。
父母数量,票号,乘客票价,舱号和登船地点。基本上是从欧洲的三个不同城市接送的人,之后泰坦尼克号启航横渡大西洋。这些变量非常重要。票类。
可能这是第二重要的因素。性别在这种灾难中非常依赖“女性和儿童优先”。因此,最具预测性的变量是你是男性还是女性。如果你是女性,你生存的概率要大得多。第二重要的因素取决于你是男性还是女性,如果你是女性,你的票类与此关系密切。其次可能是年龄,男性的年龄也是第二重要的因素,因为那样你会归入儿童的类别。在一些比赛中,你会看到 kernels,但我不会要求你在我们班的比赛中提交 kernels。你可以看到这些在评价中排名相当高,这是你提交代码的地方。所以在Kaggle中你可以通过三种不同方式获得名声,可能最具声望的就是赢得比赛或在比赛中名列前茅。下一个可能最具声望的就是 kernels。
也许你并不一定赢得了比赛,但你提交了一段代码片段,得到了其他Kaggle用户的高度评价,比如这些关于集成、堆叠和Python的介绍。这可能是你本学期可以考虑的一个很好的项目,你也许可以将其改编成我将要给你的第三个作业和另一种方式。
我的意思是,这三者都能让你成为Kaggle大师、Kaggle专家、Kaggle大宗师,讨论和交流也非常重要。我从这些讨论中学到了很多东西,当我在Kaggle比赛中时。讨论点也可以被高度排名。如果你发布了很多 consistently high ranked 的讨论,这将为你在讨论中赢得Kaggle大师的地位,进而登上排行榜。
在Kaggle比赛中,你将被允许组队。在这里你可以看到三个图标,这意味着这是一个团队竞争。因此你可以创建最多五人的团队。😊。
但是请参考实际视频以获取本学期Kaggle比赛的说明。你可能还会注意到下面的小点,这些小点告诉你正在处理的Kaggle选手的水平。一个绿色的点意味着你在与一个全新、未参与过比赛的Kaggle选手打交道,两个点则意味着他们参加过Kaggle比赛,但尚未达到获得两枚铜牌的专家水平。
这是我目前所处的类别,那些是获得铜奖的选手,达到Kaggle专家的水平,而四等奖是Kaggle大师,五等奖是Kaggle奶奶。Kaggle比赛的评分方式很有趣,通常你不需要将你的代码提交给Kaggle进行评分。
他们只是想要你的数据,现在只有内核竞争。我可能在未来的学期参与其中,但目前不打算。所以这次竞争,我将给你一个正常的Kaggle数据竞争。我会提供一个完整的数据集。我知道结果,也知道我完整数据集中的每一行的原因。
我会将数据拆分,给你一个训练集和一个测试集,测试集可能占20%。但请参考当前学期的Kaggle比赛,看看我具体设定在哪里。训练集中,我会像惯例一样给你Y值,而测试集我不会给你Y值。这两个数据集都有ID列,告诉你每一行的ID。你得分的方法是提交你的预测结果。
你的测试数据集的Y值与每个ID编号对应。所以你提交的内容其实非常简短。只需包含ID和你的答案,像提交那些填空题的扫描测试一样,这种测试现在使用得越来越少,通常这些测试都是在电脑上完成的。在你提交的测试数据集中,有两个部分。
有公共排行榜和私人排行榜。你最初将在公共排行榜上得分,而你不知道哪个是哪个,我不透露,Kaggle也不会透露。你的答案将基于你在泰坦尼克Kaggle比赛中看到的公共排行榜分数。
所有这些都是公共排行榜的分数,直到比赛实际结束。一旦比赛结束,它会翻转,你的分数将来自私人排行榜。这防止了过拟合。如果你严重过拟合了训练数据集,你的公共排行榜分数将会很糟糕。然而,如果你通过不断调整来过拟合排行榜,提高公共排行榜分数。
你会在私人排行榜公布时感到惊讶,因为你已经过拟合了公共排行榜,而许多Caggle竞争者在这些比赛中也遭遇了严重的下滑。
它们在公共排行榜上可能会位列前五,但当比赛结束时,它们在私人排行榜上的分数会被严重压制。随着我们进入本学期的实际作业,你会看到一些例子,但你不会知道自己的私人排行榜排名,这才是关键,直到最后。
所以公共排行榜只是你可能的位置的估计。这是一个图形示例。你可以看到原始数据集。这是只有我或者其他运行Caggle比赛的人有的。我给你这个数据,你得到带有Y值的训练数据和没有Y值的测试数据,但测试数据实际上被秘密分为两部分,你会分别评分。
你不知道哪些行或者公共排行榜,但我有那些Y值。所以Kaaggel会在这方面对你进行评分,并将你放入适合你的公共排行榜分数的组别,然后在最后,Caggle会自动对你在私人排行榜上的表现进行评分。现在准备Caggle提交,你基本上会使用这个测试数据,并填写你所有的答案。对于泰坦尼克号的数据,它的样子是乘客的I,逝者标记为0,幸存者标记为1,这基本上是一个你需要上传的cv文件。我将带你了解一些我发现特别有趣的Caggle比赛。首先,自动组挑战是我参与的第一个比赛,幸运的是我能进入前10%。自动组挑战是一个需要在多个产品类别之间进行区分的比赛。我忘了确切有多少个类别,总共有93个特征,所以是93个X。
提供了200,000行数据,你需要在其中进行分类。这是一个非常困难的Kaggle竞赛,我最终使用了深度学习和其他一种叫XGBoost的方法。我强烈建议你了解一下XGBoost,这超出了本课程的范围,但XGBoost和一种叫LightGBM的技术在Kaggle中非常受欢迎。如果你想将它们与本学期的Kaggle作业结合使用,这可能会帮助你获得更好的分数。只需查看这个案例的排行榜,这显示了排名靠前的人员。现在注意,这些人的底部点数要高得多,因为他们是真正的Kaggle竞争者,而黄色的则是KaggleGrandmasters,橙色的是KaggleMasters。这个人真的很幸运,他只提交了一个案例就进入了前十名,虽然并不是完全。
当然,他可能只提交了这一个案例,之后再也没有参与Kaggle竞赛。因此,他甚至不算是专家级别,但我相信他可以做到。他或她。这是公共排行榜。如果我们看一下,这实际上是私人排行榜。如果你查看公共排行榜,可以看看排名靠前的人,因为这会有一些变化。
实际上并没有太多变化。大多数人的排名基本保持不变。因此,这个案例并没有发生太多过拟合。银河动物园也是一个相当有趣的案例。这是XGBoost真正走入公众视野的地方。这是一个试图分类你所观察到的星系类型的案例。
这是一个计算机视觉的案例。这是早期计算机视觉中的一个案例。Kaggle上有很多计算机视觉的案例,也有处理行和列的表格数据。我到目前为止在这个课程中参与的大多数Kaggle竞赛都是表格数据,但我很可能会在某个时候加入计算机视觉的案例。
所以当我们到达这个模块的最后部分并讨论本学期的竞赛时,你会听到相关信息。实践融合案例特别有趣,因为你会得到一个关系数据库。这是Kaggle早期的一个案例,只有1416个案例。这是医疗数据,因此这是我的行业,保险行业曾多次研究的案例。你还会得到ICD9代码,相信我,ICD10和ICD9在保险行业中是个大问题,涉及预测生物反应。
这是一个特别有趣的例子。我稍后会在模块中给你展示一个例子,以便我可以向你演示集成学习,集成学习是指将多个模型结合在一起。因此,异质集成学习是指将随机森林与深度神经网络结合使用,而同质集成学习则是。
在这里,你会使用随机森林进行完全独立的集成。如果你查看数据字典,会发现有大量的列。实际上,得不断加载,我想这里有几千列,而这一个数据集的行数并不多。所以这里有确切的统计数据,训练集有3700行和1777列,这实在有些疯狂,但这就是这个问题的关键,你要预测生物反应是否会发生。
这实际上是一个二分类问题。我发现特别有趣的计算机视觉应用是糖尿病视网膜病变。这是通过眼睛的照片(视网膜病变)来预测你是否患有糖尿病,另一个应用。
保险行业显然对此非常感兴趣。所以为100,000美元。这是潜在的,大额资金,猫和狗的对比。这纯粹是有趣。以前总是说,人工智能在区分猫和狗方面失败,但现在绝对不是这样了。这里有猫和狗的图片,尝试使用深度学习和其他技术来区分它们。
看一下排行榜。这是准确度,达到大约99%。神经网络和其他模型非常能够区分猫和狗。州立农场的分心驾驶检测,这是保险行业的应用,使用了计算机视觉。这非常有趣。这是将相机放置在测试对象的车里。
这些想法的核心是让保险公司在你身上放置某种监控设备。这完全是物联网(IoT)。所以这些车里有些东西在追踪这些人,并在他们开车时拍照。
我的意思是,如果你证明自己是安全驾驶者或健康个体,保险公司会给你更低的保费。这些是驾驶不太安全的人。可以看到,她在看手机,至少看起来是出车外,但手里却拿着手机。所以你需要检测他们是在进行安全活动还是不太安全的活动。还有时间序列,Kaggle的鲸鱼检测挑战非常有趣。
你基本上在处理声波。所以处理声音文件。这在处理时间序列数据时非常流行,比如LSTM和一些新的卷积时间序列技术。我们在讨论时间序列时会深入探讨,此外,Kaggle总是有帮助圣诞老人的活动,这是一个奇怪的比赛,通常在圣诞节期间。你实际上是在制定一个最佳的圣诞老人日程,以便他能在平安夜交付所有玩具。
结果变得相当离奇,因为这些竞争对圣诞老人而言,圣诞老人的日程将在圣诞节后持续很多很多年。因此他最终变得非常非常晚。但这其实是一个优化问题。稍微超出神经网络的范围,但其他机器学习技术可以用于解决这个问题。感谢观看这个视频。
在下一个视频中,我们将探讨集合以及如何将神经网络与其他psyit learn结合。😊。
类型模型可以构建更具预测性的结构。这在kggles中是一种非常常见的技术。这些内容经常变化,所以请订阅频道,以便及时了解本课程及其他人工智能主题。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P43:L8.2- 使用Scikit-Learn和Keras构建集成模型 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿,欢迎来到华盛顿大学的深度神经网络应用。在这个视频中,我们将研究集成方法。我们将特别关注异构集成,这让你可以结合不同类型的模型以获得更强的结果。想了解我最新的AI课程和项目,请点击订阅及旁边的铃铛,以便接收每个新视频的通知。
我们将看看一些对你在本学期Kaggle比赛中非常有帮助的技巧。这允许你使用神经网络与集成。集成是Kaggle中的一个非常重要的方面。这就是你创建异构集成的地方。现在,集成是许多机器学习算法(如随机森林)内置的功能。
随机森林在自身的基础上就进行集成。它包括树,而这些树是彼此集成的。因为这里没有多种不同类型的模型,所以这被称为同质集成。现在,我们将首先评估特征重要性。这是一篇很好的论文,告诉你如何进行特征扰动排名。这是一个非常。😊。
这是一种可以用于任何类型回归或分类算法的流行技术。它不使用实际模型的任何内部。这也是一篇有趣的论文,因为里面有乔伊博士和德斯博士,作者名字的有趣之处。这些是你可以用来评估特征重要性的其他一些方法。
哪个输入是最重要的。现在主要是处理表格数据,你会看到类似于Excel中的列。如果你处理的是图像数据,特征重要性就更难以确定,并不是一个像素更重要。
说得比另一个像素更重要。这也是一篇我参与的论文,我们发布了可以与TensorFlow一起使用的代码来实现一些这些算法。这是一个仅介绍并提供基本扰动排名算法的函数。
'继续运行它,这样它就会以这种方式加载。其实这非常简单。我有一个单独的视频,不是这个课程的一部分,但我制作了一个关于扰动排名如何工作的影片。如果你想深入了解其内部工作,我会提供一个链接供你访问。
但本质上,这个过程将逐列遍历数据集并逐一打乱。我们将使用同一个神经网络来评估所有列,但我们将为每一列一次性评分。所以假设你的数据集中有10列,即10个预测变量。你想知道这10个中哪个是最重要的。
你从第一个开始,打乱这些列,你对列1进行扰动,这样列1就被随机化,这有效地摧毁了列1。但最大值、最小值、标准差、均值、中位数等仍然完全相同。所以你没有引入任何偏差,但却摧毁了一列。现在你评估误差。在那个随机化列的神经网络上生成预测。
如果列1并不是非常重要,那么分数不会大幅下降。你的准确率或日志损失,或者你使用的其他指标,如果列1非常重要,那么打乱它将真正、真正伤害你的分数。所以这就是为什么要进行扰动排名。它基本上是对我们拥有的列数进行循环。
我们复制这一列,因为我们即将打乱它,然后有效地摧毁它。但我们有一个副本,所以我们不想像龙卷风一样,它会在乡间留下毁灭的痕迹。我们想要恢复它,而不是成为龙卷风。接着我们查看是否是回归问题。如果是回归,我们会对此进行预测,并查看均方误差。
如果是分类问题,那么我们预测概率并计算日志损失。这两者都会给我们一个希望最小化的误差。我们跟踪我们的误差,然后恢复我们之前摧毁的列。我们确定最大误差是什么,然后基本上计算这些列相对于其接近最大误差的相对重要性。
最大误差,导致最大误差的列是最重要的列,因此最重要的列的重要性将为1.0,其他列会是其某个比例。我们将用鸢尾花数据集来运行这个适合的神经网络,因此我们现在有了一个适合该数据集的模型,然后我将获得完美的准确率。这在鸢尾花数据集中并不难做到,然后我将运行,你可以基本上看到重要性,所以花萼长度是预测你正在处理的鸢尾花种类的最重要列,然后它的影响急剧下降。你只会知道哪个列是最重要的,而不知道最重要列的重要性到底有多大,你只是得到这些列的排名。
你永远不会看到比1.0更高或更低的最重要列。我们也可以在回归上做到这一点。我们将使用每加仑多少英里的数据库,因为这是一个相当简单的例子。你可以将其应用于更复杂的神经网络,如果你在Kaggle上进行此操作,可能会花费更长的时间,因为你可能有20、30、40、100列,并且需要在每一列上运行。现在,在运行此后,我们可以看到哪些字段对每加仑多少英里的神经网络最重要,我们可以看到位移。
这就是立方英寸或其他发动机体积测量的最重要特征,接下来是马力、重量、年份等等。气缸将通过位移表示,所以我不太惊讶这是一个较不重要的特征,但你会注意到大多数特征在整体重要性方面相对接近。现在我们将采取一个行动。
这是Cale提供的生物响应数据集。因为我将以此作为构建集成的示例。如果我们打开这个数据集,我不会实际操作,但我有一个链接可以供你查看。它基本上有近1700列和大约3000行。
所以它有大量的列。特征重要性可能有助于移除其中一些。不幸的是,大多数都是相当重要的。我们要关注的是如何将这些组合成一个集成。这里的“这些”是指几种不同的模型,比如神经网络、随机森林、梯度提升等。所以我会继续运行这个。
这将基本上打开这些文件。我将它们保存在本地驱动器上。这些是Kaggle文件。因此我实际上不能将它们放在一个可以让你访问的地方。你需要自己从Kaggle下载它们。我只是把它们放在数据目录中。你可以把它放在任何你想要的位置。我会运行这个。
你可以在这里看到,当我打印出这个数据集的形状时,它实际上是一个相当方形的数据集,这很困难,因为列几乎和行一样多,3700行和1777列。我们继续运行这个,拟合一个神经网络并获取一些预测。这是一个分类神经网络,因为它基本上告诉我们是否发生了生物响应。
你可以看到验证的日志损失大约是0.55。日志损失是Kaggle实际用于排名的。验证准确率大约为76%。所以,这并不好,也不算太糟。我们会看看这个的特征重要性。基本上,大多数特征都在90以上。
甚至追溯到1700年代也有90年代的数据。因此它们都是重要的。这对于这个特定的任务来说非常困难。集成对获得良好的得分至关重要,特别是对参与这个竞赛的Kaggle竞争者来说。因此,我将开始介绍一些我这里的代码。
你可以利用这个来构建一个集成。你看到这里我有构建人工神经网络的代码。我将继续运行这个,因为它需要一些时间,并在实际运行时解释发生了什么。这构建了人工神经网络。我在这里给出了一个类别的数量。通常你会希望这仅仅是占位符代码。
你将需要比我在这里更多的稠密层。我还计算了对数损失多重对数损失。这是一种我们在早期模块中看到的错误计算类型。这里的拉伸代码基本上用于规范化预测的y范围。因此,它是一种平均或规范化的方式来拉伸它。
这是一种我在几个Kaggle比赛中看到的技术。我从这里一个获胜方案中复制了它。如果你在做回归或像这样的单一分类,这可能对你有用。我将使用分层K折交叉验证,基本上是确保我们的每一折在训练集中的分布是平衡的,否则你可能会引入。
不一致性,比如说在整体训练集中有20%的正样本。你希望在每个K折中也有20%的正样本。否则你的真实标签会偏离。我在之前的模块中有关于分层K折交叉验证的信息,讨论了如何进行交叉验证。这里有一个模型列表,这些模型。
这些都是你想要组合在一起的。因此,我正在构建一个克拉斯分类器的集成,基本上是构建我们上面提到的人工神经网络。随机森林分类器运行了几次,还有额外的树,这是一种随机森林,然后还有梯度提升。
我加载我的数据集,然后在这些模型上运行,并构建集成。我还有其他视频会链接到这些内容,深入讲解这背后的机制。总体上,发生的事情是构建了一个数据集,其中每个模型的预测都是一列。因此,我们有一个。
2,3,4,56,7,我们有7个这样的。你将基本上有七列,Y将是真实的😊,来自数据集,生物反应是否发生。你实际上是在所有这些上训练线性回归。因此,利用所有这些分类器的输出和预测来预测实际的输出。
你正在将这些模型用作另一个模型的输入,即集成模型来形成预测,然后我们将其混合在一起。我们使用逻辑回归来实现这一点。这是一种线性回归。我们根据此建立适合度,最后基于线性回归的输出构建我们的预测文件。
在这里,你可以看到我们基本上正在查看这些不同模型类型的所有折叠,最后它将给出你实际上会发送给Cagel的最终提交文件。感谢你观看本视频,在下一个视频中,我们将对构成神经网络的所有超参数进行调查,看看你如何更好地优化这些参数。
该内容经常变化。因此,请订阅频道,以便随时了解本课程和其他人工智能主题的最新动态。😊!
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P44:L8.3- Keras神经网络结构搭建细节与超参数 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿。欢迎来到华盛顿大学的深度神经网络应用课程。在这个视频中,我们将回答一个我相信在整个学期里困扰着你的问题。你如何知道在神经网络中使用多少层?你如何知道在神经网络中使用多少个神经元?😊
这是一个足够大的问题,我们将花接下来的两个视频来讨论。有关我AI课程和项目的最新信息,请点击订阅并按旁边的铃铛,以便在每个新视频发布时收到通知。对此问题真的没有简单的答案。通过各种模块查看神经网络,你会看到我们有各种层和激活类型。
有不同的方法进行归一化,不同的激活函数,以及你可以在神经网络上调整的各种参数。神经网络自身有很多这些被称为神经网络的权重。然而,超参数并不是作为神经网络训练的一部分学习的,而是由你这个神经网络从业者来指定的。因此,作为神经网络从业者,你需要指定你想要的激活函数、正则化等所有这些内容。在接下来的部分中,我们将看到如何使用称为贝叶斯优化的方法来帮助我们微调神经网络。
但即便如此,仍然有一定程度的决定权,至少在你这边。要决定你要优化哪些超参数以及你想如何优化它们。在这一部分中,我将带你了解到目前为止我们讨论的主要超参数、层类型以及其他内容,如果你觉得我们没有涵盖到的内容,你也要知道。因此,在你构建神经网络时,Keras的层。
你会看到各种示例将不同类型的层添加到神经网络中,这里列出的是你可以在构建的序列中添加的所有层类型,最终或许放入模型中,如果你使用功能性API激活,这是一个允许你指定激活函数的层。我通常不太使用这个层,而是倾向于将激活函数作为全连接层和其他层类型参数的一部分来指定,但你可以将其分开。
激活发生在层活动正则化之后。这允许你在层之外添加L1和L2。再说一遍,L1和L2,作为活动和内核可以添加到诸如全连接层等单独的层类型中,但如果你发现将其放在层之外更方便,也可以这么做。
密集层。这无疑是表格数据的主力军。这基本上是你神经网络的构成部分,如果你处理表格数据。如果你处理图像和其他事物,仍然会有密集层。如果你处理非密集层,如LSTM层和卷积层。
你通常需要先扁平化。这是一个层类型,在将数据输入密集层之前。丢弃层允许你使用丢弃正则化。你通常指定一个相对较低的百分比,可能是5%,10%,20%。这就是在训练期间随机禁用该层中神经元的百分比。
在实际运行神经网络时,丢弃没有效果。当你计算要丢弃的神经元百分比时,这不是一个可学习的参数。你必须在构建神经网络时指定这一点。Flatten通常在密集层之前或在输出之前使用,用于将多维张量(不是向量,如矩阵和立方体)压缩为可以传递给不设计处理多维输入的层的向量。
输入层是数据进入神经网络的地方。
这可以作为参数为密集层或其他层指定。Lambda层。我实际上没有太多使用这些,但你基本上可以指定一个Python Lambda函数,对数据进行一些转换,通过掩码层。
这实际上是我没有使用过的东西,所有的确切信息我也不太清楚。但它是可用的,处理时间步。我猜这在处理递归神经网络中的LSTM时会有一些用处。对于排列也是如此,可以用于为给定模式添加一些随机性和变化。
我不太确定排列是否随机。我认为排列不是随机的。就像我刚才说的,排列是一种在层处理时改变维度的方式。这与重塑工作原理非常相似。我通常使用重塑而不是排列。我没有大量使用排列,重复向量是一种复制事物的方式。
我没有大量使用那种。重塑。我使用得很多,这让你在数据处理时改变事物的结构。😊例如,你的RGB值的顺序与神经网络预期的不同,排列可能是一个很好的选择,而重塑只是改变实际形状,而不一定过于关注顺序。空间丢弃是用于卷积层的丢弃,我没有大量使用这些激活函数。
激活函数在神经网络中是一个非常重要的话题。需要记住的是,激活函数有很多历史,神经网络存在已久,各种激活函数在这些年里被添加到网络中,其中一些在现代深度学习中并不常用。
你还会注意到我在这里有先进的激活函数。先进的激活函数是在拟合过程中实际上被修改的函数。常规激活函数仅是训练过程的一部分,但训练过程并不会影响实际激活函数内部的任何参数。
所以 softm 激活函数通常在多类分类的输出层上看到。这确保了来自神经网络的所有输出总和为一。因此,它们本质上是概率,这里没有太多调整。要么你在使用 softmax,要么你不在使用,如果你在使用多类分类。
很可能你在使用 softm。现在,很多这些来自各种被细致复制的论文,EU 是其中之一。这是我见过的指数线性单元。我在一些关于 Gs 和其他内容的论文中看到了它们,我没有太多接触这些。
我打算更多地研究这些。它们在理论上似乎确实有一些优势,可能在重缩放的指数单元方面类似于 ELU,只是通过一个数值值进行缩放,这是另一个超参数,你需要指定你想要缩放的因子。缩放因子简单地乘以 SL,因此加上这个是一个历史性的函数,我没有在后来的论文中看到它很多使用,soft sign 修正线性单元 Rlu 也是如此,绝对是深度学习的主力军,除了可能是泄漏的 re,在后面是双曲正切,使用得不多。
我在 LSTM 中看到了这些,在 RE 强劲出现之前,它们在隐层中非常受欢迎,sigmoid 也是如此。经典神经网络的隐层中常见,但在现代神经网络的隐层中不常用。然而,sigmoid 在逻辑回归输出神经网络中仍然非常常见,基本上是一个在两者之间分类的二分类器,hard sigmoid 我最近没有看到很多使用。
它的工作方式就像 sigmoid 函数,sigmoid 函数计算开销很大,因为其中有两个 EP 函数。hard sigmoid 更像是 logistic 的 sigmoid 的一种近似。因此,它在计算上可能更便宜。也许在移动设备上,这可能是个好主意。我没有深入处理这个指数。
这是另一个我没有太多接触的,但它是一个基本的 Eactation 函数。根据文档,这个函数是线性的。这在回归神经网络的输出层中使用得很多,除非你正在做一些非常自定义的事情,否则我认为你不太可能在输出层以外的地方看到它。基本上,你需要通过某个东西传递激活函数,以确保它不做任何更改。
Leaky ReLU 是其变体,它允许非常小的梯度,因此在训练过程中对梯度有一些特殊规则。这是一个非常流行的选择,我在某种程度上使用过,但在所有情况下并没有看到显著的改善。Preu,我在这方面有一些不错的结果,leaky ReLU 中有一个 alpha 项,你通常需要指定,但你可以实际上学习到这一点。因此,这是一件好事。L1、L2 和 dropout,我在深度学习中不太看到 L1 和 L2 的广泛使用,L2 是肯定的,L1 则不那么多,尤其是在视觉网络中,我认为你并不想丢弃输入,比如丢弃单个像素,所以我并不经常看到 L1 的使用。
L2 可能有一些价值,但 dropout 实际上是这些深度神经网络的主力。在我阅读的论文中,你可以利用一些贝叶斯优化来计算 dropout 百分比,我将在下一部分展示。批量归一化,我在某种程度上也在玩这个,并且越来越多地使用它,它非常方便,通常在实践中,至少我观察到,可以让我将学习率提高到过去会导致不稳定的值。因此,如果你将学习率设置得过高,通常会在一些反向传播步骤甚至前向传播步骤中导致溢出,这取决于你的激活函数,这会导致 NANs(非数字),几乎会使你的训练崩溃。因此,批量归一化对此非常有用,也是解决消失梯度问题的一种方法。
如果学习率降到零,什么也学不到。你还需要利用各种训练参数,特别是批量大小和学习率。小批量在深度学习中非常流行。因此,通常这个值是 32 或更低,而学习率通常也比较小,除非你在使用批量归一化。
但你需要在学习率和批量归一化之间进行一定的调整,以查看学习率需要多小。学习率过小会导致神经网络根本无法学习,过高则会导致神经网络迅速不稳定。
所以如果你看到神经网络的误差函数报告为 NA AN,通常是因为你的学习率太高。我几乎总是将学习率指定为 10 的负 10 次幂,因此在这种情况下是 10 的 1 次幂乘以 10 的负 3 次幂。
现在我这里的这个函数,我们将在下一部分更多地使用这些。让我们快速看看如何尝试一些超参数。我将运行这个,它会加载我想要做的分类任务。
这是使用我们之前看到的简单数据集。这评估了神经网络。现在这是使用自助法,就像我们之前看到的。splits是我们实际想要多少个自助法分割。我使用两个,这样运行相对快速,但你可以对此进行实验。
在调整超参数时,有时会有一些参数,通常不太多,涉及超参数的调整,或者几乎是超参数的平方。但这将是你在搜索时需要设置的一个参数。这是另一个。
我在这里做的基本上是允许这些值存在。我试图将非常复杂的神经网络超参数转化为数值和向量。因此,dropout将是我们一次调优的四个值中的第一个。Learn rate是神经网络的学习率。
neuron percent仅仅是我们想使用的这500个中的百分比,neuron shrink是每次该层应该收缩的值。因此我们从该神经元计数的neuron percent开始,然后每次按该值收缩。所以如果你想在下一个中使用80%,可以设为0.8。你可以看到,只要每个新层的神经元计数为25且小于10,就会持续构建。
实际评分需要几分钟,并将在下一部分中使用,因为相信我,进行贝叶斯优化时,将神经网络超参数作为一个向量是非常有价值的。你在这里放入了相当多的额外超参数,如果你处理的是视觉网络,可能还想做卷积层计数等,因此这仍在运行,我会继续,哦,刚完成,忽略那个错误,我会修复,它只是尝试记录这所需的时间,这是一个0的日志损失。
7,我们将在下一部分看到,实际上我们会调整它以降低到0.59,这样的日志损失要好得多,忽略负值,下一部分我会解释这为何必要,这样我们才能优化,因为它想要最大化这个数字,而你并不是试图最大化日志损失,而是试图最小化它。
这些是构成神经网络的超参数,可能看起来令人生畏,试图独自优化这些,我们将在下一个视频中看到,可以使用贝叶斯超参数优化,让机器学习为我们完成许多工作,这个内容经常变化,所以订阅频道以保持课程和其他人工智能主题的最新信息。
T81-558 | 深度神经网络应用-全案例实操系列(2021最新·完整版) - P45:L8.4- 基于Keras的贝叶斯超参数优化 - ShowMeAI - BV15f4y1w7b8
嗨,我是杰夫·希顿。欢迎来到华盛顿大学的深度神经网络应用。在这段视频中,我们将看看如何使用贝叶斯优化来告诉你如何为你的神经网络架构设计。有关我最新的AI课程和项目的信息。
点击订阅和旁边的铃铛,以便在每个新视频发布时获得通知。现在我们要看看贝叶斯超参数优化。相信我,这在Kaggle上是非常重要的,这就是你如何优化超参数。我们之前多次讨论过的超参数就是你需要为特定模型设置的那些东西。几乎所有模型类型在某种程度上都有超参数,神经网络有隐藏层的数量、神经元计数,如果你使用批量正则化,还有许多其他因素。
基本上,这里有两个方面。一个是参数,另一个是超参数,超参数是神经网络的权重和其他将由反向传播为你调整的东西。😊。
期望你进入神经网络并手动设置每个权重。自80年代以来他们就没有这样做了。然而,你确实需要设置你的超参数。反向传播不会为你去删除层或添加层或其他事情。你必须自己设置这些,或者使用像贝叶斯超参数优化这样的东西。现在,贝叶斯超参数优化是众多方法之一。
许多,许多优化算法。大多数这些优化算法的工作方式是简单地取一个向量或一个很长的数字列表,并调整这些数字,以使某个目标函数最小化或最大化。这就是反向传播所做的,反向传播基本上使用导数和微积分,根本上是梯度下降来调整这些权重,以最小化你的误差函数。你不能使用反向传播。
调整你的神经网络的隐藏层或隐藏层计数,因为隐藏层的数量和神经元的数量不是误差函数的一部分,并且也不可微分。你无法对你有多少个隐藏层进行求导。因此,你需要在可微分优化函数之上使用一个不可微分的优化函数。
反向传播通常用于神经网络。原子更新规则,这是反向传播的一种变体。所以我们需要做的是,如我们在本模块的前一部分中看到的,我们将创建一个基于传递给它的向量创建神经网络的函数。
所以简单回顾一下我们在前一个部分中所讨论的内容,我们将继续运行这个,它使用的是我之前给你的简单数据。我们试图用神经网络解决的内容并不重要,然后我将运行这个部分来评估神经网络。
现在它需要一点时间来运行。所以我们将继续让它运行。看到星星表明它确实在运行。你传递给它各种参数,包括学习率、神经元百分比和神经元缩减,这最后两个不是标准的超参数或Tensorflow概念,而是我在这里引入的概念,以便将其转化为一个向量。因此,我们现在有一个四个数字的向量,我们正在尝试优化。你可能想在里面放更多,但我们基本上将向你展示它们的工作原理。
因此,神经元的数量基本上将是这个神经元百分比。所以这个神经元百分比是我们最大5000个神经元中的百分比。遗憾的是,这5000个神经元是我们设定的一个数字,因此这是一个超超参数,但。
你必须设定某种上限。因此,这是我能做到的最好。顺便说一下,Sps是我们评估这一点的次数,因为神经网络是随机的,每次训练时你都会得到不同的结果,所以我把它设得相当低。
你可能想把它设得更高,以便实际上得到更好的结果。因此,我们得到我们的神经元数量,然后这个神经元缩减基本上是大多数神经网络以金字塔样式设置它们的隐藏层,这样你要么从一大堆开始,要么减少。
更少,更少,或者你开始时有一些,更多更多更多的表格数据通常并不是固定的。但通常你会从相当数量的隐藏神经元开始,并在前进过程中减少。就是这样我基本上在做的事情。我有一个神经元。我有神经元的数量,然后我们将在这里使用神经元缩减,实际构建神经网络。
我们将增加到所需的层数,只要不超过10层。再一次,这是另一个潜在的超参数,只要我们至少有25个神经元,我们将继续。因此,这基本上是在选择神经元百分比,这告诉我们整体将有多少个神经元,然后是神经元缩减,这告诉我们缩减的速度来构建这种金字塔风格。所以我们可能在第一个层中从a00开始,然后如果缩减为0。
我们将缩小到 80%。所以下一个将是 800,然后我们每次都会以这个数值继续缩小,我们还有 dropout 百分比和学习率,所以我们将使用贝叶斯优化来优化所有这些。我没有在上面定义我的小时和分钟字符串,这本来可以告诉我实际计算花了多长时间,所以这并不重要,但我们得到的对数损失是负 62。使用负值的原因是。
对数损失。你会看到那里。我有一个负号在那。之所以这样做是因为贝叶斯优化想要最大化。你不想最大化对数损失。所以翻转一下实际上使得它最小化。现在,为了看到我们在这一部分想要运行的部分,我需要在贝叶斯优化的界限中设置一些值。哦,还有一件事,如果贝叶斯优化器还没有安装,你需要安装它,那个 Pip 命令会为你安装,如果已经安装了,它会告诉我要求已满足。
这很好,我已经安装好了,这些界限表示 dropout 可以在 0 到 0.499 之间。顺便说一下,0.499 已经是一个相当高的 dropout 了,我现在就要运行这个。实际上,这可能需要一些时间来运行,所以我不会真的运行它,我只是给你们展示我们在这里得到的最佳值。
所以在这里,我们将 dropout 范围设置在 0 到 0.499 之间,学习率在 0.0 和 0.1 之间。这可能是相当合理的。神经元百分比,我们在 1% 到 100% 的全范围之间,任何中间值神经元缩减,再次是完整的百分比范围。所以这四个是我们尝试优化的。
这就是贝叶斯优化的整个技巧。你需要将其转换为一个向量,以总结所有的超参数。所以我并没有真正放入每个超参数,比如每行有多少行和每个隐藏层中有多少神经元,我应该称它们为隐藏层。
现在这是一个单一的向量。实际上,你可以为此使用任何优化器。任何不需要导数的优化器。因此,你可以使用遗传算法、Nelder-Mead 等。然而,贝叶斯优化的一个很好的地方是,它使得你的优化函数、你的目标函数被调用的次数相对较少,因为。
这里的目标函数非常昂贵。它训练一个神经网络。所以这可能会持续很多分钟甚至几个小时。这就是为什么贝叶斯优化被认为比其他很多方法更好的原因,比如 Nelder-Mead 或其他类似方法。它在实际调用次数上非常高效。
然后你将构建贝叶斯优化器。你给出我们在上面定义的评估网络的函数。我们传入P的边界。我们将使其相当详细。我将继续运行它,以便我们可以看到一些结果。我们无法将其运行到整个电视,因为这会花费很长时间。
然后我们要这样做,由于我们设定为详细模式2。你会看到它已经开始构建这个了。现在你可以看到第一轮已经完成。日志损失在74左右,这并不是特别好。经过几个小时的运行。顺便说一下,我们达到了这个。当我稍后解释。
随机状态仅仅是一个种子。现在这里很重要。你有一个点的数量和😊,迭代的数量。这与整个多臂强盗优化有关。你可以想象一下这个多臂强盗,如果你以前没听说过,它来自赌场。
老丨虎丨机。假设你有一排老丨虎丨机,就像这样,你必须在利用和探索之间进行优化。探索意味着尝试这一组中的不同老丨虎丨机,因为有一个老丨虎丨机可能比其他的更慷慨。利用意味着一旦你找到一个相当慷慨的老丨虎丨机,就花时间不去探索其他的。
拉动那个老丨虎丨机的手臂,尽可能多地赢取钱。回顾代码。我们可以看到10,这是利用。所以这就是我们将要观察的点的数量。可以说我们将尝试10个老丨虎丨机。然后一旦我们专注于一个表现不错的,我们将深入足够,利用到100次迭代。
在这里你可以看到它继续运行。它会告诉你,好吧,第二次。迭代我们锁定在一个稍微更好的选项上。这将导致大约110行,因为你有10加100。然后当我运行这个全时间段时,得到的最佳结果是日志损失59,这实际上比我手动优化那些超参数要好得多,而且我甚至没有把每个超参数都放进来。你绝对可以制作那个向量。你可以将那个向量增加到10或20,想出更多创造性的方式来拆分和编码那些超参数,编码神经网络的架构,在这里你可以看到基本的最佳参数。
我们最终喜欢大约13的 dropout 率,学习率相当低0.01,神经元百分比相当低,而且不是一个巨大的神经网络,每次缩小约30%。这可能对你的 Kaggle 竞赛有用,你可能想用来优化你的超参数。不仅仅是针对你的神经网络,如果你使用其他模型类型也是如此。感谢你观看这个视频,下一个是课程内容,变化频繁,所以请保持更新,关于人工智能。