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

article/2025/8/17 4:11:57

大家好,本文从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)  

在这里插入图片描述


http://chatgpt.dhexx.cn/article/9YeTGuOU.shtml

相关文章

keras教程-静态图编程框架keras-学习心得以及知识点总结

在过去的四个月里(2020三月开始的),和朋友一起对着官网的keras教程学习了一遍,学习的过程中发现有一些解释的不清楚的地方(官网的教程实在是~~~),我们自己做了实验,探索了问题的各个…

keras入门教程

线性回归非线性模型MNIST手写数字识别 改进欠拟合,过拟合 early stopDropout正则化梯度下降 批量梯度下降随机梯度下降小批量梯度下降其他找寻最低点的方法卷积神经网络RNN模型的保存和载入 保存模型载入模型绘制神经网络的结构 几个keras学习的网址: 1.…

超快速!10分钟入门Keras指南

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 本文转自|机器学习算法工程师 1 Keras框架介绍在用了一段时间的Keras后感觉真的很爽,所以特意祭出此文与我们公众号的粉丝分享。 Keras是一个非常方便的深度…

LinuxReader —— 在windows下查看linux系统文件

怕忘了有这个一个方法,记录一下 我是用everything查看文件夹位置,然后点击: 直接可以查看Linux下的文件: 还有饼状图:

如何查看Linux系统的硬件配置

1、查看Linux系统的cpu的个数 cat /proc/cpuinfo | grep "model name"2、查看Linux系统的内存大小 cat /proc/meminfo | grep "MemTotal"3、查看Linux系统文件系统磁盘挂在情况 df -h也可以使用fdisk -l查看磁盘总概况

查看linux系统的glibc版本

查看linux系统的glibc版本 getconf GNU_LIBC_VERSION # 或者 ldd --version

查看Linux系统的初始安装时间

偶然在网上冲浪的时候看到有人问如何查看自己的linux系统的最初的安装时间,然后研究了一下,大致总结出了几个方法。 1.先查看系统盘挂到哪个分区上,然后用 dumpe2fs 查看这个磁盘分区 创建的时间 2.查看 lostfound 目录的时间 3.使用uptime(前…

查看linux系统CPU内存

文章目录 1 查看linux系统的CPU型号、类型以及大小2 查看linux系统内存总内存,剩余内存、可使用内存等信息3 查看linux系统各分区的使用情况4 查看linux系统内存使用量和交换区使用量5查看系统版本 1 查看linux系统的CPU型号、类型以及大小 cat /proc/cpuinfo | mo…

linux 怎么查看内核日志,怎样查看Linux系统日志?

原标题:怎样查看Linux系统日志? 很多企业都会使用Linux系统,审计Linux系统日志可以提供有关网络事件的重要信息。高效查看Linux系统日志对工作而言十分重要,以下是常用命令 # uname -a # 查看内核/操作系统/CPU信息 # cat /etc/is…

怎么查看linux系统防火墙,如何查看linux系统中防火墙的状态

如何查看linux系统中防火墙的状态 发布时间:2020-04-23 13:52:39 来源:亿速云 阅读:253 作者:小新 这篇文章主要为大家详细介绍了如何查看linux系统中防火墙的状态,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 linux防火墙状态查看的…

查看Linux系统负载命令

查看Linux系统负载的命令一般常用的有5种: 1.uptime 该命令可以显示的信息依次为:现在时间、系统已运行了多长时间、目前有多少登录用户、系统过去1分钟,5分钟,15分钟内的平均负载。 18:36:16 //系统当前时间 up 0 m…

查看linux系统是centos还是ubuntu的方法

查看系统架构信息: 1、uname -a 2、cat /proc/version 查看Linux系统是ubuntu还是CentOS 1、cat /etc/redhat-release 适用于:CentOS,RedHat 若回显中包含CentOS ,则为CentOS系统。ubuntu系统不支持该命令 2.cat /etc/issu…

查看Linux系统是UBUNTU还是CentOS的方法

使用以下命令查看Linux系统是UBUNTU还是CentOS,在命令行下输入: 1、cat /etc/redhat-release 适用于:CentOS,RedHat 如图,出现CentOS ,则为CentOS系统。 2.cat /etc/issue 显示如下图,则为Ce…

查看linux系统信息的常用命令

1. 查看linux系统内核版本 uname -a uname -r cat /proc/version 2. 查看linux系统版本 lsb_release -a cat /etc/redhat-release 3. 查看linux系统的架构是amd还是arm arch 返回x86_64就是amd的 4. 查看linux系统是32还是64 getconf LONG_BIT 5. 查看系统是实体机还是…

【nginx】nginx的使用

接上一篇的部署,之后就是使用它 cd /usr/local/nginx/conf vi nginx.conf 只改了两个地方 到本地改 hosts文件 C:\Windows\System32\drivers\etc\hosts 增加这一行,其中前面的ip是nginx所在服务器的地址。 此时不需要dns,直接本地访问这个…

Nginx的介绍与使用

想必大家一定听说过 Nginx,若没听说过它,那么一定听过它的"同行"Apache 吧! Nginx 的产生 Nginx(engine x) 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格,以统一资源描述符(Uniform Resources …

Nginx基本使用

一、Nginx简介 ​ Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔西索夫)所开发&#xff0…

Nginx使用手册

Nginx使用手册 1、下载2、Linux下使用3、Windows下使用4、配置详解 1、下载 地址:http://nginx.org/en/download.html 2、Linux下使用 cd /usr/loacal/nginx/sbin/ cd /www/server/nginx/sbin #宝塔面板 ./nginx #启动 ./nginx -s stop #停止 ./nginx -s quit #安…

关于Nginx的使用

(一) Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误。 一次性安装gcc编译器、openssl库、pcre库、zlib库,执行命令如下: yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y 解压后在nginx主…

nginx使用!

一:概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京…