Pytorch与深度学习 #10.PyTorch训练好的模型如何部署到Tensorflow环境中

1. Tensorflow vs Pytorch

在这个AI时代,各大厂商都在主推自家的AI框架,因此知名和不知名的大大小小可能十来种。但是我们选型的时候,一般首先考虑是Google家的Tensorflow呢还是Meta家的Pytorch。

在选择 PyTorch 或 TensorFlow 进行工业级开发时,以下是一些考虑因素:

1.1. PyTorch

  1. 易用性和灵活性

    • PyTorch 的动态计算图使其更易于调试和开发。代码风格类似于 Python,因此对开发者友好。
    • 适合研究和快速原型开发。
  2. 社区和支持

    • PyTorch 拥有活跃的社区和大量的开源项目支持。Facebook 主要推动其发展。
    • 在学术界和研究领域非常受欢迎。
  3. 性能

    • PyTorch 具有优秀的性能,特别是在 GPU 上进行训练和推理。
    • 支持分布式训练。

1.2. TensorFlow

  1. 生产环境和部署

    • TensorFlow 在工业级生产环境中的部署工具更为完善。其 TensorFlow Serving、TensorFlow Lite 和 TensorFlow.js 提供了多种部署选项,涵盖服务器、移动设备和网页。
    • TensorFlow Extended (TFX) 提供了一套完整的生产级机器学习流水线工具。
  2. 社区和支持

    • 由 Google 维护,拥有强大的技术支持和丰富的资源。
    • 拥有广泛的企业使用案例和成功部署经验。
  3. 兼容性和扩展性

    • TensorFlow 2.0 之后引入了更易用的 API,改善了用户体验,同时保留了强大的功能和灵活性。
    • 支持多种编程语言,包括 Python、C++ 和 JavaScript。

1.3. 简单的说

  • PyTorch:适合需要灵活性、易用性以及快速开发原型的项目,特别是在研究和开发阶段。
  • TensorFlow:适合需要稳定性、成熟的生产环境支持和多种部署选项的工业级项目。

如果你的项目需要快速迭代和实验,可以选择 PyTorch。如果你更关注部署和生产环境的稳定性,TensorFlow 可能是更好的选择。

1.4. 但是…

但是,孩子才做选择,成年人都是

在这里插入图片描述

但是,我们不禁又遇到一个问题,怎么即享受Pytorch带来的便利的同时,还能拥有Tensorflow的广泛性。所以这篇文章就是告诉你该怎么做的一个指南。

2. 将Pytorch模型转换成Tensorflow的模型

步骤 1:使用 PyTorch 训练和保存模型

假设我们使用 PyTorch 训练了一个简单的模型,并将其保存为 .pt 文件。

import torch
import torch.nn as nn# 定义一个简单的模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc1 = nn.Linear(28 * 28, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 实例化模型并训练(假设训练代码已完成)
model = SimpleModel()# 保存 PyTorch 模型
torch.save(model.state_dict(), 'simple_model.pth')

步骤 2:将 PyTorch 模型转换为 ONNX 格式

ONNX(Open Neural Network Exchange)是一种开放的中间格式,支持从 PyTorch 导出并在 TensorFlow 中导入。

import torch.onnx# 定义输入张量的大小(例如,MNIST 数据集的输入是 1x28x28)
dummy_input = torch.randn(1, 28 * 28)# 加载模型并导出为 ONNX 格式
model.load_state_dict(torch.load('simple_model.pth'))
model.eval()
torch.onnx.export(model, dummy_input, 'simple_model.onnx', input_names=['input'], output_names=['output'])

步骤 3:将 ONNX 模型转换为 TensorFlow SavedModel 格式

可以使用 onnx-tf 工具将 ONNX 模型转换为 TensorFlow SavedModel 格式。

  1. 安装 onnx-tf

    pip install onnx-tf
    
  2. 使用 onnx-tf 进行转换:

    onnx-tf convert -i simple_model.onnx -o simple_model_saved_model
    

步骤 4:将 TensorFlow SavedModel 转换为 TensorFlow Lite 格式

有了 TensorFlow SavedModel 后,我们可以使用 TensorFlow Lite 转换器将其转换为 .tflite 文件。

import tensorflow as tf# 加载 SavedModel
converter = tf.lite.TFLiteConverter.from_saved_model('simple_model_saved_model')# 可选:进行量化来优化模型大小和速度(例如动态范围量化)
converter.optimizations = [tf.lite.Optimize.DEFAULT]# 转换模型为 TFLite 格式
tflite_model = converter.convert()# 保存 TFLite 模型
with open('simple_model.tflite', 'wb') as f:f.write(tflite_model)

