【NLP】使用 Keras 保存和加载深度学习模型
一、说明
训练深度学习模型是一个耗时的过程。您可以在训练期间和训练后保存模型进度。因此,您可以从上次中断的地方继续训练模型,并克服漫长的训练挑战。
在这篇博文中,我们将介绍如何保存模型并使用 Keras 逐步加载它。我们还将探索模型检查点回调,它通常用于模型训练。
二、加载数据集
为了演示如何保存模型,让我们使用 MNIST 数据集。此数据集由数字图像组成。

MNIST 数据集
在加载 MNIST 数据集之前,让我们先导入 TensorFlow 和 Keras。
import tensorflow as tf
from tensorflow import keras
现在,让我们使用 Keras 中的方法加载训练和测试数据集。load_data
(train_images,train_labels),(test_images,test_labels)=tf.keras.datasets.mnist.load_data()
训练输入和输出数据集由 60,000 个样本组成,测试输入和输出数据集由 10,000 个样本组成。
三、数据预处理
数据分析最重要的步骤之一是数据预处理。在深度学习中,一些数据预处理技术(如规范化和正则化)可以提高模型的性能。
首先,让我们从这些数据集中获取前 1000 个样本,以更快地运行代码。让我们先对输出变量执行此操作。
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
我们将对训练数据执行相同的操作。数据样本由数字图像组成。这些图像是二维的。在将这些示例提供给模型之前,让我们使用该方法将它们转换为维度。此外,让我们规范化数据以提高模型的性能并使训练速度更快。reshape
train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0
很好,我们的数据集已经为模型做好了准备。让我们继续前进到模型构建步骤。
四、如何构建模型
构建深度学习模型的最简单方法是 Keras 中的顺序技术。在这种技术中,层被逐个堆叠。我们现在要做的是定义一个包含模型的函数。通过这样做,我们可以更轻松地构建模型。
def create_model():model = tf.keras.Sequential([keras.layers.Dense(512, activation='relu',input_shape=(784,)),keras.layers.Dropout(0.2),keras.layers.Dense(10)])model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])return model
让我们来看看这些代码。首先,我们定义一个使用 Keras 创建和编译顺序模型的函数。
我们构建了一个包含两个密集层的模型,第一个层具有512个神经元和一个激活函数。我们还设置了一个 dropout 层,该层随机丢弃 20% 的输入单元,以帮助防止过度拟合。之后,我们编写了一个包含 10 个没有激活函数的神经元的密集层,因为它将用于 logits。relu
接下来,我们使用优化器和损失函数编译模型。作为指标,我们设置 .AdamSparseCategoricalCrossentropySparseCategoricalAccuracy
最后,我们使用语句返回已编译的模型。return
太棒了,我们已经定义了一个简单的顺序模型。现在,让我们从这个函数中获取一个名为 model 的示例对象。
model = create_model()
现在让我们看看使用摘要方法的模型的体系结构。
model.summary()

如您所见,我们的模型由输入层、辍学层和输出层组成。让我们继续探索回调。ModelCheckpoint
五、使用模型检查点回调保存模型权重
可以保存模型以重用已训练的模型,或从上次中断的位置继续训练。
如您所知,构建模型实际上意味着训练模型的权重,称为参数。通过回调,您可以在模型训练期间保存模型的权重。为了说明这一点,让我们从这个回调实例化一个对象。ModelCheckpoint
首先,让我们创建模型将与 os 模块一起保存的目录。
import os
checkpoint_path = "training_1/my_checkpoints"
checkpoint_dir = os.path.dirname(checkpoint_path)
很好,我们已经创建了目录。现在让我们创建一个回调来保存模型的权重。
checkpoint_cb = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,# Let's save only the weights of the modelsave_weights_only=True)
太好了,我们已经创建了回调。现在,让我们调用该方法和对此方法的回调。fitpass
model.fit(train_images,train_labels,epochs=10,validation_data=(test_images, test_labels),callbacks=[checkpoint_cb])

