【如何训练一个中译英翻译器】LSTM机器翻译模型部署之ncnn(python)(四)

news2024/11/23 14:51:20

ncnn:https://github.com/Tencent/ncnn

1、.h5模型保存为TFSaveModel格式

import tensorflow as tf
from keras.models import load_model

# 加载Keras模型
model = load_model('encoder_model.h5')

# 转换为SavedModel类型
tf.saved_model.save(model, 'TFSaveModel')

2、TFSaveModel格式模型保存为onnx模型

python3 -m tf2onnx.convert --saved-model TFSaveModel --output onnxModel/encoder_model.onnx

打开https://netron.app/来看下网络结构,主要是先看输入部分的维度(网络结构后面会细讲哈)
可以看到输入维度[unk__64、unk__65、62],我们需要将unk__64、unk__65这两个改为具体数值,否则在导出ncnn模型时会报一些op不支持的错误,那么问题来了,要怎么改呢,我也不知道啊!!!
哈哈哈,开完笑的,都写出来了,怎么会不知道,请听我慢慢说来。
在这里插入图片描述
其实数据第一个是batch,第二个是输入句子的最大长度,第三个是字符总数量,我们在推理时,batch size一般为1,所以这个input_1的shape就是[1,max_encoder_seq_length, num_encoder_tokens]
max_encoder_seq_length, num_encoder_tokens 这两个参数可以在训练的时候获取到了,拿到这个input shape 之后,对onnx模型进行simplify,我训练出来的模型时得到的shape是[1,16,62],因此执行以下命令:

python3 -m onnxsim onnxModel/encoder_model.onnx onnxModel/encoder_model-sim.onnx --overwrite-input-shape 1,16,62

可得到简化后的onnx模型啦
在这里插入图片描述
这个时候,我们再用https://netron.app打开encoder_model-sim.onnx,可以看到encoder模型的输出了,有两个输出,均为[1,256]的维度
在这里插入图片描述
然后我们需要对decoder_model.h5也进行转换,

import tensorflow as tf
from keras.models import load_model

# 加载Keras模型
model = load_model('decoder_model.h5')

# 转换为SavedModel类型
tf.saved_model.save(model, 'TFSaveModel')
python3 -m tf2onnx.convert --saved-model TFSaveModel --output onnxModel/decoder_model.onnx

同样打开模型来看,能看到一共有三个输入,其中的input_3:[unk__57,256],input_4:[unk__58,256],为encoder的输出,因此可以得到这两个输入维度均为[1,256],那 input_2:[unk__55,unk__56,849]的维度是多少呢,我们接着往下看。
在这里插入图片描述
我们想一想,解码器除了接受编码器的数据,还有什么数据没给它呢,没有错,就是target_characters的特征,对于英翻中而言就是中文的字符,要解码器解出中文,肯定要把中文数据给它,要不然你让解码器去解空气嘛,实际上这个 input_2的维度就是

target_seq = np.zeros((1, 1, num_decoder_tokens))

num_decoder_tokens同样可以在训练的时候获取到(至于不知道怎么来的,可以看这个系列文章的第一、二篇),我这边得到的num_decoder_tokens是849,当然实际上这个模型的 input_2:[unk__55,unk__56,849]已经给了num_decoder_tokens,我们只需要把unk__55,unk__56都改为1就可以了,即[1,1,849],那么对onnx进行simplify

python3 -m onnxsim onnxModel/decoder_model.onnx onnxModel/decoder_model-sim.onnx --overwrite-input-shape input_2:1,1,849 input_3:1,256 input_4:1,256

成功完成simplify可得到:
在这里插入图片描述完成了onnx模型的转换之后,我们要做的就是将模型转换为ncnn模型

3、onnx模型转换为ncnn

onnx2ncnn onnxModel/encoder_model-sim.onnx ncnnModel/encoder_model.param ncnnModel/encoder_model.bin
onnx2ncnn onnxModel/decoder_model-sim.onnx ncnnModel/decoder_model.param ncnnModel/decoder_model.bin

转换成功可以看到:
在这里插入图片描述

4、ncnn模型加载与推理(python版)

未完待续

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

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

相关文章

ssm 图书借阅管理系统 【纯干货分享,免费领源码06780】

大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图书馆的要求下,开发一款整体式结构的图书借阅管理系统&#xf…

5.44 综合案例2.0-矩阵键盘信息输入上传-OLED屏幕

综合案例2.0-矩阵键盘信息输入上传-OLED屏幕 案例说明1、应用场景2、M320矩阵引脚说明3、接线说明 搭建云平台环境1.添加设备2.创建设备类型3.功能定义(创建物模型) 代码1.更改MQTT信息 测试 案例说明 矩阵键盘输入信息显示在OLED显示屏上。按确定键可以…

Django 图书管理系统

一、功能及页面设计 二、页面展示 (1)首页 (2)注册 (3)登录 (4)普通用户登录 4.1查看图书页面 4.2查看图书详情页 4.3修改密码 (5)管理员登录 5.1添加图书 5.2添加图片 三、代码展示 因为代码太多不好一个个展示 所以需要源码的小伙伴可以找我要代码 感谢三连支持&#xff0…

云计算需求激增带来的基础设施挑战及解决方案