步骤 5:将 TensorFlow Lite 模型部署到目标设备上并运行推理

.tflite 文件复制到目标设备(例如树莓派)上,并使用 TensorFlow Lite 的解释器运行推理。

在树莓派或其他设备上,可以使用 Python 代码加载和运行 TensorFlow Lite 模型:

import numpy as np
import tensorflow as tf# 加载 TFLite 模型
interpreter = tf.lite.Interpreter(model_path='simple_model.tflite')
interpreter.allocate_tensors()# 获取输入和输出张量的信息
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()# 创建一个模拟的输入数据(例如手写数字图像)
input_data = np.random.rand(1, 28 * 28).astype(np.float32)# 填充输入数据
interpreter.set_tensor(input_details[0]['index'], input_data)# 执行推理
interpreter.invoke()# 获取输出结果
output_data = interpreter.get_tensor(output_details[0]['index'])
print("Predicted output:", output_data)

3. 如何在树莓派上运行 Tensorflow Lite 模型

在树莓派上运行 TensorFlow Lite (TFLite) 文件,你需要安装 TensorFlow Lite 运行时。这是一个轻量级的版本,专门为边缘设备优化,适合树莓派等资源受限的环境。以下是如何在树莓派上安装 TensorFlow Lite 运行时的步骤:

3.1. 安装 TensorFlow Lite 运行时

TensorFlow Lite 提供了专门为树莓派编译的二进制文件,可以直接通过 pip 安装。你需要确保树莓派上已经安装了 Python 3(建议使用 Python 3.7 或更高版本)。

  1. 更新系统包:

    sudo apt-get update
    sudo apt-get upgrade
    
  2. 安装 TensorFlow Lite 运行时:

    pip3 install tflite-runtime
    

    这将安装 TensorFlow Lite 运行时的轻量级版本,它只包含运行 TFLite 模型所需的必要组件。

3.2. 测试安装

安装完成后,你可以测试一下是否成功安装了 TensorFlow Lite 运行时。

import tflite_runtime.interpreter as tflite
print("TensorFlow Lite Runtime version:", tflite.__version__)

如果没有报错并打印出版本信息,就说明安装成功。

3.3. 运行 TFLite 模型

下面是一个在树莓派上运行 TFLite 模型的示例代码:

import numpy as np
import tflite_runtime.interpreter as tflite# 加载 TFLite 模型
interpreter = tflite.Interpreter(model_path="your_model.tflite")
interpreter.allocate_tensors()# 获取输入和输出张量的信息
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()# 创建一个模拟输入数据(例如 1x28x28 的 MNIST 图像)
input_shape = input_details[0]['shape']
input_data = np.random.rand(*input_shape).astype(np.float32)# 填充输入数据
interpreter.set_tensor(input_details[0]['index'], input_data)# 执行推理
interpreter.invoke()# 获取输出结果
output_data = interpreter.get_tensor(output_details[0]['index'])
print("Predicted output:", output_data)

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

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

相关文章

苏州金龙技术创新赋能旅游新质生产力

2024年10月23日,备受瞩目的“2024第六届旅游出行大会”在云南省丽江市正式开幕。作为客车行业新质生产力标杆客车,苏州金龙在大会期间现场展示了新V系V12商旅版、V11和V8E纯电车型,为旅游出行提供全新升级方案。 其中,全新15座V1…

【vue 全家桶】1、vue 基础(更新中)

目录 Vue 核心Vue 简介模板语法插值语法 {{}}指令语法 v- 数据绑定单向数据绑定 v-bind双向数据绑定 v-model MVVM模型事件处理计算属性与监视class 与 style 绑定条件渲染列表渲染收集表单数据过滤器内置指令与自定义指令Vue 实例生命周期 Vue 组件化编程模块与组件、模块化与…

Python | Leetcode Python题解之第508题出现次数最多的子树元素和

