在这个方案中,我们将在Keras中预测花的种类。
Keras是一个(深度)神经网络模型的高级接口,它可以使用TensorFlow作为后端,也可以使用微软认知工具包(CNTK)、Theano或PlaidML。Keras是一个开发AI模型的接口,而不是一个独立的框架本身。Keras已经作为TensorFlow的一部分被集成,所以我们从TensorFlow导入Keras。TensorFlow和Keras都是开源的,由Google开发。由于Keras与TensorFlow紧密集成,Keras模型可以保存为TensorFlow模型,
然后部署在Google的部署系统TensorFlow Serving中(见https://www.tensorflow.org/tfx/guide/serving),或者从任何编程语言中使用,如,C++或Java。
1. 运行以下代码 如果你熟悉Keras,你会认识到它是锅炉模板。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import tensorflow as tf
def create_iris_model():
'''
Create the iris classification model
'''
iris_model = Sequential()
iris_model.add(Dense(10, activation='selu', input_dim=4))
iris_model.add(Dense(3, activation='softmax'))
iris_model.compile(
optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy']
)
iris_model.summary()
return iris_model
iris_model = create_iris_model()
这就产生了下面的模型构造:
我们可以用不同的方式来可视化这个模型。我们可以使用内置的Keras功能,如下所示:
dot = tf.keras.utils.model_to_dot(
iris_model,
show_shapes=True,
show_layer_names=True,
rankdir="TB",
expand_nested=True,
dpi=96,
subgraph=False,
)
dot.write_png('iris_model_keras.png')
这将网络的可视化写入一个名为iris_model_keras.png的文件。生成的图像是这样的。
这表明我们有4个输入神经元,10个隐藏神经元和3个输出神经元,以前馈方式完全连接。这意味着输入中的所有神经元都会向隐藏层的所有神经元输入,而隐藏层的神经元又会向输出层的所有神经元输入。
我们使用的是顺序模型结构(与图相对)。顺序模型类型比图型更容易建立。各层的构造方式是一样的;但是,对于顺序模型,你必须定义输入维度,input_dim。
我们使用两个致密层,中间层使用SELU激活函数,最后一层使用softmax激活函数。我们将在How it works...部分解释这两个问题。至于SELU激活函数,现在只需要说它提供了一个必要的非线性,这样神经网络就可以处理更多的不可线性分离的变量,就像我们的案例一样。在实践中,很少在隐藏层中使用线性(身份函数)激活。
最后一层中的每个单元(或神经元)对应三个类中的一个。softmax函数对输出层进行归一化,使其神经激活加起来为1。我们用分类交叉熵作为损失函数进行训练。交叉熵通常用于神经网络的分类问题。二进制交叉熵损失是针对两个类,而分类交叉熵是针对两个或多个类(交叉熵将在How it works...部分详细解释)。
2. 接下来,对特征进行一热编码。
这意味着我们有三列,每列代表其中一个物种,其中一列将为对应的类设置为1。
y_categorical = tf.keras.utils.to_categorical(y, 3)
因此,我们的y_categorical具有(150,3)的形状。这意味着,为了表示类0作为标签,而不是有一个0(这有时会被称为标签编码或整数编码),我们有一个[1.0,0.0,0.0]的向量。这就是所谓的一热编码。每一行的总和等于1。
3. 对特征进行归一化。
对于神经网络来说,我们的特征应该被归一化,使激活函数能够处理整个输入范围--通常这种归一化是对标准分布的归一化,它的平均数为0.0,标准差为1.0。
X = (X - X.mean(axis=0)) / X.std(axis=0)
X.mean(axis=0)
这个单元的输出是这样的:
array([-4.73695157e-16, -7.81597009e-16, -4.26325641e-16, -4.73695157e-16])
我们看到每一列的平均值都非常接近于零。我们还可以用下面的命令查看标准差。
X.std(axis=0)
输出结果如下:
array([1., 1., 1., 1.])
标准差正好是1,正如预期的那样。
4. 在TensorBoard中显示我们的训练进度。
TensorBoard是一个用于神经网络学习的可视化工具,如跟踪和可视化指标、模型图、特征直方图、投影嵌入等。
%load_ext tensorboard
import os
logs_base_dir = "./logs"
os.makedirs(logs_base_dir, exist_ok=True)
%tensorboard --logdir {logs_base_dir}
此时,你的笔记本中应该会弹出一个TensorBoard小组件。我们只需要确保它获得所需的信息。
5. 把TensorBoard的细节作为回调插入Keras训练函数中 这样TensorBoard就能得到训练信息了。
import datetime
logdir = os.path.join(
logs_base_dir,
datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
)
tensorboard_callback = tf.keras.callbacks.TensorBoard(
logdir, histogram_freq=1
)
X_train, X_test, y_train, y_test = train_test_split(
X, y_categorical, test_size=0.33, random_state=0
)
iris_model.fit(
x=X_train,
y=y_train,
epochs=150,
callbacks=[tensorboard_callback]
)
这将运行我们的训练。一个epoch是数据集通过神经网络的整个通道。我们在这里使用了150个,这有点随意。我们可以使用一个停止标准,当验证和训练误差开始出现分歧时,或者换句话说,当过度拟合发生时,自动停止训练。
为了像之前那样使用 plot_confusion_matrix()进行比较,我们必须将模型包裹在一个实现 predict()方法的类中,并且有一个类的列表_和一个与分类器相等的_estimator_type 的属性。我们将在在线材料中展示。
6. 绘制混淆矩阵。
在这里,使用scikitplot函数比较方便。
import scikitplot as skplt
y_pred = iris_model.predict(X_test).argmax(axis=1)
skplt.metrics.plot_confusion_matrix(
y_test.argmax(axis=1),
y_pred,
normalize=True
)
再次,像之前一样,我们对矩阵进行归一化处理,所以我们得到了分数。输出的结果应该类似于下面的样子。
这比我们之前在scikit-learn中的尝试要差一些,但通过一些调整,我们可以达到一个相当的水平,甚至可能是更好的性能。调整的例子是改变模型的任何超参数,比如隐藏层的神经元数量,网络架构的任何变化(增加一个新层),或者改变隐藏层的激活函数。
7. 检查TensorBoard的图表:训练进度和模型图。这里是它们。
这些图分别显示了整个训练中的准确率和损失。我们还可以在TensorBoard中得到网络的另一种可视化。
这显示了所有的网络层、损失和度量、优化器(RMSprop)和训练例程,以及它们之间的关系。至于网络架构,我们可以看到四个密集层(呈现的输入和目标不被认为是网络的适当部分,因此用白色着色)。网络由一个密集的隐藏层(由输入端供给),和一个密集的输出层(由隐藏层供给)组成。损失函数是在输出层激活和目标之间计算的。优化器根据损失对所有层进行工作。你可以在TensorBoard上找到一个教程:https://www.tensorflow.org/tensorboard/get_started。TensorBoard文档中解释了更多关于配置和选项的内容。
因此,分类精度在不断提高,损失在训练纪元的过程中不断降低。最后一张图显示了网络和训练架构,包括两个密集层,损失和指标,以及优化器。
以上就是“Python中的人工智能入门:Keras的建模教程”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/11297/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取