字幕组双语原文: 2入门指南,初学者必备!
英语原文: with 2
翻译:雷锋字幕组(赟瑾和鸣、大表哥)
什么是?
是谷歌推出的深度学习框架,于2019年发布了第二版。 它是世界上最著名的深度学习框架之一,被行业专家和研究人员广泛使用。
v1难以使用和理解,因为它的较少,但是随着Keras发行的v2现在与.keras完全同步,它易于使用,易学且易于理解。
请记住,这不是有关深度学习的文章,所以我希望您了解深度学习的术语及其背后的基本思想。
我们将使用非常著名的数据集IRIS数据集探索深度学习的世界。
废话不多说,我们直接看看代码。
导入和理解数据集
from .
iris =
现在,这个 iris 是一个字典。 我们可以使用下面的代码查看键值
>>> iris.keys
([‘data’, ‘’, ‘frame’, ‘’, ‘DESCR’, ‘’, ‘’])
因此,我们的数据在 data 键中,目标在 targe 键中,依此类推。 如果要查看此数据集的详细信息,可以使用 iris[ ['DESCR']。
现在,我们必须导入其他重要的库,这将有助于我们创建神经网络。
from . #to split data
numpy as np
as pd
. as plt
as tf
from .keras. Dense
from .keras.
在这里,我们从中导入了2个主要的东西,分别是Dense和。 从.keras.导入的Dense是紧密连接的一种层。 密集连接的层意味着先前层的所有节点都连接到当前层的所有节点。
是Keras的API,通常称为 API,我们将使用它来构建神经网络。
为了更好地理解数据,我们可以将其转换为数据帧。 我们开始做吧。
X = pd.(data = iris.data, = iris.)
print(X.head)
X.head
请注意,这里我们设置了 = iris.,其中是具有所有4个特征名称的键。
同样对于目标,
y = pd.(data=iris., = [‘’])
y.head
要查看目标集合中的类数量,我们可以使用
y..
这里我们可以看到我们有3个类,每个类都有标签0、1和2。
iris. #它是iris词典的键值
这些是我们必须预测的类名称。
机器学习的数据预处理
目前,机器学习的第一步就是数据预处理。数据预处理的主要步骤是:
缺失值
为了检查是否存在缺失值,我们可以用来进行检查工作。
这样我们就可以看到我们(很幸运地)没有缺失值,并且所有特征都是格式的。
分割为训练集和测试集
为了将数据集分割为训练集和测试集sklearn神经网络,我们可以使用先前已经引入过的.中的。
, , , = (X,y, =0.1)
其中是一种声明,它说明我们希望整个数据集的10%被用来做为测试数据。
数据的标准化
一般情况下,当数据的偏差非常大的时候,我们会对数据进行标准化。为了查看偏差值,我们可以使用.中的var函数来检查所有列的偏差值。
.var, .var
这样我们便可以看到,和的偏差值都非常低,因此无需对数据进行标准化。
将分类数据转换为一个独热向量
因为我们知道我们的输出数据是已经使用iris.检查过的3个类之一,所以好消息是,当我们加载目标时,它们已经是0、1、2格式,其中0=1类,1=2类,依此类推。
这种表示方式的问题在于,我们的模型可能会赋予越高的数字更高的优先级,这可能会导致结果有偏差。 因此,为了解决这个问题,我们将使用单热点表示法。 你可以在这里了解更多关于一个热门载体的信息。 我们可以使用内置的KERS ,也可以使用中的。 我们将使用。
= tf.keras.utils.()
= tf.keras.utils.()
我们将只检查前5行,以检查它是否已正确转换。
[:5,:]
是的,我们已经把它转换成了独热的表达方式。
最后一件事
我们可以做的最后一件事是将我们的数据转换回Numpy数组,这样我们就可以使用一些额外的函数,这些函数将在稍后的模型中对我们有所帮助。 要做到这一点,我们可以使用
= .
= .
让我们看看第一个训练示例的结果是什么。
[0]
在这里,我们可以看到第一个训练示例中4个特征的值,它的形状是(4),
当我们在它们上使用时,我们的目标标签已经是数组格式。
机器学习模型
现在,我们终于准备好创建我们的模型并对其进行训练。 我们将从一个简单的模型开始,然后我们将转到复杂的模型结构,在那里我们将介绍Keras中的不同技巧和技术。
让我们对我们的基本模型进行编码
= #
首先,我们必须创建一个对象。 现在,要创建一个模型,我们所要做的就是根据我们的选择添加不同类型的层。 我们将制作一个10层的Dense层模型,这样我们就可以观察到过拟合,并在以后通过不同的正则化技术来减少它。
.add( Dense( 64, = 'relu', = [0].shape))
.add( Dense (128, = 'relu')
.add( Dense (128, = 'relu')
.add( Dense (128, = 'relu')
.add( Dense (128, = 'relu')
.add( Dense (64, = 'relu')
.add( Dense (64, = 'relu')
.add( Dense (64, = 'relu')
.add( Dense (64, = 'relu')
.add( Dense (3, = '')
请注意,在我们的第一层中,我们使用了一个额外的参数。 此参数指定第一层的尺寸。 在这种情况下,我们不关心训练示例的数量。 相反,我们只关心功能的数量。 因此,我们传入任何训练示例的形状,在我们的示例中,它是(4,)在内。
请注意,我们在输出层中使用了(激活函数),因为它是一个多类分类问题。 如果这是一个二进制分类问题,我们会使用激活函数。
我们可以传入任何我们想要的激活函数,如或或tanh,但实验证明relu在这类模型中表现最好。
现在,当我们定义了模型的形状后,下一步是指定它的损耗、优化器和度量。 我们在keras中使用方法指定这些参数。
pile(='adam', loss= 'ropy', = ['acc'])
在这里,我们可以使用任何优化器,如随机梯度下降、等,但我们将使用Adam。
我们在这里使用PY是因为我们有一个多类分类问题,如果我们有一个二进制分类问题,我们将使用。
衡量标准对于评估一个人的模型是很重要的。 我们可以根据不同的度量标准来评估我们的模型。 对于分类问题,最重要的衡量标准是准确度,它表明我们的预测有多准确。
我们模型的最后一步是将其匹配到训练数据和训练标签上。 让我们对它进行编码。
= .fit(, , = 40, =800, = 0.1
fit返回一个回调,其中包含我们训练的所有历史记录,我们可以使用它来执行不同的有用任务,如绘图等。
历史回调有一个名为的属性,我们可以将其作为.进行访问,这是一个包含所有损失和指标历史的字典,即sklearn神经网络,在我们的示例中,它具有Loss、Acc、和的历史记录,并且我们可以将每个单独的历史记录作为 ..loss 或 .[''] 等进行访问。
我们有一个指定的epoch数为800,batch大小为40,验证拆分为0.1,这意味着我们现在有10%的验证数据,我们将使用这些数据来分析我们的训练。 使用800个epoch将过度拟合数据,这意味着它将在训练数据上执行得非常好,但在测试数据上则不会。
当模型进行训练时,我们可以看到我们在训练集和验证集上的损失和准确性。
在此,我们可以看到,训练集上的准确率是100%,验证集上的准确率则为67%,这对于这样一个模型来说已经很出色了。接下来就让我们画出图像。
plt.plot(.['acc'])
plt.plot(.[''])
plt.('')
plt.('Acc')
plt.(['', ''], loc='upper right')
我们可以很清楚地看到,训练集上的准确率要比验证集上高得多了。
类似地,我们用如下方法画出损失:
plt.plot(.['loss'])
plt.plot(.[''])
plt.('')
plt.('Loss')
plt.(['', ''], loc='upper left')
在此,我们可以很清楚地看到,验证集上的损失比训练集上要大得多了,这是因为数据被过拟合了。
为了看看模型的表现是不是好,我们可以使用model.来查看。我们要将数据和标签放入评估函数中。
.(, )
这样,我们就可看到模型的准确率为88%,这对于一个过拟合的模型来说已经很好了。
正则化
让我们通过将正则化添加到我们的模型中来使它变得更好。 正则化将减少我们模型的过度拟合,并将改进我们的模型。
我们将在我们的模型中添加L2正则化。 单击 此处了解有关L2正则化的更多信息。 要在我们的模型中添加L2正则化,我们必须指定要添加正则化的层,并给出一个附加参数,然后传递tf.keras..l2。
我们还将在我们的模型中实现一些,这将帮助我们更好地减少过拟合,从而获得更好的性能。 要阅读更多关于背后的理论和动机,请参阅这篇文章。
让我们重新定义这个模型吧。
=
.add(Dense(64, = 'relu', = [0].shape))
.add( Dense(128, = 'relu', =tf.keras..l2(0.001)
))
.add( Dense (128, = 'relu',=tf.keras..l2(0.001)
))
.add(tf.keras..(0.5)
.add( Dense (128, = 'relu', =tf.keras..l2(0.001)
))
.add(Dense(128, = 'relu', = tf.keras..l2(0.001)
))
.add( Dense (64, = 'relu', =tf.keras..l2(0.001)
))
.add( Dense (64, = 'relu', =tf.keras..l2(0.001)
))
.add(tf.keras..(0.5)
.add( Dense (64, = 'relu', =tf.keras..l2(0.001)
))
.add( Dense (64, = 'relu', =tf.keras..l2(0.001)
))
.add( Dense (3, = '', =tf.keras..l2(0.001)
))
如果你仔细观察,我们所有的层和参数都是一样的,除了我们在每个dense层中增加了2个层和正则化。
我们将保留所有其他东西(损失、优化器、epoch等)一样。
pile(='adam', loss='ropy', =['acc'])
= .fit(, , =800, =0.1, =40)
现在让我们评估一下模型。
你猜怎么着? 通过加入正则化和层,我们的准确率从88%提高到94%。 如果我们增加了BN层,它将会进一步改善。
让我们把它画出来。
准确率
plt.plot(.['acc'])
plt.plot(.[''])
plt.title(' vs. ')
plt.('Acc')
plt.('Epoch')
plt.(['', ''], loc='lower right')
plt.show
plt.plot(.['loss'])
plt.plot(.[''])
plt.title('Loss vs. ')
plt.('Loss')
plt.('Epoch')
plt.(['', ''], loc='upper right')
plt.show
洞见
如此一来,我们就非常成功地改善了模型的过拟合,并且将模型准确率提升了几乎6%,这对于一个小数据集来说是很好的改善。
雷锋字幕组是由AI爱好者组成的志愿者翻译团队;团队成员有大数据专家、算法工程师、图像处理工程师、产品经理、产品运营、IT咨询人、在校师生;志愿者们来自IBM、AVL、Adobe、阿里、百度等知名企业,北大、清华、港大、中科院、南卡罗莱纳大学、早稻田大学等海内外高校研究所。