因此,我们将模型权重保存在目录中。我们使用的回调在每个纪元结束时更新检查点文件。让我们使用 os 模块查看目录中的文件。
os.listdir(checkpoint_dir)# Output
['my_checkpoints.index', 'my_checkpoints.data-00000-of-00001', 'checkpoint']
如您所见,权重是在最后一个纪元之后保存的。让我们继续看看如何加载重量。
六、装载权重
保存权重后,可以将其加载到模型中。请注意,您只能将保存的权重用于具有相同体系结构的模型。
让我们实例化一个对象来演示这一点。
model = create_model()
请注意,我们尚未训练此模型的权重。这些权重是随机生成的。现在让我们看看这个未经训练的模型在测试数据上的准确性分数。evaluate
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Untrained model, accuracy: {100 * acc:5.2f}%")# Output:
Untrained model, accuracy: 10.70%
如您所见,未经训练的模型在测试数据上的准确率约为 10%。这是一个相当糟糕的分数,对吧?
现在,让我们加载之前使用该方法保存的权重,然后查看此模型在测试数据上的准确性得分。load_weights
model.load_weights(checkpoint_path)
太棒了,我们加载了重量。现在,让我们检查此模型在测试集上的性能。
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Untrained model, accuracy: {100 * acc:5.2f}%")#Output:
Untrained model, accuracy: 87.40%
如您所见,事实证明该模型的准确率约为90%。
在本节中,我们已经了解了如何保存模型权重以及如何加载它们。现在让我们继续探索如何保存整个模型。
七、保存整个模型
q 训练模型后,可能需要部署该模型。若要将模型的体系结构、权重和训练配置保存在单个文件中,可以使用该方法。save
您可以将模型保存为两种不同的格式,以及 .请记住,在 Keras 中,默认情况下使用该格式。让我们保存最终模型。让我们为它创建一个目录。SaveModelHDF5SavedModel
mkdir saved_model
现在让我们将模型保存在此文件中。
model.save('saved_model/my_model')
太好了,我们保存了我们的模型。让我们看一下此目录中的文件。
ls saved_model/my_model# Output:
assets fingerprint.pb keras_metadata.pb saved_model.pb variables
在这里,您可以看到文件和子目录。不需要模型的源代码即可将模型投入生产。 足以进行部署。让我们仔细看看这些文件。SavedModel
该文件包含模型的体系结构和计算图形。saved_model.pd
该文件包含 Keras 所需的额外信息。keras_metadata.pb
子目录包含权重和偏差等参数值。variables
子目录包含额外的文件,例如属性和类的名称。assets
很好,我们看到了如何保存整个模型。现在让我们看看如何加载模型。
八、加载模型
您可以使用该方法加载保存的模型。为此,让我们首先创建模型体系结构,然后加载模型。load_model
new_model = create_model()
new_model = tf.keras.models.load_model('saved_model/my_model')
太棒了,我们已经加载了模型。让我们看一下这个模型的架构。
new_model.summary()

