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

news2024/12/22 18:53:34

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: 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.coloradmin.cn/o/1547695.html

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

相关文章

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作,本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以,还是引用一下百度百科吧: Docker 是一个开源的应用容器引擎,让开发者可以…

初探Notion安装与使用

笔记工具哪家强,有道云笔记,印象笔记,记事本,notion 第一步、下载与安装 本次选择是window版本,下载地址【Notion官网】 版本为Notion Setup 3.3.0,软件大小74.3M,官网如下图所示。 进入登录…

STM32之HAL开发——DMA转运串口数据

DMA功能框图(F1系列) 如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求, DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现四

【简单介绍】 经过精心设计和深度整合,我们成功推出了这款融合了先进目标检测算法YOLOv8与高效PyQt5界面开发框架的目标检测GUI界面软件。该软件在直观性、易用性和功能性方面均表现出色,为用户提供了高效稳定的操作体验。 在界面设计方面,…

1.5T数据惨遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件93起,近三周攻击数量呈现持平状态。 本周Lockbit3.0是影响最严重的勒索家族,Blacksuit和Ransomhub恶意家族紧随其后,从整体上看Lockbit3.0依旧是影响最严重的勒索家族,需要注意防范。 …

MT6762_联发科MTK6762安卓核心板规格参数

MTK6762核心板是一款集成了蓝牙、fm、wlan和gps模块的高度集成基带平台,为LTE/LTE-A和C2K智能手机应用程序提供支持。该安卓核心板集成了ARM Cortex-A53处理器,工作频率可达2.0GHz,并且还集成了功能强大的多标准视频编解码器。除此之外&#…

如何区分模型文件是稳定扩散模型和LORA模型

区分模型文件是否为稳定扩散模型(Stable Diffusion Models)或LORA模型(LowRank Adaptation)通常需要对模型的结构和内容有一定的了解。以下是一些方法来区分这两种模型文件: 1. 文件格式和结构 稳定扩散模型&#xff1…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(7)

接前一篇文章:软考 系统架构设计师系列知识点之云原生架构设计理论与实践(6) 所属章节: 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本,对于云原生架构的…

使用npm仓库的优先级以及.npmrc配置文件的使用

使用npm仓库的优先级以及.npmrc配置文件的使用 概念如何设置 registry(包管理仓库)1. 设置项目配置文件2. 设置用户配置文件3. 设置全局配置文件4. .npmrc文件可以配置的常见选项 概念 npm(Node Package Manager)是一个Node.js的…

PanTools v1.0.17 多网盘批量管理 批量分享、转存、复制...

软件介绍 一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等,支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等,对于管理名下具有多个网盘多个账号具有…

CSS 实现毛玻璃效果 | backdrop-filter与filter的区别

CSS 毛玻璃效果是一种使用 CSS 创建的视觉效果&#xff0c;可以使元素或区域呈现出模糊或半透明的外观&#xff0c;就像毛玻璃一样。 示例&#xff1a; <div class"container"><div class"textHolder"><p>glass</p></div>…

gitee多用户配置

一、引言 在工作的时候我们有时候会自己创建项目Demo来实现一些功能&#xff0c;但是又不想把自己的Demo代码放到公司的仓库代码平台&#xff08;gitee&#xff09;中管理&#xff0c;于是就是想自己放到自己的Gitee中管理&#xff0c;于是就需要配置Git多用户。 本文将配置分别…

论文篇05-论文范文-论数据访问层设计技术及其应用(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

试题:论数据访问层设计技术及其应用 在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清晰,便于提高复用能力和产品维护能力。一种常见的层次划分模型是将信息系统分…

谷粒商城——缓存——SpringCache

1. 配置使用 首先需要导入相关的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency> 随后在配置文件中进行配置&#xff1a; spring:cache:t…

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺&#xff08;repeat&#xff09; ③、背景位置(position) ④、背景附着&#xff08;attachment&#xff09; ⑤、背景透明(CSS3) ⑥、背景图片缩放大小&#xff08;size&#xff09;&#xff1a; ⑦、背景简写 2、标签显…

Netty源码剖析——ChannelHandlerContext 篇(三十七)

ChannelHandlerContext 作用及设计 ChannelHandlerContext 继承了出站方法调用接口和入站方法调用接口 ChannelOutboundInvoker 和 ChannelInboundInvoker 部分源码 这两个invoker就是针对入站或出站方法来的&#xff0c;就是在入站或出站 handler 的外层再包装一层&#xff0c…

C语言文件操作(详细)

⽬录 一. 为什么使⽤⽂件&#xff1f; 二. 什么是⽂件&#xff1f; 三. ⼆进制⽂件和⽂本⽂件&#xff1f; 四. ⽂件的打开和关闭 五. ⽂件的顺序读写 六. ⽂件的随机读写 七. ⽂件读取结束的判定 八. ⽂件缓冲区 一. 为什么使⽤⽂件&#xff1f; 如果没有⽂件&#…

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构 数组链表栈使用场景 队列应用场景 哈希表特点哈希函数&#xff0c;哈希值&#xff0c;哈希冲突键值对 Entry 开放寻址法和拉链法 参考文档 数组 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成&#xff0c;并且是使用一块连续的内存来存储的。 在数组…

【idea快捷键】idea开发java过程中常用的快捷键

含义win快捷键mac快捷键复制当前行或选定的代码块Ctrl DCommand D通过类名快速查找类Ctrl NCommand N通过文件名快速查找文件Ctrl Shift NCommand Shift N通过符号名称快速查找符号&#xff08;类、方法等&#xff09;Ctrl Alt Shift NCommand Shift O跳转到声明C…

Ps:必须知道的四大混合模式

在 Photoshop 中有多达六组 27 种混合模式&#xff0c;不仅可应用于图层之间&#xff0c;在画笔等工具、图层样式等里面也都有&#xff0c;几乎可以说是无处不在。 有关混合模式的原理及说明&#xff0c;请参阅&#xff1a; 《Ps 混合模式&#xff08;合集&#xff09;》 在所有…