大家好,本文从0到1详细讲解两种基于Keras的建模方法:

  • 基于Sequential的建模;快速方便,易上手

  • 基于函数式API的建模;易于扩展,灵活性强

文章目录

  • 你会学到什么?
  • 技术提升
  • 导入内置数据集
  • 数据缩放和标签编码
  • 搭建Sequential网络模型
  • 查看网络信息
    • 总层数
    • 每层网络名
    • 每层形状
    • 显示各层权重形状
    • 显示模型信息
  • 编译模型
  • 回调函数
  • 训练模型
  • 指标可视化
  • tensorboard使用
  • 构建函数式模型
  • 网络可视化

你会学到什么?

通过本文你将学到下面10个实用的知识点,快速掌握基于Kera搭建神经网络模型的流程:

  1. 如何导入keras的内置数据集

  2. keras如何实现one-hot编码

  3. 如何定义keras的Sequential模型,包含卷积层、池化层、Dropout层等

  4. 如何查看各个层基本信息,比如层的名称、权重、形状等

  5. 模型的编译、训练

  6. 如何创建回调函数并使用它

  7. 如何将模型的精度和准确率指标进行可视化

  8. 如何使用TensorFlow的Tensorboard进行可视化

  9. 如何搭建基于函数式API的keras模型

  10. 如何将神经网络结构图进行可视化

技术提升

本文由技术群粉丝分享,项目源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:dkl88191,备注:来自CSDN +研究方向
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

导入内置数据集

# 导入数据集
from keras.datasets import cifar10  (train_images, train_labels), (test_images, test_labels) = cifar10.load_data()  train_images.shape, test_images.shape, train_labels.shape, test_labels.shape

Out[1]:

((50000, 32, 32, 3), (10000, 32, 32, 3), (50000, 1), (10000, 1))

可以看到cifar服装图片数据集存在50000个训练样本,10000个测试样本;数据集是四维的。

数据缩放和标签编码

神经网络中一般输入较小的数值,需要对数据进行缩放:

# 将像素的值标准化至0到1
train_images, test_images = train_images / 255.0, test_images / 255.0

同时对标签labels进行one-hot编码:

# 标签编码
from keras.utils.np_utils import to_categorical  one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)

搭建Sequential网络模型

