政安晨:【Keras机器学习实践要点】(四)—— 顺序模型

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: TensorFlow与Keras实战演绎机器学习

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

介绍

Keras是一个用于构建和训练深度学习模型的开源库。在Keras中,顺序模型是最简单的一种模型类型,它是一个线性堆叠的神经网络模型。顺序模型由一系列网络层按照顺序连接而成,每个网络层都可以包含多个神经元。

在构建顺序模型时,可以通过将网络层实例化并以列表的形式传递给Sequential类来实现。

顺序模型提供了许多其他的方法,可以用来配置网络层、编译模型、训练模型、评估模型等。它是一个简单而直观的方式来构建神经网络模型。

可以看一下本专栏的入门篇的文章搭建实验环境


导入

from tensorflow import keras
from keras import layers
from keras import ops

何时使用顺序模型

顺序模型适用于每个层都有一个输入张量和一个输出张量的普通层堆。

下面是序列模型的示意图:

# Define Sequential model with 3 layers
model = keras.Sequential([layers.Dense(2, activation="relu", name="layer1"),layers.Dense(3, activation="relu", name="layer2"),layers.Dense(4, name="layer3"),]
)
# Call model on a test input
x = ops.ones((3, 3))
y = model(x)

等同于这个函数:

# Create 3 layers
layer1 = layers.Dense(2, activation="relu", name="layer1")
layer2 = layers.Dense(3, activation="relu", name="layer2")
layer3 = layers.Dense(4, name="layer3")# Call layers on a test input
x = ops.ones((3, 3))
y = layer3(layer2(layer1(x)))

使用Sequential模型不适合的情况有

× 模型有多个输入或多个输出

× 任何层有多个输入或多个输出

× 需要进行层共享

× 想要非线性的拓扑结构(例如残差连接、多分支模型)

创建一个Sequential(顺序)模型

你可以通过将一系列层传递给Sequential构造函数来创建一个Sequential模型。

model = keras.Sequential([layers.Dense(2, activation="relu"),layers.Dense(3, activation="relu"),layers.Dense(4),]
)

它的层可以通过layers属性进行访问:

model.layers

您还可以通过 add() 方法逐步创建序列模型:

model = keras.Sequential()
model.add(layers.Dense(2, activation="relu"))
model.add(layers.Dense(3, activation="relu"))
model.add(layers.Dense(4))

请注意,还有一个相应的pop()方法可以删除层:Sequential模型的行为非常类似于层的列表。

model.pop()
print(len(model.layers))  # 2

还要注意的是,Sequential构造函数接受一个name参数,就像Keras中的任何层或模型一样。

这对于用语义上有意义的名称为TensorBoard图形进行注释非常有用。

model = keras.Sequential(name="my_sequential")
model.add(layers.Dense(2, activation="relu", name="layer1"))
model.add(layers.Dense(3, activation="relu", name="layer2"))
model.add(layers.Dense(4, name="layer3"))

提前指定输入形状

一般来说,Keras 中的所有层都需要知道其输入的形状,以便创建权重。因此,当你创建一个这样的层时,它最初是没有权重的:

layer = layers.Dense(3)
layer.weights  # Empty

由于权重的形状取决于输入的形状,因此它在首次调用输入时就会创建权重:

# Call layer on a test input
x = ops.ones((1, 4))
y = layer(x)
layer.weights  # Now it has weights, of shape (4, 3) and (3,)

演绎:

当然,这也适用于序列模型。当您实例化一个没有输入形状的序列模型时,它并没有 "建立":它没有权重(调用 model.weights 会导致错误说明)。

权重是在模型第一次看到输入数据时创建的

model = keras.Sequential([layers.Dense(2, activation="relu"),layers.Dense(3, activation="relu"),layers.Dense(4),]
)  # No weights at this stage!# At this point, you can't do this:
# model.weights# You also can't do this:
# model.summary()# Call the model on a test input
x = ops.ones((1, 4))
y = model(x)
print("Number of weights after calling the model:", len(model.weights))  # 6

演绎:

一旦建立了一个模型,你可以调用它的summary()方法来显示其内容

model.summary()

不过,在逐步建立序列模型时,显示模型的摘要(包括当前输出形状)可能会非常有用。

在这种情况下,您应该通过向模型传递一个输入对象来启动模型,以便模型从一开始就知道其输入形状

model = keras.Sequential()
model.add(keras.Input(shape=(4,)))
model.add(layers.Dense(2, activation="relu"))model.summary()

请注意,输入对象不会显示为 model.layers 的一部分,因为它不是一个图层:

像这样使用预定义的输入形状构建的模型始终具有权重(即使在没有看到任何数据之前)并且始终具有定义的输出形状。

总的来说,如果您知道输入形状,最好事先明确指定Sequential模型的输入形状。

常见的调试工作流程:add( ) + summary()

