从0到1实现2种Keras建模网络
本文介绍两种基于Keras的建模方法:
- 基于Sequential的建模;快速方便,易上手
- 基于函数式API的建模;易于扩展,灵活性强
主要知识点
通过本文你将学到下面9个实用的知识点,掌握基于Kera搭建神经网络模型的流程:
- 如何导入keras的内置数据集
- keras如何实现one-hot编码
- 如何定义keras的Sequential模型,包含卷积层、池化层、Dropout层等
- 如何各个层基本信息,比如层的名称、权重、形状等
- 模型的编译、训练
- 如何将模型的精度和准确率指标进行可视化
- 如何使用TensorFlow的Tensorboard进行可视化
- 如何搭建基于函数式API的keras模型
- 如何将网络结构图进行可视化
导入内置数据集
1 | # 导入数据集 |
Out[1]:
1 | ((50000, 32, 32, 3), (10000, 32, 32, 3), (50000, 1), (10000, 1)) |
可以看到cifar服装图片数据集存在50000个训练样本,10000个测试样本;数据集是四维的。
数据缩放和标签编码
神经网络中一般输入较小的数值,需要对数据进行缩放:
1 | # 将像素的值标准化至0到1 |
同时对标签labels进行one-hot编码:
1 | # 标签编码 |
搭建Sequential网络模型
搭建基于Sequential的网络模型:
1 | import tensorflow as tf |
在多分类问题的最后全连接层中,激活函数使用softmax函数;它输出的是每个分类的概率值,且它们的概率之和为;取最大的概率所在的类。
查看网络信息
查看所搭建的网络层的基本信息:
总层数
In [5]:
1 | len(model.layers) # 总层数 |
Out[5]:
1 | 10 |
每层网络名
In [6]:
1 | for i in range(len(model.layers)): |
每层形状
In [7]:
1 | for i in range(len(model.layers)): |
显示各层权重形状
In [8]:
1 | for i in range(len(model.layers)): |
In [9]:
1 | # 同时显示网络层名称、input和output |
显示模型信息
In [10]:
1 | model.summary() # 显示模型信息 |
编译模型
网络编译的时候通常需要指定3个参数:
- 优化器optimizer
- 损失函数loss
- 评价指标metrics
In [11]:
1 | model.compile(optimizer='rmsprop', |
回调函数
在使用TensorBoard的时候需要
In [12]:
1 | # 后面tensorborad使用需要 |
存放路径为当前路径下的logs文件夹下
训练模型
1 | history = model.fit(train_images, # x |
当verbose=1的时候会显示每轮训练的具体信息:
指标可视化
In [14]:
1 | history_data = history.history # 字典形式 |
In [15]:
1 | loss = history_data["loss"] |
In [16]:
1 | # 1、损失loss |
1 | # 2、精度acc |
tensorboard使用
首次使用的时候需要加载两个环境:
In [18]:
1 | %load_ext tensorboard |
In [19]:
1 | %tensorboard --logdir logs |
然后面notebook页面会直接显示Tensorboard:
显示的内容就是每轮的loss和acc。除此之外,你也可以通过localhost:6006
到本地网页查看:
构建函数式模型
上面的模型是基于Sequention;下面对比构建出基于函数式API的等效模型:
1 | from keras.models import Model |
打印出来的效果:
1 | Model: "model" |
网络可视化
通过keras自带的plot_model能够绘制出当前模型的框架。
首先需要安装两个库:graphviz
可能你会遇到些困难;特别是在windows系统下,希望你有耐心解决。
1 | pip install pydot |
安装完成之后在命令行输入dot -version
出现下面的界面则表示安装成功:
然后就可以绘图了:
1 | from keras.utils.vis_utils import plot_model |