当前位置:   article > 正文

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

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数据集为例,给出来实例实现:

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


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

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

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


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

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

  1. import tensorflow as tf
  2. from tensorflow.keras.datasets import mnist
  3. from tensorflow.keras.models import Sequential
  4. from tensorflow.keras.layers import Dense
  5. # 加载MNIST数据集
  6. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  7. # 数据预处理
  8. x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
  9. x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
  10. y_train = tf.keras.utils.to_categorical(y_train)
  11. y_test = tf.keras.utils.to_categorical(y_test)
  12. # 使用子类模型建立模型
  13. class MyModel(tf.keras.Model):
  14. def __init__(self):
  15. super(MyModel, self).__init__()
  16. self.dense1 = Dense(64, activation='relu')
  17. self.dense2 = Dense(10, activation='softmax')
  18. def call(self, inputs):
  19. x = self.dense1(inputs)
  20. outputs = self.dense2(x)
  21. return outputs
  22. model = MyModel()
  23. model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
  24. model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))
  25. test_loss, test_acc = model.evaluate(x_test, y_test)
  26. print('Test Accuracy:', test_acc)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/697734
推荐阅读
相关标签
  

闽ICP备14008679号