云计算的指数级增长迅速改变了我们消费和存储数字信息的方式。随着企业和个人越来越依赖基于云的服务和数据存储,对支持这些服务的强大且可扩展的基础设施的需求已达到前所未有的水平。 云计算需求的快速增长 我们的日常生活越来越多地被新技术所渗透。流媒体服务、…

剑指 Offer 29. 顺时针打印矩阵 / LeetCode 54. 螺旋矩阵(模拟)

题目: 链接:剑指 Offer 29. 顺时针打印矩阵;LeetCode 54. 螺旋矩阵 难度:中等 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入&#xff1a…

Fiddler Everywhere(TTP调试抓包工具) for Mac苹果电脑版

Fiddler Everywhere for Mac版是Mac电脑上的一款跨平台的HTTP调试抓包工具,Fiddler Everywhere for Mac能够记录客户端与服务器之间的所有HTTP(S)通信,支持对包进行监视、分析、设置断点、甚至修改请求/响应数据等操作。 适用于任…

2009年上半年 软件设计师 上午试卷2

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

Golang GORM 模型定义

模型定义 参考文档:https://gorm.io/zh_CN/docs/models.html 模型一般都是普通的 Golang 的结构体,Go的基本数据类型,或者指针。 模型是标准的struct,由Go的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成&#x…

安全初级:字符编码

字符编码 字符编码:是一种映射规则,根据映射规则将字符映射成其他形式的数据在计算机中存储和传输。 常用的编码 编码制定时间作用ASCII1967表示英语及西欧语言GB23121980国家简体中文字符集,兼容ASCIIUnicode1991国际标准化组织统一标准字…

【C++】继承和多态高频面试题整理

文章目录 1. 选择题2. 问答题2.1 什么是多态?2.2 什么是重载、重写(覆盖)、重定义(隐藏)?2.3 多态的实现原理?2.4 inline函数可以是虚函数吗?2.5 静态成员可以是虚函数吗?2.6 构造函数可以是虚函数吗?2.7 析…

华为云零代码平台AstroZero新手操作指南-3分钟体验创建培训报名表

华为云Astro轻应用Astro Zero是华为云为行业客户、合作伙伴、开发者量身打造的低代码/零代码应用开发平台,提供全场景可视化开发能力和端到端部署能力,可快速搭建行业和大型企业级应用并沉淀复用行业资产,加速行业数字化。 在AstroZero上&am…

el-tabel导出excel表格

1、安装插件 npm install file-saver --save npm install xlsx --save 2、引入插件 import FileSaver from "file-saver"; import * as XLSX from xlsx; 3、在tabel中添加ref属性和导出方法 4、添加方法 exportExcel (excelName) {try {const $e this.$refs[repo…

DFS之剪枝与优化--小猫爬山

思路&#xff1a;对小猫的数量和车箱数进行bfs&#xff0c;一旦小猫的数量达到n&#xff0c;就统计ans的数量&#xff0c;如果当前车的剩余重量无法再承受任意一个猫的重量&#xff0c;那么我们将车辆数1来保证小猫能够下山。 #include<bits/stdc.h> using namespace std…

ChatGPT使用技巧和实践

在工作使用当中&#xff0c;需要使用到GPT&#xff0c;目前使用的是浏览器端的WeTab。 下面是给AI的提问和交互 请写出HashMap和Hashtable的区别 HashMap和Hashtable是Java中两种常用的哈希表实现&#xff0c;它们在功能和使用上有一些区别。线程安全性&#xff1a;HashMap是…

如何利用在线培训考试系统提升员工技能?

在如今竞争激烈的商业环境中&#xff0c;不断提升员工的技能和知识变得至关重要。为了满足这一需求&#xff0c;越来越多的企业开始采用在线培训考试系统。借助这种系统&#xff0c;企业可以以有效和高效的方式提供培训&#xff0c;并确保员工能够学到最新的知识和技能。 1. 灵…

3.2 队列

定义: 队列是一种插入元素只能在一端进行, 删除元素只能在另一端进行的线性表. 所谓队列是线性表, 是指队列的逻辑结构属于线性表, 只不过在操作上加了一些约束. 队列可以插入元素的一端叫做队尾(Rear), 可以删除元素的一端叫做队头(Front). 队列是一种先进先出的结构. First I…

vue创建脚手架项目启动

vue创建脚手架项目&启动 1、创建项目2、运行项目 1、创建项目 vue create vuecli-demo说明这里使用vue2项目 2、运行项目 cd vuecli-demo yarn serve访问 http://localhost:8080/

springboot()—— 集成redis

1、新建一个springboot项目 2、添加redis依赖包 可以在新建项目的时候就选上 也可以建完项目以后手动导入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </d…

[uni-app] 微信小程序 - 组件找不到/导入报错 (分包问题导致)

文章目录 问题表现问题原因 问题表现 切换了个路径下的组件, 导入失败, 尝试了清缓存\重启\删项目等一些列操作均无效 上面两个路径中, 都存在一模一样的videItem.vue Main路径是可以导入的 Main路径是无法导入的 问题原因 后来发现, 是 分包的问题导致. 我们先来假设一个场…

如何通过日志分析性能

根据监控指标&#xff0c;只要有一项指标不超了&#xff0c;就不满足性能&#xff0c;根据这个指标&#xff0c;分析数据流向&#xff0c;看下到底什么原因导致这个指标超了&#xff0c;是本身原因还是其它原因&#xff0c;分析客户端、网络、硬件、中间件、数据库、应用程序等…