Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例

news2024/11/26 2:54:27

Keras和PyTorch是两个常用的深度学习框架,它们都提供了用于构建和训练神经网络的高级API。

Keras:

Keras是一个高级神经网络API,可以在多个底层深度学习框架上运行,如TensorFlow和CNTK。以下是Keras的特点和优点:

优点:

  • 简单易用:Keras具有简洁的API设计,易于上手和使用,适合快速原型设计和实验。
  • 灵活性:Keras提供了高级API和模块化的架构,可以灵活地构建各种类型的神经网络模型。
  • 复用性:Keras模型可以轻松保存和加载,可以方便地共享、部署和迁移模型。
  • 社区支持:Keras拥有庞大的社区支持和活跃的开发者社区,提供了大量的文档、教程和示例代码。

缺点:

  • 功能限制:相比于底层框架如TensorFlow和PyTorch,Keras在某些高级功能和自定义性方面可能有所限制。
  • 可扩展性:虽然Keras提供了易于使用的API,但在需要大量定制化和扩展性的复杂模型上可能会有限制。
  • 灵活程度:Keras主要设计用于简单的流程,当需要处理复杂的非标准任务时,使用Keras的灵活性较差。

适用场景:

  • 初学者:对于新手来说,Keras是一个理想的选择,因为它简单易用,有丰富的文档和示例来帮助快速入门。
  • 快速原型设计:Keras可以快速搭建和迭代模型,适用于快速原型设计和快速实验验证。
  • 常规计算机视觉和自然语言处理任务:Keras提供了大量用于计算机视觉和自然语言处理的预训练模型和工具,适用于常规任务的开发与应用。

PyTorch:

PyTorch是一个动态图深度学习框架,强调易于使用和低延迟的调试功能。以下是PyTorch的特点和优点:

优点:

  • 动态图:PyTorch使用动态图,使得模型构建和调试更加灵活和直观,可以实时查看和调试模型。
  • 自由控制:相比于静态图框架,PyTorch能够更自由地控制模型的复杂逻辑和探索新的网络架构。
  • 算法开发:PyTorch提供了丰富的数学运算库和自动求导功能,适用于算法研究和定制化模型开发。
  • 社区支持:PyTorch拥有活跃的社区和大量的开源项目,提供了丰富的资源和支持。

缺点:

  • 部署复杂性:相比于Keras等高级API框架,PyTorch需要开发者更多地处理模型的部署和生产环境的问题。
  • 静态优化:相对于静态图框架,如TensorFlow,PyTorch无法进行静态图优化,可能在性能方面略逊一筹。
  • 入门门槛:相比于Keras,PyTorch对初学者来说可能有一些陡峭的学习曲线。

适用场景:

  • 研究和定制化模型:PyTorch适合进行研究和实验,以及需要灵活性和自由度较高的定制化模型开发。
  • 高级计算机视觉和自然语言处理任务:PyTorch在计算机视觉和自然语言处理领域有广泛的应用,并且各类预训练模型和资源丰富。

在前面的两篇文章中整体系统总结记录了Keras和PyTroch这两大主流框架各自开发构建模型的三大主流方式,并对应给出来的基础的实例实现,感兴趣的话可以自行移步阅读即可:

《总结记录Keras开发构建神经网络模型的三种主流方式:序列模型、函数模型、子类模型》

《总结记录PyTorch构建神经网络模型的三种主流方式:nn.Sequential按层顺序构建模型、继承nn.Module基类构建自定义模型、继承nn.Module基类构建模型并辅助应用模型容器来封装》

本文的主要目的就是想要基于真实业务数据场景来实地开发实践这三种不同类型的模型构建方式,并对结果进行对比分析。

首先来看下数据集:

 这里模型结构的话可以自行构建设计层数都是没有关系的,我这里主要是参考了VGG的网络结构来搭建的网络模型,首先来看序列模型构建实现:

def initModel(h=100, w=100, way=3):
    """
    列模型
    """
    input_shape = (h, w, way)
    model = Sequential()
    model.add(
        Conv2D(
            64,
            (3, 3),
            strides=(1, 1),
            input_shape=input_shape,
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
    )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(
        Conv2D(
            128,
            (3, 2),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
    )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(
        Conv2D(
            256,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
    )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(
        Conv2D(
            512,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
    )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(
        Conv2D(
            512,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
    )
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(820, activation="relu"))
    model.add(Dropout(0.1))
    model.add(Dense(820, activation="relu"))
    model.add(Dropout(0.1))
    model.add(Dense(numbers, activation="softmax"))
    return model

网络结构输出如下所示:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 100, 100, 64)      1792      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 50, 50, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 128)       49280     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 25, 25, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 25, 25, 256)       295168    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 256)       0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 12, 12, 512)       1180160   
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 6, 6, 512)         0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 6, 6, 512)         2359808   
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 3, 3, 512)         0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 4608)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 820)               3779380   
_________________________________________________________________
dropout_1 (Dropout)          (None, 820)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 820)               673220    
_________________________________________________________________
dropout_2 (Dropout)          (None, 820)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 1642      
=================================================================
Total params: 8,340,450
Trainable params: 8,340,450
Non-trainable params: 0
_________________________________________________________________