请注意,此模型是使用与原始模型相同的参数编译的。让我们看看这个模型在测试数据上的准确性。
loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)
print(f'Restored model, accuracy: {100 * acc:5.2f}%')# Output:
Restored model, accuracy: 87.40%
如您所见,我们保存在测试数据上的模型的准确性得分为 87%。
您还可以以格式保存模型。但是大多数TensorFlow部署工具都需要这种格式。h5SavedModel
九、总结
训练模型时,可以保存模型以从上次中断的地方继续。通过保存模型,您还可以共享您的模型并允许其他人重新创建您的工作。
在这篇博文中,我们介绍了如何保存和加载深度学习模型。首先,我们学习了如何使用回调保存模型权重。接下来,我们看到了保存和加载整个模型以部署模型。ModelCheckpoint
感谢您的阅读。您可以在此处找到笔记的链接。
参考资料:
如何使用 Keras 保存和加载深度学习模型? |迈向人工智能 (towardsai.net)
相关文章:
【NLP】使用 Keras 保存和加载深度学习模型
一、说明 训练深度学习模型是一个耗时的过程。您可以在训练期间和训练后保存模型进度。因此,您可以从上次中断的地方继续训练模型,并克服漫长的训练挑战。 在这篇博文中,我们将介绍如何保存模型并使用 Keras 逐步加载它。我们还将探索模型检查…...
视频标注是什么?和图像数据标注的区别?
视频数据标注是对视频剪辑进行标注的过程。进行标注后的视频数据将作为训练数据集用于训练深度学习和机器学习模型。这些预先训练的神经网络之后会被用于计算机视觉领域。 自动化视频标注对训练AI模型有哪些优势 与图像数据标注类似,视频标注是教计算机识别对象…...
【Android知识笔记】UI体系(一)
Activity的显示原理 setContentView 首先开发者Activity的onCreate方法中通常调用的setContentView会委托给Window的setContentView方法: 接下来看Window的创建过程: 可见Window的实现类是PhoneWindow,而PhoneWindow是在Activity创建过程中执行attach Context的时候创建的…...
SpringBoot 整合Docker Compose
Docker Compose是一种流行的技术,可以用来定义和管理你的应用程序所需的多个服务容器。通常在你的应用程序旁边创建一个 compose.yml 文件,它定义和配置服务容器。 使用 Docker Compose 的典型工作流程是运行 docker compose up,用它连接启动…...
SpringBoot整合Elasticsearch
SpringBoot整合Elasticsearch SpringBoot整合Elasticsearch有以下几种方式: 使用官方的Elasticsearch Java客户端进行集成 通过添加Elasticsearch Java客户端的依赖,可以直接在Spring Boot应用中使用原生的Elasticsearch API进行操作。参考文档 使用Sp…...
【R3F】0.9添加 shadow
开启使用shadow 在 canvas 设置属性shadows 在对应的 mesh 中设置 产生阴影castShadow和接收阴影receiveShadow 设置完成之后,即可实现阴影 ...<Canvas shadows > <mesh castShadow ><boxGeometry /><meshStandardMaterial color="mediumpurple&qu…...
【JavaEE初阶】HTTP请求的构造及HTTPS
文章目录 1.HTTP请求的构造1.1 from表单请求构造1.2 ajax构造HTTP请求1.3 Postman的使用 2. HTTPS2.1 什么是HTTPS?2.2 HTTPS中的加密机制(SSL/TLS)2.2.1 HTTP的安全问题2.2.2 对称加密2.2.3 非对称加密2.2.3 中间人问题2.2.5 证书 1.HTTP请求的构造 常见的构造HTTP 请求的方…...
探索和实践:基于Python的TD-PSOLA语音处理算法应用与优化
今天我将和大家分享一个非常有趣且具有挑战性的主题:TD-PSOLA语音处理算法在Python中的应用。作为一种在语音合成和变换中广泛使用的技术,TD-PSOLA (Time-Domain Pitch-Synchronous Overlap-Add) 提供了一种改变语音音高和时间长度而不产生显著失真的有效方法。在本篇博客中,…...
Linux 下centos 查看 -std 是否支持 C17
实际工作中,可能会遇到c的一些高级特性,例如std::invoke,此函数是c17才引入的,如何判断当前的gcc是否支持c17呢,这里提供两种办法。 1.根据gcc的版本号来推断 gcc --version,可以查看版本号,笔者…...
【算法训练营】字符串转成整数
字符串转成整数 题目题解代码 题目 点击跳转: 把字符串转换为整数 题解 【题目解析】: 本题本质是模拟实现实现C库函数atoi,不过参数给的string对象 【解题思路】: 解题思路非常简单,就是上次计算的结果10,相当于10…...
入局元宇宙,所谓的无限可能到底在哪里?
最近的热点新闻表明,人们似乎认为元宇宙已经走向“死亡”。但实际上,市场应该重新定义对元宇宙的看法,以及正视它最大的机会所在——游戏领域。 1937年5月6日,一架名为兴登堡号的巨大氢能齐柏林飞艇飞临新泽西州曼彻斯特镇上空&a…...
为什么 SSH(安全终端)的端口号是 22 !!
导读为什么 SSH(安全终端)的端口号是 22 呢,这不是一个巧合,这其中有个我(Tatu Ylonen,SSH 协议的设计者)未曾诉说的故事。 将 SSH 协议端口号设为 22 的故事 1995 年春我编写了 SSH 协议的最…...
k8s Label 2
在 k8s 中,我们会轻轻松松的部署几十上百个微服务,这些微服务的版本,副本数的不同进而会带出更多的 pod 这么多的 pod ,如何才能高效的将他们组织起来的,如果组织不好便会让管理微服务变得混乱不堪,杂乱无…...
layui踩坑记录之form表单下的button按钮默认自动提交
首先参考下面这篇文章: layui form表单下的button按钮会自动提交表单的问题以及解决方案_layui form里面其他button按钮_你用点心就行的博客-CSDN博客 他说的已经很清楚了,我再补充(啰嗦)一下: 其实就是使用form的时…...
2-vi和vim的使用
vi和vim的区别 vi 是linux系统中内置的文本编辑器vim具有程序编辑能力 vi和vim常用的三种模式 正常模式 使用vim打开一个文件,就默认进入正常模式可以使用方向键【上下左右】来移动光标可以使用【删除字符/删除整行】来处理文件内容也可以使用【复制/粘贴】快捷键…...
微服务——Nacos配置管理
目录 Nacos配置管理——实现配置管理 配置管理实践 Nacos配置管理——微服务配置拉取 Nacos配置管理——配置热更新 方式一: 编辑 方式二(推荐方式): Nacos配置管理——多环境配置共享 优先级问题 Nacos配置管理——nacos集群搭建 总结编辑 Nacos配置管理——实现配置管…...
如何为WordPress博客网站配置免费域名HTTPS证书
文章目录 如何为WordPress博客网站配置免费域名HTTPS证书前置条件:步骤1 申请免费的域名HTTPS证书步骤2 将HTTP证书配置到cpolar的配置文件中2.1 创建证书文件夹2.2 修改cpolar配置文件2.3 重启cpolar服务2.4 查看后台Wordpress隧道是否在线正常2.5 用浏览器打开站点…...
React之内置的高阶组件
React之内置的高阶组件 React内置了一些高阶组件,以便对一些组件做特殊处理,从而提高代码性能。例如React.memo、React.forwardRef 注意:高阶组件不是Reacts视图组件 什么是高阶组件 高阶组件本质是高阶函数。高阶组件接收一个组件作为参数&…...
【kubernetes系列】flannel之vxlan模式原理
概述 在Kubernetes中要保证容器之间网络互通,网络至关重要。而Kubernetes本身并没有自己实现容器网络,而是而是借助CNI标准,通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则: Pod无论运行在任何节点都可…...
PostgreSQL -- 备份恢复命令
前言 这是我在这个网站整理的笔记,关注我,接下来还会持续更新。 作者:RodmaChen PostgreSQL -- 备份恢复命令 一. pg_dump常用参数二. pg_dumpall三. psql四. pg_restore五.参考文章 PostgreSQL 13.7 一. pg_dump常用参数 pg_dump 把一个数据…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...
