当前位置: 首页 > news >正文

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

Keras是一个易于使用且功能强大的神经网络建模库,它是基于Python语言开发的。Keras提供了高级API,使得用户能够轻松地定义和训练神经网络模型,无论是用于分类、回归还是其他任务。

Keras的主要特点如下:

  1. 简单易用:Keras的设计理念是用户友好性,它提供了简洁一致的API,使得模型的构建、训练、评估以及部署变得非常简单。不需要编写大量底层代码,可以快速实现模型。

  2. 多后端支持:Keras支持多个深度学习后端,包括TensorFlow、Theano和CNTK。用户可以根据自己的需要选择合适的后端,进行模型开发。而TensorFlow的2.0版本中已经将Keras纳入其中,成为其官方高层API。

  3. 多种建模方式:Keras提供了不同的建模方式,包括序列模型(Sequential Model)、函数模型(Functional Model)和子类模型(Subclassing Model)。用户可以根据需要选择适合的建模方式,从简单的线性模型到复杂的非线性模型都可以构建。

  4. 大量预定义层和模型:Keras提供了丰富的预定义层(例如,全连接层、卷积层、池化层等)和模型(例如,VGG、ResNet等),用户可以直接使用这些层和模型,加快模型开发的速度。

  5. 支持自定义层和损失函数:Keras支持用户自定义层和损失函数,用户可以根据自己的需求自定义特定的层或损失函数,并与其他预定义层和损失函数进行组合。

如果之前有参考过我的博文的话应该会有所了解,我基本上90%的项目都是基于keras+Tensorflow构建的,而基于PyTorch的相关项目开发实践会偏少一下,因为最初入坑深度学习的时候就是接触的Tensorflow,现在是想要系统性地梳理对比学习一下。

本文就以最为熟悉的keras来入手,系统性地总结回顾一下keras搭建模型的主流方式。Keras提供了三种主要的建模方式:序列模型、函数模型和子类模型。下面对每种方式进行详细介绍。

1. 序列模型(Sequential Model):
   序列模型是Keras中最简单的一种建模方式,它通过将层(Layer)按顺序堆叠来构建神经网络模型。每个层之间只有一个输入和一个输出。这种方式适用于简单的线性堆叠模型或者只有单一输入/输出的模型。
   序列模型的建模步骤如下:
   - 导入`Sequential`类和需要使用的层(例如,`Dense`、`Conv2D`、`MaxPooling2D`等)。
   - 使用`Sequential`类创建一个模型实例。
   - 通过调用模型实例的`add`方法逐步添加层到模型中。
   - 使用`compile`方法配置模型的优化器、损失函数和评估指标。
   - 使用`fit`方法对模型进行训练。
   - 使用`evaluate`方法对模型进行评估。

如果说是搭建比较基础的模型没有什么残差连接、多分支结构等特殊网络链路的话,这种方式一定会是首选,非常的简单易懂,直至现在我依旧觉得keras的可读性非常高,对于学习和理解来说是非常友好的,这里以Mnist数据集为例,给出来实例实现:

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)# -----------------------------
# 使用序列模型建立模型
model = Sequential([Dense(64, activation='relu', input_shape=(784,)),Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))# 模型评估
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)


2. 函数模型(Functional Model):
   函数模型是一种更为灵活的建模方式,它允许构建具有多个输入和多个输出的模型,以及包含层共享和跳跃连接的复杂模型。通过在层之间创建显式的数据流图,可以构建非线性的模型结构。
   函数模型的建模步骤如下:
   - 导入`Model`类和需要使用的层(例如,`Input`、`Conv2D`、`MaxPooling2D`等)。
   - 创建模型的输入张量(`Input`),并将其传递给需要连接该输入的层。
   - 通过将每个层的输出连接到下一个层的输入来构建模型。
   - 使用`Model`类指定模型的输入和输出,创建一个模型实例。
   - 使用`compile`方法配置模型的优化器、损失函数和评估指标。
   - 使用`fit`方法对模型进行训练。
   - 使用`evaluate`方法对模型进行评估。