接下来是函数模型代码实现,如下所示:

def initModel(h=100, w=100, way=3):
    """
    函数模型
    """
    input_shape = (h, w, way)
    inputs = Input(shape=input_shape)
    X = Conv2D(
        64,
        (3, 3),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(inputs)
    X = Conv2D(
        64,
        (3, 3),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(X)
    X = MaxPooling2D(pool_size=(2, 2))(X)
    X = Conv2D(
        128,
        (3, 2),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(X)
    X = MaxPooling2D(pool_size=(2, 2))(X)
    X = Conv2D(
        256,
        (3, 3),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(X)
    X = MaxPooling2D(pool_size=(2, 2))(X)
    X = Conv2D(
        512,
        (3, 3),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(X)
    X = MaxPooling2D(pool_size=(2, 2))(X)
    X = Conv2D(
        512,
        (3, 3),
        strides=(1, 1),
        padding="same",
        activation="relu",
        kernel_initializer="uniform",
    )(X)
    X = MaxPooling2D(pool_size=(2, 2))(X)
    X = Flatten()(X)
    X = Dense(820, activation="relu")(X)
    X = Dropout(0.1)(X)
    X = Dense(820, activation="relu")(X)
    X = Dropout(0.1)(X)
    outputs = Dense(2, activation="sigmoid")(X)
    model = Model(input=inputs, output=outputs)
    return model

模型结构信息输出如下所示:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 100, 100, 3)       0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 100, 100, 64)      1792      
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 100, 100, 64)      36928     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 50, 50, 64)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 50, 50, 128)       49280     
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 25, 25, 128)       0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 25, 25, 256)       295168    
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 12, 12, 256)       0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 12, 12, 512)       1180160   
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 6, 6, 512)         0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 6, 6, 512)         2359808   
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 3, 3, 512)         0         
_________________________________________________________________
flatten_2 (Flatten)          (None, 4608)              0         
_________________________________________________________________
dense_4 (Dense)              (None, 820)               3779380   
_________________________________________________________________
dropout_3 (Dropout)          (None, 820)               0         
_________________________________________________________________
dense_5 (Dense)              (None, 820)               673220    
_________________________________________________________________
dropout_4 (Dropout)          (None, 820)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 2)                 1642      
=================================================================
Total params: 8,377,378
Trainable params: 8,377,378
Non-trainable params: 0
_________________________________________________________________

最后是子类模型代码实现,如下所示:

class initModel(Model):
    """
    子类模型
    """

    def __init__(self):
        super(initModel, self).__init__()
        self.conv2d1 = Conv2D(
            64,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.conv2d2 = Conv2D(
            64,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.pool1 = MaxPooling2D(pool_size=(2, 2))
        self.conv2d3 = Conv2D(
            128,
            (3, 2),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.pool2 = MaxPooling2D(pool_size=(2, 2))
        self.conv2d4 = Conv2D(
            256,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.pool3 = MaxPooling2D(pool_size=(2, 2))
        self.conv2d5 = Conv2D(
            512,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.pool4 = MaxPooling2D(pool_size=(2, 2))
        self.conv2d6 = Conv2D(
            512,
            (3, 3),
            strides=(1, 1),
            padding="same",
            activation="relu",
            kernel_initializer="uniform",
        )
        self.pool5 = MaxPooling2D(pool_size=(2, 2))
        self.flatten = Flatten()
        self.dense1 = Dense(820, activation="relu")
        self.dropout1 = Dropout(0.1)
        self.dense2 = Dense(820, activation="relu")
        self.dropout2 = Dropout(0.1)
        self.dense3 = Dense(2, activation="sigmoid")


    def call(self, inputs):
        """
        回调
        """
        x = self.conv2d1(inputs)
        x = self.conv2d2(x)
        x = self.pool1(x)
        x = self.conv2d3(x)
        x = self.pool2(x)
        x = self.conv2d4(x)
        x = self.pool3(x)
        x = self.conv2d5(x)
        x = self.pool4(x)
        x = self.conv2d6(x)
        x = self.pool5(x)
        x = self.flatten(x)
        x = self.dense1(x)
        x = self.dropout1(x)
        x = self.dense2(x)
        x = self.dropout2(x)
        y = self.dense3(x)
        return y

完成模型的搭建之后就可以加载对应的数据集开始训练模型了,数据集加载仿照mnist数据集的形式即可,这里就不再赘述了,在我之前的文章中也都有对应的实现,如下所示:

# 数据加载
X_train, X_test, y_train, y_test = loadData()
X_train = X_train.astype("float32")
X_test = X_test.astype("float32")
# 数据归一化
X_train /= 255
X_test /= 255
# 数据打乱
np.random.seed(200)
np.random.shuffle(X_train)
np.random.seed(200)
np.random.shuffle(y_train)
np.random.seed(200)
np.random.shuffle(X_test)
np.random.seed(200)
np.random.shuffle(y_test)
# 模型
model=initModel()
model.compile(loss="binary_crossentropy", optimizer="sgd", metrics=["accuracy"])

模型评估测试可视化实现如下所示:

# 可视化
plt.clf()
plt.plot(history.history["acc"])
plt.plot(history.history["val_acc"])
plt.title("model accuracy")
plt.ylabel("accuracy")
plt.xlabel("epochs")
plt.legend(["train", "test"], loc="upper left")
plt.savefig(saveDir + "train_validation_acc.png")
plt.clf()
plt.plot(history.history["loss"])
plt.plot(history.history["val_loss"])
plt.title("model loss")
plt.ylabel("loss")
plt.xlabel("epochs")
plt.legend(["train", "test"], loc="upper left")
plt.savefig(saveDir + "train_validation_loss.png")
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1] * 100))

接下来看下结果:
【序列模型】

 【函数模型】

 【子类模型】

 结果上有略微的差异,这个应该跟训练有关系。

可视化结果如下所示:

 其实三种方法也是本质一样的,只要熟练熟悉了某一种,其他的构建方式都是可以基于当前的构建方式转化完成的。没有绝对唯一的选择,只有最适合自己的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/912551.html

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

相关文章

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介: keepalivedlvsnginx高并发集群,是通过LVS将请求流量均匀分发给nginx集群,而当单机nginx出现状态异常或宕机时,keepalived会主动切换并将不健康nginx下线,维持集群稳定高可用 1.L…

浏览器安装selenium驱动,以Microsoft Edge安装驱动为例

Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行,模拟真实用户对浏览器进行操作。利用selenium,可以驱动浏览器执行特定的动作,比如:点击、下拉等等,还可以获取浏览器当前呈现的页面的源代码…

【数据结构与算法】总结关于二叉树题型经典面试题

【数据结构与算法】二叉树题型经典面试题 1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的最近公共祖先4.二叉搜索树与双向链表5.从前序与中序遍历序列构造二叉树6.从中序与后序遍历序列构造二叉树7.二叉树的前序遍历(非递归方法)8.二叉树的中序遍历(非递归方法)9.二叉树的…

SpringBoot接收参数的8种方式

文章目录 1. 直接把请求参数写在方法的形参中2. 封装一个bean直接来接收3. 原生的HttpServletRequest接收4. PathVariable获取rest风格路径参数5. RequestParam绑定请求参数到方法形参6. RequestBody绑定请求参数到方法形参7. RequestHeader8. CookieValue 1. 直接把请求参数写…

唯一受邀参会通信服务商!融云出席数字经济头部盛会「中数大会」并发言

8 月 16 日-18日,“2023 中国数字经济创新发展大会”(下简称“中数大会”)在广东省汕头市举办。关注【融云 RongCloud】,了解协同办公平台更多干货。 中数大会由工业和信息化部、广东省人民政府联合主办,以“聚数联侨…

C++ new运算符开辟空间

1 内存四区介绍 代码区:存放函数的二级制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区: 由程序员分配和释放&…

点云平面拟合和球面拟合

一、介绍 In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model. 二、代码 #include <iostream> #include <thread> #include <pcl/point_types.h> #include <pcl/common/io.…

kubesphere部署rocketmq5.x,并对外暴露端口

kubesphere是青云开源的k8s管理工具&#xff0c;用户可以方便的通过页面进行k8s部署的部署&#xff0c;rocketmq则是阿里开源的一款mq平台&#xff0c;现在版本为5.1.3版本&#xff0c;较比4.x版本的rocketmq有比较大的调整&#xff1a;比如客户端的轻量化&#xff08;统一通过…

MS1022高精度时间测量(TDC)电路,应用于超声波热量表、水表、激光测距

产品简述 MS1022 是一款高精度时间测量电路&#xff0c;内部集成了模拟比 较器、模拟开关、施密特触发器等器件&#xff0c;从而大大简化了外 围电路。同时内部增加了第一波检测功能&#xff0c;使抗干扰能力大 大提高。通过读取第一个回波脉冲的相对宽度&#xff0c;用户可…

Spring6.0官方文档示例:(27)配置文件中bean定义的继承关系

一、实体类 package cn.edu.tju.domain;public class DerivedTestBean {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {t…

几种常见的递归算法

阶乘 这个比较简单就不说了。 int factorial(int n) {if (n < 0){return 0;}else if (n 1){return 1;}else {return n * factorial(n - 1);} }fibonacci 如此简单的算法&#xff0c;复试的时候竟然写错了&#xff01;&#x1f633;囧&#xff01; int fibonacci(unsigne…

高忆管理:a股印花税调整利好股市吗?印花税下调利好股市吗?

在股票市场上&#xff0c;印花税并不是一成不变的&#xff0c;政府会依据实际情况进行调整&#xff0c;那么&#xff0c;a股印花税调整利好股市吗&#xff1f;印花税下调利好股市吗&#xff1f;下面高忆管理为大家预备了相关内容&#xff0c;以供参阅。 股票印花税一般是指投资…

Transformer是否真正理解了自然语言的语义信息,还是单纯的模式识别

论文引用 此篇阅读笔记与思考主要针对以下两篇论文&#xff1a; Climbing towards NLU: On Meaning, Form, and Understanding in the Age of Data Transformer Feed-Forward Layers Are Key-Value Memories 本文将讨论第一篇论文所引发的思考&#xff08;第一篇论文的详细解…

企业级快速开发平台,助力企业走入流程化管理,创造高效办公!

要想实现高效办公&#xff0c;创造流程化管理新时代&#xff0c;需要借助一些优秀平台来实现目标。企业级快速开发平台是当前较为流行的软件平台&#xff0c;拥有多项典型功能&#xff0c;可以摒弃传统办公带来的效率低下、难维护等各种矛盾&#xff0c;一起创造流程化管理和数…

入行嵌入式,你离高薪还差一步!

近几年越来越多的人了解了嵌入式这个高薪、前景好的行业&#xff0c;许多同学也加入了嵌入式学习的队伍中&#xff0c;但对于自己未来在嵌入式的发展方向还是难以抉择&#xff0c;这里为大家答疑解惑一波。 熟悉嵌入式领域的同学都知道&#xff0c;嵌入式可以从软件和硬件两个方…

全链路数据湖开发治理解决方案2.0重磅升级,全面增强数据入湖、调度和治理能力

简介&#xff1a; 阿里云全链路数据湖开发治理解决方案能力持续升级&#xff0c;发布2.0版本。解决方案包含开源大数据平台E-MapReduce(EMR) &#xff0c; 一站式大数据数据开发治理平台DataWorks &#xff0c;数据湖构建DLF&#xff0c;对象存储OSS等核心产品。支持EMR新版数据…

C++继承-补充

本期对继承的知识进行一些补充&#xff0c;还没看过之前对继承讲解的建议先看之前的 C继承_KLZUQ的博客-CSDN博客 本期补充知识为菱形继承以及菱形虚拟继承相关知识 class A { public:virtual void func1(){cout << "A::func1" << endl;} public:int _…

平板用的触控笔什么牌子好?开学必买电容笔清单

开学季马上就要到来了&#xff0c;自从iPad的Pencil火了之后&#xff0c;国内又陆续推出了一些新的产品&#xff0c;比如平替之类的&#xff0c;有的质量非常好&#xff0c;有的价格非常实惠&#xff0c;还能被大多数人所接受。不过&#xff0c;这里面有不少的产品&#xff0c;…

手把手教你在云环境炼丹:Stable Diffusion LoRA 模型保姆级炼制教程

很多同学都想要自己的专属AI模型&#xff0c;但是大模型的训练比较费时费力&#xff0c;不太适合普通用户玩。AI开发者们也意识到了这个问题&#xff0c;所以就产生了微调模型&#xff0c;LoRA就是其中的一种。在AI绘画领域&#xff0c;只需要少量的一些图片&#xff0c;就可以…

七夕情侣飞行棋游戏限定版本源码/解锁版

七夕情侣飞行棋限定版本源码已经发布&#xff01;这是一款专为情侣打造的桌游&#xff0c;让您与您的另一半一起感受浪漫的体验。 更为重要的是&#xff0c;这个版本已经移除了路由器限制&#xff0c;解锁了全部功能&#xff0c;而且没有任何加密措施&#xff0c;您只需将源码…