【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)

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

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

相关文章

JavaSwing+MySQL的酒店管理系统

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88063706?spm1001.2014.3001.5503 JDK1.8、MySQL5.7 功能:散客开单:完成散客的开单,可一次最多开5间相同类型的房间。 2、团体开单:完成团体…

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员&#xff09…

醉梦仙踪:二叉树狂想曲,中序遍历的华丽穿梭

本篇博客会讲解力扣“94. 二叉树的中序遍历”的解题思路,这是题目链接。 如何对二叉树进行中序遍历呢?所谓中序遍历,即先遍历左子树,接着遍历根节点,最后遍历右子树的一种遍历方式。具体来说,假设有某一种“…

htmlCSS-----背景样式

目录 前言: 背景样式 1.背景颜色 background-color 2.背景图片 background-image 背景的权重比较 代码示例: 前言: 很久没写文章了,会不会想我呢!今天我们开始学习html和CSS的背景样式以及文字样式&#xff…

qt 5.12.6配置 msvc2015 32bit

qt 5.12.6配置 msvc2015 32bit 1.添加临时档案库2.安装 msvc20153. 配置 qmake 环境4.修改系统环境变量5.问题修改1.qt没有被正确的安装,请运行make install2.QT编译出错:rc不是内部或外部命令,也不是可运行的程序 或批处理文件。3.QT License check fai…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

php使用PDO_sqlsrv

php拓展下载:Microsoft Drivers for PHP 发行说明 - PHP drivers for SQL Server | Microsoft Learn 参考文章:php7.3.4 pdo方式连接sqlserver 设置方法_pdo sqlserver_黑贝是条狗的博客-CSDN博客 php5.6.9安装sqlsrv扩展(windows&#xff0…

CXL Bias Mode (1) - Bias Mode 背景与分类

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

SUSE宣布推出免费RHEL分叉以保留企业级Linux的选择权

导读在Red Hat宣布将限制AlmaLinuxOS或Rocky Linux等社区发行版对其公共仓库的访问后,最近Red Hat与IBM之间发生了一些争论,有鉴于此,SUSE今天宣布计划为RHEL和CentOS用户提供一个免费的替代方案。 SUSE已经开发了SUSE Linux Enterprise (SLE…

【问题记录】Ubuntu 22.04 环境下,打开 VS Code 老是访问密钥环该怎么解决?

目录 环境 问题情况 解决方法 环境 VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 问题情况 在Ubuntu下,每次运行 VS Code时,老是提示要输入密钥密码来解锁保存在密钥环&am…

C语言程序运行需要的两大环境《C语言进阶》

目录 程序的翻译环境和执行环境 翻译环境分为两部分,编译链接 第一步:预编译(预处理) 第二步,编译 第三步:汇编 关于运行环境分为四点: 关于链接库 程序的翻译环境和执行环境 在 ANSI C(标…

【全面解析】Windows 如何使用 SSH 密钥远程连接 Linux 服务器

创建密钥 创建 linux 服务器端的终端中执行命令 ssh-keygen,之后一直按Enter即可,这样会在将在 ~/.ssh/ 路径下生成公钥(id_rsa.pub)和私钥(id_rsa) 注意:也可以在 windows 端生成密钥,只需要保证公钥在服务器端,私钥…

Apache Struts2漏洞复现之s2-001漏洞复现

0x01 声明: 仅供学习参考使用,请勿用作违法用途,否则后果自负。 0x02 简介: Apache Struts 2是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java ServletAPI,鼓励开发者采用MVC架构…

Android ObjectBox数据库的使用与详解

一、介绍 Room数据库 之前我已介绍了jetpack组件的数据库:Room,有小伙伴需要了解Room数据库可以查看这个地址:Android JetPack组件之Room数据库的集成与详解_android room数据库_蜗牛、Z的博客-CSDN博客 数据库的性能对设备来说很重要&#…

安全开发-JS应用原生开发JQuery库Ajax技术加密编码库断点调试逆向分析元素属性操作

文章目录 JS原生开发-文件上传-变量&对象&函数&事件JS导入库开发-登录验证-JQuery库&Ajax技术JS导入库开发-编码加密-逆向调试 JS原生开发-文件上传-变量&对象&函数&事件 1、布置前端页面 2、JS获取提交数据 3、JS对上传格式判断 <script>…

抖音seo开源源码,抖音优化系统定制方案

抖音作为目前最火热的短视频平台之一&#xff0c;其在移动互联网领域的影响越来越大。然而&#xff0c;一款成功的产品未必仅仅靠着其自身的功能和品质就能获得市场的认可&#xff0c;还需要通过优化SEO来实现更好的曝光率。下面&#xff0c;本文将介绍如何优化抖音SEO源码开发…

Vue3通透教程【十六】TS编译配置

文章目录 &#x1f31f; 写在前面&#x1f31f; 初始化配置文件⭐ target⭐ module⭐ lib⭐ types/node⭐ include⭐ outDir&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更…

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

Data Transfer Object-DTO,数据传输对象,前端参数设计多个数据表对象

涉及两张表的两个实体对象 用于在业务逻辑层和持久层&#xff08;数据库访问层&#xff09;之间传输数据。 DTO的主要目的是将多个实体&#xff08;Entity&#xff09;的部分属性或多个实体关联属性封装成一个对象&#xff0c;以便在业务层进行数据传输和处理&#xff0c;从而…

Python 算法基础篇:冒泡排序和选择排序

Python 算法基础篇&#xff1a;冒泡排序和选择排序 引言 1. 冒泡排序算法概述2. 冒泡排序算法实现实例1&#xff1a;冒泡排序 3. 选择排序算法概述4. 选择排序算法实现实例2&#xff1a;选择排序 5. 冒泡排序与选择排序的对比总结 引言 冒泡排序和选择排序是两种常用的排序算法…