搭建基于Sequential的网络模型:

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense,Flatten,Conv2D,MaxPooling2D,Dropout,Activation,ZeroPadding2D
from tensorflow.keras import datasets, layers, models  # Sequential模型实例化
model = Sequential()
# 卷积层1
model.add(Conv2D(filters = 32,   # filters个数  kernel_size = (3,3),  # 卷积核大小  padding="same",  # 边界填充方式  input_shape=(32,32,3),  # 输入数据shape  activation="relu"  # 激活函数  ))
# Dropout层1
model.add(Dropout(0.25))  # dropout比例
# 最大池化层1
model.add(MaxPooling2D(pool_size=(2,2)))
# 卷积层2
model.add(Conv2D(64, kernel_size=(3,3), padding="same",activation="relu"))
# 最大池化层2
model.add(MaxPooling2D(pool_size=(2,2)))
# Dropout层2
model.add(Dropout(0.2))  # dropout比例
# 拉直层
model.add(Flatten())
# 密集连接层
model.add(Dense(128,activation="relu"))
# Dropout层3
model.add(Dropout(0.25))  # 输出层:10表示的最终数据的分类数目
model.add(Dense(10, activation="softmax"))  # 多分类使用softmax激活函数

在多分类问题的最后全连接层中,激活函数使用softmax函数;它输出的是每个分类的概率值,且它们的概率之和为;取最大的概率所在的类。

查看网络信息

查看所搭建的网络层的基本信息:

总层数

In [5]:

len(model.layers)  # 总层数

Out[5]:

10

每层网络名

In [6]:

for i in range(len(model.layers)):  print(f'第 {i + 1} 层网络名称:{model.layers[i].name}')
第 1 层网络名称:conv2d
第 2 层网络名称:dropout
第 3 层网络名称:max_pooling2d
第 4 层网络名称:conv2d_1
第 5 层网络名称:max_pooling2d_1
第 6 层网络名称:dropout_1
第 7 层网络名称:flatten
第 8 层网络名称:dense
第 9 层网络名称:dropout_2
第 10 层网络名称:dense_1

每层形状

In [7]:

for i in range(len(model.layers)):  print(f'第 {i + 1} 层网络shape:{model.layers[i].input.shape}')
第 1 层网络shape:(None, 32, 32, 3)
第 2 层网络shape:(None, 32, 32, 32)
第 3 层网络shape:(None, 32, 32, 32)
第 4 层网络shape:(None, 16, 16, 32)
第 5 层网络shape:(None, 16, 16, 64)
第 6 层网络shape:(None, 8, 8, 64)
第 7 层网络shape:(None, 8, 8, 64)
第 8 层网络shape:(None, 4096)
第 9 层网络shape:(None, 128)
第 10 层网络shape:(None, 128)

显示各层权重形状

In [8]:

for i in range(len(model.layers)):  print(i, model.layers[i].name, ":")  # 每层的名称  weights = model.layers[i].get_weights()  # 获取每层的权重  print(f'第{i}的权重层数: {len(weights)}')  for j in range(len(weights)):  # 每个网络的每层权重数  print("====>",j, weights[j].shape)
0 conv2d :
第0的权重层数: 2
====> 0 (3, 3, 3, 32)
====> 1 (32,)
1 dropout :
第1的权重层数: 0
2 max_pooling2d :
第2的权重层数: 0
3 conv2d_1 :
第3的权重层数: 2
====> 0 (3, 3, 32, 64)
====> 1 (64,)
4 max_pooling2d_1 :
第4的权重层数: 0
5 dropout_1 :
第5的权重层数: 0
6 flatten :
第6的权重层数: 0
7 dense :
第7的权重层数: 2
====> 0 (4096, 128)
====> 1 (128,)
8 dropout_2 :
第8的权重层数: 0
9 dense_1 :
第9的权重层数: 2
====> 0 (128, 10)
====> 1 (10,)

In [9]:

# 同时显示网络层名称、input和output  for i in range(len(model.layers)):  print(i, model.layers[i].name)  print(i, model.layers[i].input)  print(i, model.layers[i].output)  print("\n")

显示模型信息

In [10]:

model.summary() # 显示模型信息
Model: "sequential"
_________________________________________________________________  Layer (type)                Output Shape              Param #
=================================================================  conv2d (Conv2D)             (None, 32, 32, 32)        896         dropout (Dropout)           (None, 32, 32, 32)        0           max_pooling2d (MaxPooling2D  (None, 16, 16, 32)       0           )                                                                 conv2d_1 (Conv2D)           (None, 16, 16, 64)        18496       max_pooling2d_1 (MaxPooling  (None, 8, 8, 64)         0           2D)                                                               dropout_1 (Dropout)         (None, 8, 8, 64)          0           flatten (Flatten)           (None, 4096)              0           dense (Dense)               (None, 128)               524416      dropout_2 (Dropout)         (None, 128)               0           dense_1 (Dense)             (None, 10)                1290        =================================================================
Total params: 545,098
Trainable params: 545,098
Non-trainable params: 0
_________________________________________________________________

编译模型

网络编译的时候通常需要指定3个参数:

  • 优化器optimizer

  • 损失函数loss

  • 评价指标metrics

In [11]:

model.compile(optimizer='rmsprop',  # 优化器  loss='categorical_crossentropy',  # 多分类交叉熵categorical_crossentropy  metrics=['accuracy']   # 评价指标  )

回调函数

在使用TensorBoard的时候需要

In [12]:

# 后面tensorborad使用需要  tf_callback = tf.keras.callbacks.TensorBoard(log_dir="./logs")  # 指定log_dir路径

存放路径为当前路径下的logs文件夹下

训练模型

history = model.fit(train_images,  # x  one_hot_train_labels,  # y  epochs=20,  # 训练轮次  batch_size=1024,  # 每次训练使用样本小批量  validation_split=0.2,  # 验证集比例  callbacks=[tf_callback],  #  回调函数  verbose=1   #  是否显示训练详细信息,1-显示  0-不显示  # validation_data=[x_val,y_val]   # 验证集的数据  )

当verbose=1的时候会显示每轮训练的具体信息:

指标可视化

主要是针对精度和损失值的可视化

In [14]:

history_data = history.history  #  字典形式  for keys in history_data:    print(keys)
loss
accuracy
val_loss
val_accuracy

In [15]:

loss = history_data["loss"]
val_loss = history_data["val_loss"]  # 原文 acc = history_data["acc]
acc = history_data["accuracy"]   # 改动:精度acc使用全称accuracy
val_acc = history_data["val_accuracy"]

In [16]:

# 1、损失loss  import matplotlib.pyplot as plt
%matplotlib inline  epochs = range(1, len(loss) + 1)  # 作为横轴  plt.plot(epochs, loss, "bo", label="Training Loss")
plt.plot(epochs, val_loss, "b", label="Validation Loss")
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.legend()
plt.title("Training and Validation Loss")
plt.show()

# 2、精度acc  plt.plot(epochs, acc, "bo", label="Training Acc")
plt.plot(epochs, val_acc, "b", label="Validation Acc")
plt.xlabel("Epochs")
plt.ylabel("Acc")
plt.legend()
plt.title("Training and Validation Acc")
plt.show()

tensorboard使用

首次使用的时候需要先加载两个环境:

In [18]:

%load_ext tensorboard

In [19]:

%tensorboard --logdir logs

然后在notebook页面中会直接显示Tensorboard:

除此之外,你也可以通过localhost:6006到本地网页查看:

显示的内容就是每轮的loss和acc

构建函数式模型

上面的网络模型是基于Sequential;下面对比构建出基于函数式API的等效模型:

from keras.models import Model  from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dropout
from keras.layers import Activation
from keras.layers import ZeroPadding1D  # 第一步:实例化输入层
cifar_input = Input(shape=(32,32,3),  name="input")  # 第二步:中间层的不断传递
conv1 = Conv2D(32,   kernel_size=(3,3),  padding="same",  activation="relu",  name="conv1")(cifar_input)  drop1 = Dropout(0.25, name="drop1")(conv1)
maxpool1 = MaxPooling2D(pool_size=(2,2), name="maxpool1")(drop1)
conv2 = Conv2D(64,   kernel_size=(3,3),  padding="same",  activation="relu",  name="conv2")(maxpool1)  maxpool2 = MaxPooling2D(pool_size=(2,2), name="maxpool2")(conv2)
drop2 = Dropout(0.25, name="drop2")(maxpool2)  flatten = Flatten(name="flatten")(drop2)
dense1 = Dense(128, activation="relu")(flatten)
drop3 = Dropout(0.25, name="drop3")(dense1)  # 第三步:输出层
output = Dense(10, activation="softmax")(drop3)  # 第四步:实例化Model类:传入输入和输出信息
model = Model(inputs=cifar_input, outputs=output)
model.summary()  

打印出来的效果:

Model: "model"
_________________________________________________________________  Layer (type)                Output Shape              Param #
=================================================================  input (InputLayer)          [(None, 32, 32, 3)]       0           conv1 (Conv2D)              (None, 32, 32, 32)        896         drop1 (Dropout)             (None, 32, 32, 32)        0           maxpool1 (MaxPooling2D)     (None, 16, 16, 32)        0           conv2 (Conv2D)              (None, 16, 16, 64)        18496       maxpool2 (MaxPooling2D)     (None, 8, 8, 64)          0           drop2 (Dropout)             (None, 8, 8, 64)          0           flatten (Flatten)           (None, 4096)              0           dense_2 (Dense)             (None, 128)               524416      drop3 (Dropout)             (None, 128)               0           dense_3 (Dense)             (None, 10)                1290        =================================================================
Total params: 545,098
Trainable params: 545,098
Non-trainable params: 0
_________________________________________________________________  

网络可视化

通过keras自带的plot_model能够绘制出当前模型的框架。

首先需要安装两个库:pydot 和 graphviz。其中graphviz的安装可能你会遇到些困难;特别是在windows系统下,希望你有耐心解决。

 pip install pydot  pip install graphviz

安装完成之后在命令行输入dot -version出现下面的界面则表示安装成功:

然后就可以绘图了:

from keras.utils.vis_utils import plot_model   plot_model(model, to_file="model_graph.png", show_shapes=True)

保姆级教程:手把手教你使用 Keras 搭建神经网络相关推荐

  1. 【博客写作-Typora】保姆级教程:Typora+PicGo+Bilibili简单搭建图床

    目录 [博客写作]保姆级教程:Typora+PicGo+Bilibili简单搭建图床 一.背景 二.其他解决方案 三.Typora+PicGo+Bilibili简单搭建图床 3.1.Typora和Pi ...

  2. 爬虫保姆级教程3:利用python-Flask框架搭建本地数据可视化网站

    成果展示: (1)网站首页: (2)电影表单页 (3) 电影评分页 (4) 词频统计页 (5)团队页面 接下来让我们看看上述网站是如何完成的: 首先简单介绍一下Flask框架: Flask主要功能有两 ...

  3. 保姆的式教程手把手教你,菜鸟玩转博客搭建!

    大家好,我是菜鸟哥! 今天教大家一个非常有意思的干货!大家有没有想自己动手搭建一个博客,无论是给别人秀肌肉,搭建一个向全世界展示自己的舞台:还是准备找工作做个自己的简历博客(有自己独立网站一定会给面试 ...

  4. 【深度学习】保姆级教程,用PyTorch构建第一个神经网络

    PyTorch是一个基于python的科学计算包,主要针对两类人群: 作为NumPy的替代品,可以利用GPU的性能进行计算 作为一个高灵活性.速度快的深度学习平台 在PyTorch中搭建神经网络并使用 ...

  5. 伪保姆级教程 | 如何使用阿里云服务器搭建博客

    从购买到搭建,一条龙全纪录 阿里云 ECS + Ubuntu18.04 咳咳,老手请绕道,写的不好,见谅见谅!正文开始- 第一话:确定目标 1.服务器 云翼计划 云小站 试用中心 刚入坑,选择了 云翼 ...

  6. 【保姆级教程】纯NAS以docker搭建WordPress(个人私有博客)

    配置目录 前言 `要公网IP,本文主要针对有公网IP(或者内网穿透)` 一.安装MySQL数据库 1.下载镜像 2.设置环境 3.设置端口 4.设置容器 二.安装WordPress 1.下载镜像 2. ...

  7. mac中Typora+PicGo图床+gitee 保姆级教程

    查看全文 http://www.taodudu.cc/news/show-5900829.html 相关文章: 使用Typora+PicGo+Gitee打造全新Markdown博客创作环境 今天码云( ...

  8. 保姆级教程:手把手教你搭建个人网站

    保姆级教程:手把手教你搭建个人网站 前言 准备与搭建 1.Git管理工具的下载与安装 2.nodejs环境安装 3.hexo博客框架下载 npm换国内源 使用npm下载hexo博客框架 初始化mybl ...

  9. ❤️周末爆肝两天❤️,万字长文,手把手教你配置CSDN主页的独特域名(保姆级教程,建议收藏)

    ❤️ 感受下效果图 ❤️ 目录 一.前言 二.先解决有没有的问题 1. 前置条件 2. 购买云服务器 3. 购买DNS域名 4. 配置Apache2服务 5. 配置云服务器的端口映射 6. 配置ngi ...

最新文章

  1. 第2题——DNA片段
  2. python3练习题:1-10
  3. Android FrameWork学习(二)Android系统源码调试
  4. aix 查看目前java进程_问一个 AIX 的命令 ps -ef|grep java
  5. spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程
  6. 答辩攻略之二:纯方案赛
  7. linux mint 无法联网_Linux Mint系统安装后WiFi不可用的解决办法
  8. yii mysql_Yii2框架操作数据库的方法分析【以mysql为例】
  9. VMware仅主机模式访问外网
  10. 图注意力网络_EMNLP 2019开源论文:针对短文本分类的异质图注意力网络
  11. wps分析工具库如何加载_怎么在wps表格里面加入“数据分析”工具啊?
  12. 小知识:随机生成26个字母中(一个或多个)的字母
  13. HTML的meta标签
  14. 查看WIN10 SDK的版本
  15. 我的2020|有风有雨亦有晴
  16. cocos2d-x 艺术字
  17. vs编译错误:在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”?
  18. JavaScript框架比较:AngularJS vs ReactJS vs EmberJS
  19. 安卓6.0+关机状态下通电自动开机方案
  20. 基于卫星星历计算卫星在CGCS2000大地坐标系中的坐标

热门文章

  1. Vanish/squid
  2. 常用国名与首都(英文)
  3. Linux四网口绑定,linux 网口绑定
  4. Python作业“骰子游戏”
  5. 《阅读的方法》罗振宇||阅读新见解
  6. 7.统计UV、分组TopN
  7. NAG: Network for Adversary Generation 笔记
  8. Python 教程之 Pandas(14)—— 使用 Pandas 进行数据分析
  9. 智微JMS901量产工具软件+固件,JMS901双接口U盘成功量产教程分享
  10. postman时间参数化