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

news2024/12/24 21:54:39

大家好,本文从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://www.coloradmin.cn/o/77727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GRU回归预测】基于卷积神经网络结合门控循环单元CNN-GRU实现数据多维输入单输出预测附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

ChatGPT强悍的编程能力,让我吓出一身冷汗!

最近有好几个人给我安利ChatGPT,说老刘快你去看看吧,这货实在太强了,搞不好我们程序员都失业了。刚开始我都是微微一笑,怎么可能?我之前的观点一直都是在我的有生之年,AI绝对不可能干掉程序员。但是安利的人…

一篇文章让你懂 io流

文件:就是保存数据的地方。文件流:文件在程序中是以流的形式来操作的。流:数据在数据源(文件)和程序(内存)之间经历的路径。输入流:数据从文件(磁盘)到Java程…

Spring-Cloud-Admin-06

前言 admin是用来监控各个服务的状况的,通过前台页面,可以查看我们各个服务的一个状态,是否在线,服务状况的一个框架。 服务端项目使用 admin有服务端和客户端,我们不需要每个服务都导入admin的客户端依赖,…

以太网 网络高可用性(链路聚合、LACP模式、静态手动模式)

2.9.0 以太网 网络高可用性(链路聚合、LACP模式、静态手动模式) 网络高可用性2.9.0 以太网 网络高可用性(链路聚合、LACP模式、静态手动模式)一、简介:1、单板可靠性:1.1、实现机柜式的可靠性提升&#xff…

Java#35(多线程扩展)

目录 一.定时器 定时器是一种控制任务延时调用, 或者周期调用的技术 1.Timer定时器(不推荐) 2.ScheduledExecutorService定时器(推荐) 二.并发与并行 三.线程状态 一.定时器 定时器是一种控制任务延时调用, 或者周期调用的技术 1.Timer定时器(不推荐) 代码示范: import …

Microsoft Store无法打开的解决办法【成功解决】

Microsoft Store无法打开解决办法我自己的解决办法其他Bug导致Microsoft Store无法打开的解决办法vpn代理问题使用TLS 1.2其他BUG解决方案成功解决之前我就有安装wsl的想法,但是他要求打开Microsoft Store,我尝试了各种办法,都不行。今天终于…

SpringCloud-全面详解(学习总结---从入门到深化)

​​​​​​​ 微服务架构进化论 单体应用阶段 (夫妻摊位) 在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬 件成本较高。因此,一般的企业会将所有的功能都集成在一起开发 一个单体应用,然后将该单体应用…

Python代码加速100倍,针对Excel自动化处理的加速实战!

并发 vs 并行 说到并发编程,我们先来澄清一下并发 (Concurrency) 和 并行 ( Parallelism)这两个概念,因为这个两个概念的含义是不同的。 并行(Parallelism)指的就是在同一时刻,有两个或两个以上的任务的代码在处理器…

Spring Cloud Ribbon(负载均衡器)介绍及使用

目前主流的负载方案分为以下两种: 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。客户端自己做负载均衡&#x…

[附源码]Python计算机毕业设计SSM基于框架的秧苗以及农产品交易网站(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

命令设计模式

一、命令模式 1、定义 命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作,请求方发出请求要求执行一个操作,接收方收到请求并执行操作。属于行为型设计模式。 命令模式通过在请求与实现之间引入一个抽…

Spring注解开发

1、Spring注解开发 1 注解开发定义Bean对象【重点】 目的:xml配置Bean对象有些繁琐,使用注解简化Bean对象的定义 问题导入 问题1:使用什么标签进行Spring注解包扫描? 问题2:Component注解和Controller、Service、Re…

【指纹识别】指纹识别【含GUI Matlab源码 029期】

⛄一、指纹识别简介 指纹识别技术主要分三个步骤:指纹预处理、特征提取、指纹分类与匹配。 无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量。在实际应用中,由于采集条件和采集设备的因素,采集到的指纹图像…

IBRNet:基于IBR的NeRF

IBRNet: Learning Multi-View Image-Based Rendering 针对问题:使NeRF具有泛化能力 如何做:主要还是针对颜色和密度的预测进行改进(三维重建部分),和NeRF一样,使用的是volume rendering(渲染部…

Vulkan下多线程渲染设计

1 Vulkan 视角下的多线程渲染 首先我们需要从vulkan api的顶层框架上来看一下,它在哪些地方可以让我们并行。 Vulkan API的基本框架 Vulkan不同于Gles只有一个(不被API暴露出来的)单一链条的cmdbuffer处理,它最大的特点是允许多…

阿里巴巴内部:2022年全技术栈PPT分享(架构篇+算法篇+大数据)

我只截图不说话,PPT大全,氛围研发篇、算法篇、大数据、Java后端架构!除了大家熟悉的交易、支付场景外,支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心…

Linux中裸机串口通信的基本方法

大家好, 今天主要和大家聊一聊,如何使用串口进行通信的方法。 目录 第一:串口的基本简介 第二:UART的特点 ​第三:UART的配置步骤 第一:串口的基本简介 串口又叫做串行接口,通常叫做COM接…

农业灌区量测水流量在线监测系统解决方案-灌区信息化管理系统-灌区水网智慧化

平升电子农业灌区量测水流量在线监测系统解决方案/灌区信息化管理系统/灌区水网智慧化,对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测,同时对泵站、闸门进行远程控制,对重点区域进行视频监控,实现了信息的采集、…

Docker系统性入门(五)

文章目录Podman安装&基操pod多架构CI/CD容器安全监控Podman Podman 是 Red Hat 在2018年推出的,源代码开放是一个基于 Linux 系统的 daemon-less 的容器引擎;可以运行在root或者非root用户模式最近总听到这个要代替docker什么的,可以参考…