题目: 题解: class Solution:def findFrequentTreeSum(self, root: TreeNode) -> List[int]:cnt Counter()def dfs(node: TreeNode) -> int:if node is None:return 0sum node.val dfs(node.left) dfs(node.right)cnt[sum] 1return sumdfs(r…

Spring使用@Async出现循环依赖原因以及解决方案

场景复现 1、首先项目需要打开spring的异步开关,在application主类上加EnableAsync 2、创建一个包含了Async方法的异步类MessageService: Service public class MessageService {Resource private TaskService taskService; Async public void…

【linux】服务器Ubuntu20.04安装cuda11.8教程

【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录:将头文件复制到 /usr/local/cuda/include/ 目录:将库文件复制到 …

语音语言模型最新综述! 关于GPT-4o背后技术的尝试

近期,大型语言模型(LLMs)在生成文本和执行各种自然语言处理任务方面展现出了卓越的能力,成为了强大的AI驱动语言理解和生成的基础模型。然而,仅依赖于基于文本模态的模型存在显著局限性。这促使了基于语音的生成模型的发展,使其能够更自然、直观地与人类互动。 为了…

在银河麒麟系统中Qt连接达梦数据库

解决在银河麒麟系统中使用Qt连接达梦数据库提示:project Error library odbc is not defined问题 一、编译ODBC 下载解压unixODBC(http://www.unixodbc.org/unixODBC-2.3.1.tar.gz) 打开终端,切换到unixODBC-2.3.1目录下&#x…

Python 异步编程:使用 `asyncio.to_thread` 和 `asyncio.Queue` 处理任务队列

Python 异步编程:使用 asyncio.to_thread 和 asyncio.Queue 处理任务队列 1. 什么是 asyncio.to_thread?2. 什么是 asyncio.Queue?3. 示例代码:使用 asyncio.to_thread 和 asyncio.Queue 处理任务队列示例代码代码解释运行结果 4.…

海螺 2.27.1 |AI生成视频 AI音乐 语音通话

嗨!我是小海螺,你的AI智能伙伴,帮助你学习工作效率加倍!我无所不知,又像朋友陪你左右,遇到问题,就问我吧。我所使用的技术,是MiniMax公司自研的万亿参数MoE大模型。我们希望能与用户…

【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器

【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器 龙芯2K1000处理器集成2个64位GS264处理器核,主频1GHz,以及各种系统IO接口,集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝…

Ubuntu22.04 更换源

Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容,拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…

http 请求返回307

错误的原因 发现发生临时重定向的原因是我在具体的 url 后面少加了一个 / /xxx 这个发生了临时重定向请求/xxx/ 这个请求不会 可能是因为我请求的服务器对最终请求是否添加 / 有特殊的处理,在开发中,最好由对接方实际的url请求值 HTTP 状态码 307 Temporary Redirect 是一种临时…

沈阳乐晟睿浩科技有限公司抖音小店领域的强者

在当今数字化浪潮的推动下,电子商务以其便捷性、高效性和广泛的覆盖面,成为了推动经济发展的新引擎。而抖音小店,作为短视频平台上的新兴电商形态,更是凭借其庞大的用户基础、精准的内容推送机制以及独特的购物体验,迅…

使用query-string库出现错误Module parse failed: Unexpected token

环境 node v12query-string 9.1.0 报错信息 Failed to compile../node_modules/query-string/base.js 350:14 Module parse failed: Unexpected token (350:14) File was processed with these loaders:* ./node_modules/babel-loader/lib/index.js You may need an additio…

【Multisim14.0正弦波>方波>三角波】2022-6-8

缘由有没有人会做啊Multisim14.0-其他-CSDN问答参考方波、三角波、正弦波信号产生 - 豆丁网

echarts给Y轴的不同轴线设置不同的颜色的样式

官方文档 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224, 218, 135, 147, 260],type: line,}] }; 效果: 需要添加参数markLine option {xAxis: {type: category,data: [M…

React四官方文档总结一UI与交互

代码下载 React官网已经都是函数式组件文档,没有类组件文档,但是还是支持类组件这种写法。 UI 描述 组件 组件 是 React 的核心概念之一,它们是构建用户界面(UI)的基础。React 允许你将标签、CSS 和 JavaScript 组…

一个简单的Http根据规则自动路由

在日常项目中,有时候会根据一些规则/标识进行Http路由匹配,下面我实现一个简单的Http根据systemCode自动路由; ControllerServicePropertiesProperties类Yaml 测试路由到baidu Controller import com.example.demo.service.GatewayRoutingS…

Windows安装PM2 注意事项与错误查改

Windows安装 1. 首先应确保 node 和 npm 已经安装: node -v #查看 node 版本 npm -v #查看 npm 版本注意有时候即使npm安装了,但并没有进行配置环境变量,后面会将如何配置。 2. 尝试安装pm2到全局路径 运行以下命令对 PM2 进行全局安装&a…

Mycat2安装配置

安装配置 安装 目前Mycat2下载地址已经不可访问,安装包可从参考资料[1]获取 下载后解压zip文件,将jar放在lib目录下 编辑配置文件 编辑conf文件夹下的prototypeDs.datasource.json 更改数据库相关信息 启动 windows环境下启动Mycat 以管理员身份运行…