在构建新的序列架构时,使用 add() 逐步堆叠图层并经常打印模型摘要非常有用。

例如,这样就可以监控 Conv2D 和 MaxPooling2D 图层堆栈如何对图像特征图进行下采样

model = keras.Sequential()
model.add(keras.Input(shape=(250, 250, 3)))  # 250x250 RGB images
model.add(layers.Conv2D(32, 5, strides=2, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(3))# Can you guess what the current output shape is at this point? Probably not.
# Let's just print it:
model.summary()# The answer was: (40, 40, 32), so we can keep downsampling...model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(3))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.Conv2D(32, 3, activation="relu"))
model.add(layers.MaxPooling2D(2))# And now?
model.summary()# Now that we have 4x4 feature maps, time to apply global max pooling.
model.add(layers.GlobalMaxPooling2D())# Finally, we add a classification layer.
model.add(layers.Dense(10))

在实战中实践真的很实用。

一旦你拥有一个模型,接下来应该做什么?

一旦你的模型架构准备好了,你可以进行以下操作:

  1. 训练你的模型,评估它并进行推断。请参考我们的训练和评估指南。
  2. 将你的模型保存到磁盘并恢复它。请参考我们的序列化和保存指南。

使用顺序模型提取特征

一旦建立了顺序模型,它就会像功能 API 模型一样运行。这意味着每一层都有输入和输出属性。这些属性可以用来做一些巧妙的事情,比如快速创建一个模型,提取顺序模型中所有中间层的输出:

initial_model = keras.Sequential([keras.Input(shape=(250, 250, 3)),layers.Conv2D(32, 5, strides=2, activation="relu"),layers.Conv2D(32, 3, activation="relu"),layers.Conv2D(32, 3, activation="relu"),]
)
feature_extractor = keras.Model(inputs=initial_model.inputs,outputs=[layer.output for layer in initial_model.layers],
)# Call feature extractor on test input.
x = ops.ones((1, 250, 250, 3))
features = feature_extractor(x)

下面是一个类似的例子,只从一个图层中提取特征:

initial_model = keras.Sequential([keras.Input(shape=(250, 250, 3)),layers.Conv2D(32, 5, strides=2, activation="relu"),layers.Conv2D(32, 3, activation="relu", name="my_intermediate_layer"),layers.Conv2D(32, 3, activation="relu"),]
)
feature_extractor = keras.Model(inputs=initial_model.inputs,outputs=initial_model.get_layer(name="my_intermediate_layer").output,
)
# Call feature extractor on test input.
x = ops.ones((1, 250, 250, 3))
features = feature_extractor(x)

用顺序模型进行迁移学习

迁移学习的方法是冻结模型中的底层,并只训练顶层。如果你对此不熟悉,请确保阅读我们的迁移学习指南。

下面是两种使用Sequential模型的常见迁移学习蓝图。

首先,假设你有一个Sequential模型,你想要冻结除了最后一层之外的所有层。在这种情况下,你只需要遍历model.layers,并设置layer.trainable = False,除了最后一层外的每层都如此。

像这样:

model = keras.Sequential([keras.Input(shape=(784)),layers.Dense(32, activation='relu'),layers.Dense(32, activation='relu'),layers.Dense(32, activation='relu'),layers.Dense(10),
])# Presumably you would want to first load pre-trained weights.
model.load_weights(...)# Freeze all layers except the last one.
for layer in model.layers[:-1]:layer.trainable = False# Recompile and train (this will only update the weights of the last layer).
model.compile(...)
model.fit(...)

另一种常见的蓝图是使用Sequential模型来堆叠一个预训练模型和一些新初始化的分类层。就像这样:

# Load a convolutional base with pre-trained weights
base_model = keras.applications.Xception(weights='imagenet',include_top=False,pooling='avg')# Freeze the base model
base_model.trainable = False# Use a Sequential model to add a trainable classifier on top
model = keras.Sequential([base_model,layers.Dense(1000),
])# Compile & train
model.compile(...)
model.fit(...)

如果你进行迁移学习,你可能会发现自己经常使用这两种模式。


这就是你需要了解的关于序列模式的全部内容!


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

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

相关文章

MySQL数据库高级语句(一)

文章目录 MySQL高级语句older by 排序区间判断查询或与且(or 与and)嵌套查询(多条件)查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符 结语 MySQL高级语句 1构建测试用表 create table test1 (id int prima…

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易!点个关注呗!为大家创造更多的价值! 目录 头歌 实验一 关系数据库标准语言SQL**制作不易!点个关注呗!为大家创造更多的价值!** 第一关:创建数据库第…

Apple Vision Pro应用合集

这里给大家分享一个网站,手机了最新的apple vision pro 上面运行的应用。 1、查找应用:用户可以浏览特色推荐的应用,或者通过随机挑选功能发现新的应用。 2、社区交流:提供社区功能,用户可以在这里交流使用体验、分享…

小程序接入第三方信息流流程 下载SDK

由第三方信息流提供相应的SDK下载链接以及接入说明和开发文档或其他方式接入,如果第三方能支持小程序SDK,则不需要后面步骤,只需要提供相关开发文档和接入方式接口 接入SDK 后台开发人员接入第三方提供的SDK,并进行相关接口开发…

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

如何使用 ChatGPT 进行编码和编程

文章目录 一、初学者1.1 生成代码片段1.2 解释功能 二、自信的初学者2.1 修复错误2.2 完成部分代码 三、中级水平3.1 研究库3.2 改进旧代码 四、进阶水平4.1 比较示例代码4.2 编程语言之间的翻译 五、专业人士5.1 模拟 Linux 终端 总结 大多数程序员都知道&#xff0c;ChatGPT …

GitLab更新失败(Ubuntu)

在Ubuntu下使用apt更新gitlab报错如下&#xff1a; An error occurred during the signature verification.The repository is not updated and the previous index files will be used.GPG error: ... Failed to fetch https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu/d…

thinkadmin 新版安装步骤

1.通过 Composer 安装: ( 推荐方式,默认只安装 admin 模块 ) ### 创建项目( 需要在英文目录下面执行 ) composer create-project zoujingli/thinkadmin### 进入项目根目录 cd thinkadmin### 数据库初始化并安装 ### 默认使用 Sqlite 数据库,若使用其他数据库请按第二步修…

AIGC工具系列之——基于OpenAI的GPT大模型搭建自己的AIGC工具

今天我们来讲讲目前非常火的人工智能话题“AIGC”&#xff0c;以及怎么使用目前的AI技术来开发&#xff0c;构建自己的AIGC工具 什么是AIGC&#xff1f; AIGC它的英文全称为(Artificial Intelligence Generated Content)&#xff0c;中文翻译过来就是“人工智能生成内容”&…

HarmonyOS网格布局:List组件和Grid组件的使用

简介 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“首页”页面中包含两个网格布局&#xff0c;“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表…

java类的定义方式和实例化、this引用、对象的构造及其初始化、封装特性、static修饰成员变量、static修饰成员方法

java类的定义方式和实例化 类的定义和使用 类是用来对一个实体(对象)来进行描述的&#xff0c;主要描述该实体(对象)具有哪些属性(外观尺寸等)&#xff0c;哪些功能(用来干啥)&#xff0c;描述完成后计算机就可以识别了。 在Java中定义类需要用到class关键字具体如下 // 创…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

Oracle 19cADG集群补丁升级

Oracle 19cADG集群补丁升级 文章目录 Oracle 19cADG集群补丁升级1.备库备份2.备库升级Opatch3.备库应用补丁4.主库备份 oracle_home目录5.主库升级Opatch6.注册补丁7.编译无效对象8.检查主库的补丁注册情况9.备库切换主库完成补丁注册 1.备库备份 su - oracle cd $ORACLE_HOME…

[webpack-cli] Invalid options object 报错

[webpack-cli] Invalid options object. Dev Server has been initialized using an options object that does not match the API schema devServer: {contentBase: ./src, // 告诉服务器从哪里提供内容&#xff0c;默认情况下&#xff0c;它会使用当前工作目录作为根目录c…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

Oracle中实现根据条件对数据的增删改操作——Merge Into

一、需求描述 在我们进行项目开发的过程中&#xff0c;会遇到这样的场景&#xff0c;需要根据某个条件对数据进行增、删、改的操作&#xff1b;遇到这种情况我们有2种方法进行解决&#xff1a; 方法一&#xff1a;①查询指定条件&#xff1b;②根据查询出的指定条件结果在执行…

阿里云国际DDoS高防的定制场景策略

DDoS高防的定制场景策略允许您在特定的业务突增时段&#xff08;例如新业务上线、双11大促销等&#xff09;选择应用独立于通用防护策略的定制防护策略模板&#xff0c;保证适应业务需求的防护效果。您可以根据需要设置定制场景策略。 背景信息 定制场景策略提供基于业务场景…

【图论 | 数据结构】用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构,特别适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起,通过数组的方式连接(类似静态数组实现链表)。这种方法的优点是存储空间小,查询速度快,尤其适…

金融投贷通--功能测试分析与设计

金融投贷通功能测试分析与设计 测试点分析借款业务测试点投资业务测试点 测试用例借款业务测试用例投资业务测试用例 缺陷面试题 测试报告 测试点分析 借款业务测试点 投资业务测试点 测试用例 借款业务测试用例 借款成功&#xff08;主业务&#xff09;、借款成功&#xff…

iOS——【CGD】

GCD 什么是GCD GCD指的是Grand Central Dispatch&#xff0c;它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列&#xff08;串行队列或并发队列&#xff09;来管理并发执行的任务&#xff0c;…