这种方式我平时使用的频次也是很高的,简单一句话总结就是:序列模型能完成的函数模型都能完成,函数模型能完成的序列模型未必能完成,如果只是想要学习掌握一种主流方式的话可以直接选择函数模型,像经典的残差网络、多分支网络结构等等都是基于函数模型进行搭建的。这里同样以Mnist数据集为例给出代码实例:

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)# 使用函数式模型建立模型
inputs = tf.keras.Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(x)model = tf.keras.Model(inputs=inputs, outputs=outputs)model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)


3. 子类模型(Subclassing Model):
   子类模型是使用Python的继承机制构建模型的一种方式,它提供了最大的灵活性,可以按照需要自定义前向传播逻辑和反向传播逻辑。通过编写一个继承自`Model`类的子类,可以完全自定义模型的构建过程。
   子类模型的建模步骤如下:
   - 导入`Model`类和需要使用的层(例如,`Dense`、`Conv2D`、`MaxPooling2D`等)。
   - 创建一个继承自`Model`类的子类,定义类的`__init__`方法,其中实例化模型层和变量。
   - 在子类中定义`call`方法,实现模型的前向传播逻辑。
   - 创建模型的实例。
   - 使用`compile`方法配置模型的优化器、损失函数和评估指标。
   - 使用`fit`方法对模型进行训练。
   - 使用`evaluate`方法对模型进行评估。

这种方式的使用频度,主要也是这种方式实现起来也是相对更加复杂一点的,而且对于模型的保存还有问题,所以对于我自己来说,这种子类模型的构建方式本身使用频度不高,这里同样以Mnist数据集为例给出代码实例:

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 数据预处理
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)# 使用子类模型建立模型
class MyModel(tf.keras.Model):def __init__(self):super(MyModel, self).__init__()self.dense1 = Dense(64, activation='relu')self.dense2 = Dense(10, activation='softmax')def call(self, inputs):x = self.dense1(inputs)outputs = self.dense2(x)return outputsmodel = MyModel()model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test Accuracy:', test_acc)

http://www.lryc.cn/news/137984.html

相关文章:

  • python环境建设
  • Python学习笔记第五十九天(Matplotlib 安装)
  • (6)(6.3) 自动任务中的相机控制
  • 什么是cssreset ?为什么要用到cssreset?
  • SpringCloud学习笔记(四)_ZooKeeper注册中心
  • 【算法专题突破】双指针 - 移动零(1)
  • Nginx高可用集群
  • Rust 基础入门 ——所有权 引言 :垃圾自动回收机制的缺陷。
  • Ubuntu20.04安装软件报错:The following packages have unmet dependencies
  • Java 与设计模式(12):享元模式
  • React配置代理(proxy)
  • 队列(Queue):先进先出的数据结构队列
  • CentOS ens160 显示disconnected
  • 使用 ChatGPT 创建 PowerPoint 演示文稿
  • matlab将数组值划分为两类
  • 【点击新增一个下拉框 与前一个内容一样 但不能选同一个值】
  • 【Gitee提交pr】
  • 一款打工人必备的电脑端自律软件!!冲鸭打工人!!
  • 【Vue框架】 router和route是什么关系
  • 整理mongodb文档:聚合管道
  • Delphi 11.3 FMX 多设备平台中使用 TGrid 实现类似 TDBGrid 的效果
  • Qt-事件循环与QtConcurrent、QThread结合使用时注意的点
  • 基于MongoDB的空间数据存储与查询
  • jquery中pdf的上传、下载及excel导出
  • 【MyBatis】:PageHelper分页插件与特殊字符处理
  • C语言练习1(巩固提升)
  • eCharts热力图Y轴左上角少一块
  • RabbitMQ介绍
  • 玩转软件|钉钉个人版内测启动:AI探索未来的工作方式
  • 【Linux】一张图了解系统文件