Pytorch转tflite

深度学习—权重文件格式.pt转.tflite pytorch、tensorflow框架权重文件格式转换 阅读详情
AI摘要

本文介绍了一种将PyTorch训练的模型转换到移动端TFLite的详细流程。首先,通过手动迁移权重的方式将PyTorch模型转换为Keras模型,接着利用TFLite Converter将Keras模型转换为TFLite格式,实现模型的跨平台部署。

目标是想把在服务器上用pytorch训练好的模型转换为可以在移动端运行的tflite模型。
最直接的思路是想把pytorch模型转换为tensorflow的模型,然后转换为tflite。但是这个转换目前没有发现比较靠谱的方法。

经过调研发现最新的tflite已经支持直接从keras模型的转换,所以可以采用keras作为中间转换的桥梁,这样就能充分利用keras高层API的便利性。

转换的基本思想就是用pytorch中的各层网络的权重取出来后直接赋值给keras网络中的对应layer层的权重。

转换为Keras模型后,再通过tf.contrib.lite.TocoConverter把模型直接转为tflite.

下面是一个例子,假设转换的是一个两层的CNN网络。

import tensorflow as tf
from tensorflow import keras
import numpy as np

import torch
from torchvision import models
import torch.nn as nn
# import torch.nn.functional as F
from torch.autograd import Variable


class PytorchNet(nn.Module):
    def __init__(self):
        super(PytorchNet, self).__init__()
        conv1 = nn.Sequential(
            nn.Conv2d(3, 32, 3, 2),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2))
        conv2 = nn.Sequential(
            nn.Conv2d(32, 64, 3, 1, groups=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2, 2))
        self.feature = nn.Sequential(conv1, conv2)
        self.init_weights()

    def forward(self, x):
        return self.feature(x)

    def init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(
                    m.weight.data, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    m.bias.data.zero_()
            if isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()


def KerasNet(input_shape=(224, 224, 3)):
    image_input = keras.layers.Input(shape=input_shape)
    # conv1
    network = keras.layers.Conv2D(
        32, (3, 3), strides=(2, 2), padding="valid")(image_input)
    network = keras.layers.BatchNormalization(
        trainable=False, fused=False)(network)
    network = keras.layers.Activation("relu")(network)
    network = keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(network)

    # conv2
    network = keras.layers.Conv2D(
        64, (3, 3), strides=(1, 1), padding="valid")(network)
    network = keras.layers.BatchNormalization(
        trainable=False, fused=True)(network)
    network = keras.layers.Activation("relu")(network)
    network = keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(network)

    model = keras.Model(inputs=image_input, outputs=network)

    return model


class PytorchToKeras(object):
    def __init__(self, pModel, kModel):
        super(PytorchToKeras, self)
        self.__source_layers = []
        self.__target_layers = []
        self.pModel = pModel
        self.kModel = kModel
        tf.keras.backend.set_learning_phase(0)

    def __retrieve_k_layers(self):
        for i, layer in enumerate(self.kModel.layers):
            if len(layer.weights) > 0:
                self.__target_layers.append(i)

    def __retrieve_p_layers(self, input_size):

        input = torch.randn(input_size)
        input = Variable(input.unsqueeze(0))
        hooks = []

        def add_hooks(module):

            def hook(module, input, output):
                if hasattr(module, "weight"):
                    # print(module)
                    self.__source_layers.append(module)

            if not isinstance(module, nn.ModuleList) and not isinstance(module, nn.Sequential) and module != self.pModel:
                hooks.append(module.register_forward_hook(hook))

        self.pModel.apply(add_hooks)

        self.pModel(input)
        for hook in hooks:
            hook.remove()

    def convert(self, input_size):
        self.__retrieve_k_layers()
        self.__retrieve_p_layers(input_size)

        for i, (source_layer, target_layer) in enumerate(zip(self.__source_layers, self.__target_layers)):
            print(source_layer)
            weight_size = len(source_layer.weight.data.size())
            transpose_dims = []
            for i in range(weight_size):
                transpose_dims.append(weight_size - i - 1)
            if isinstance(source_layer, nn.Conv2d):
                transpose_dims = [2,3,1,0]
                self.kModel.layers[target_layer].set_weights([source_layer.weight.data.numpy(
                ).transpose(transpose_dims), source_layer.bias.data.numpy()])
            elif isinstance(source_layer, nn.BatchNorm2d):
                self.kModel.layers[target_layer].set_weights([source_layer.weight.data.numpy(), source_layer.bias.data.numpy(),
                                                              source_layer.running_mean.data.numpy(), source_layer.running_var.data.numpy()])

    def save_model(self, output_file):
        self.kModel.save(output_file)

    def save_weights(self, output_file):
        self.kModel.save_weights(output_file, save_format='h5')


pytorch_model = PytorchNet()
keras_model = KerasNet(input_shape=(224, 224, 3))

torch.save(pytorch_model, 'test.pth')

#Load the pretrained model
pytorch_model = torch.load('test.pth')

# #Time to transfer weights
converter = PytorchToKeras(pytorch_model, keras_model)
converter.convert((3, 224, 224))

# #Save the converted keras model for later use
# converter.save_weights("keras.h5")
converter.save_model("keras_model.h5")


# convert keras model to tflite model
converter = tf.contrib.lite.TocoConverter.from_keras_model_file(
    "keras_model.h5")
tflite_model = converter.convert()
open("convert_model.tflite", "wb").write(tflite_model)

Reference:
https://www.jiqizhixin.com/articles/2018-07-18-7

告别.pth到.tflite的弯路:用nncase 1.9一步搞定PyTorch模型转K210可用的kmodel 本文详细介绍了如何使用nncase 1.9将PyTorch模型直接转换为K210可用的kmodel,避免了传统.pth→.onnx→.tflite→.kmodel转换路径的繁琐和兼容性问题。通过环境准备、模型转换技巧和优化策略,帮助开发者高效部署AI模型到K210芯片,提升边缘计算应用的开发效率。 阅读详情

相关推荐

yolov5模型转换的坑(pt > ONNX > CoreML > tflite)

背景:最近在做目标检测,其中用到的yolov5模型,框架是pytorch,由于想要把模型部署到移动端,因此需要模型格式的转换,思路如题目:pt > ONNX > CoreML > tflite 官方GitHub链接ultralytics的yolov5. 转换时遇到了问题,将原始模型文件.pt转化为onnx和torchscript都成功了 但转化为coreml时失败了,由于各种原因,这是最不能失败的一个,我需要它,失败原因如下 官方的issue里有这个问题,可是并无luan用,经过多方搜

weixin_42815846的博客 9910

torch模型转换为tflite模型

torch模型转tflite模型

qq_41919659的博客 845

YOLOv5 PyTorch模型转TFLite格式

确保自己采用,因为v6.0及以上版本才有export.py,模型转换脚本。后面会补充v5.0以及以下版本训练的模型转换方法。

crasher123的博客 2009

推荐项目:PyTorch模型轻松转换为TFLite,加速部署之旅

推荐项目:PyTorch模型轻松转换为TFLite,加速部署之旅 项目地址:https://gitcode.com/gh_mirrors/py/PyTorch-ONNX-TFLite 在深度学习的世界里,模型的快速高效部署成为开发者关注的焦点。今天,我们要介绍一个宝藏开源项目——TFLite Conversion,它简化了从PyTorch到TFLite的转换过程,让你的模型部署之路更加顺畅。 1、...

gitblog_00100的博客 1338

Pytorch-Lite:易于使用的小型框架,可更快地进行模型开发和可视化

烟火精 易于使用的小型框架,可更快地进行模型开发和可视化 用法 克隆仓库 创建conda环境(conda env创建-f env_specs.yml) 选择或定义模型( models/your_model.py ) 选择或定义一个dataset_loader 修改constants.py 运行模型 运行tensorboard(tensorboard --logdir = runs)以查看结果 未来作品 重构和改善主干功能 添加示例(MixNet,EfficientNet,gans等)并改进文档 添加多个模型和图层 添加更多图像增强技术 添加或促进更复杂的图像可视化方法(matplotlib ...构面) 添加python“ artisan”以便于使用

腾讯开源CubeSandbox:为Agent打造可随时丢弃的安全沙箱环境

在人工智能与自动化技术快速发展的今天,智能体(Agent)在执行复杂任务时往往需要独立、完整的计算环境,但环境失控带来的安全风险一直是落地瓶颈。为解决这一痛点,可丢弃式沙箱技术应运而生。它通过轻量虚拟化原理实现环境秒级重建,并严格隔离宿主资源,即使Agent执行了恶意或误操作,也不会波及其他系统。这种技术价值在于平衡了灵活性与安全性,使开发者敢于赋予Agent更多自主操作权限。目前,这类技术已广泛应用于AI编程、自动化测试、数字员工、恶意代码分析等真实场景,成为Agent可靠运行的基石。腾讯开源的CubeS

weixin_42539414的博客 253

Pytorch转tensorflow、tflite,ONNX转为tensorflow、tflite模型

Pytorch模型转tensorflow-keras或者tlite模型,或者ONNX转tensorflow-keras或者tlite模型。

u013666632的博客 6159

Simulink单相桥式有源逆变电路仿真:从器件选型到波形分析(MATLAB 2018a实战)

本文基于MATLAB 2018a的Simulink平台,详细演示了单相桥式有源逆变电路的完整仿真流程。从Simscape/Power Systems库的器件选型、参数配置,到触发脉冲设置与电路连接,逐步指导搭建仿真模型。通过调整触发角α,直观展示了电路从整流到有源逆变的工作状态切换,并深入分析了负载电压、电流波形,以及逆变颠覆现象的产生条件与特征。

cake8的博客 1159

pytorch模型转tflite【以EfficientNet-BTS为例】

步骤 使用pytorch转tflite需要经过:pytorch -> onnx -> tensorflow -> tflite 配置环境 # ONNX-TensorFlow: 1.8.0 [pip install onnx-tf==1.8.0] # ONNX: 1.8.0 [pip install onnx==1.8.0] ## TensorFlow: 2.4.0 [pip install tensorflow==2.4.0] #

qq_40600539的博客 3329

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

Ubuntu登录界面黑屏?手把手教你排查和修复LightDM启动失败(附debug命令详解)

本文详细介绍了Ubuntu系统中LightDM(Light Display Manager)启动失败导致登录界面黑屏的排查与修复方法。通过系统状态检查、调试模式分析、常见故障解决方案及高级调试技巧,帮助用户快速定位并解决LightDM相关问题,恢复正常的图形登录环境。

weixin_34005090的博客 314

pytorch的pixel_shuffle转tflite文件

因为,有人发现在单通道的时候是depth_to_space和pixel_shuffle结果是一样的,所以拆分出来计算好在合并就行,这样速度基本上没有增加多少,亲测速度也是很快的,比从头开始实现pixel_shuffle是快非常多的。如果使用这样的从头开始实现,转出来的tflite是没法运行在手机上面的,因为tf.transpose的维度太多了,tflite在手机上不支持6个维度的transpose的,因为超过5个维度就会产生flex层,flex层是不被支持的。新建pytorch模型。

大鱼的博客 1796

TMP112/TMP102温度传感器驱动开发与嵌入式实战

数字温度传感器是嵌入式系统环境感知的核心器件,其通过I²C等标准总线实现高精度、低功耗测温。原理上依赖ΔΣ模数转换与二进制补码数据格式,结合寄存器配置实现模式控制、阈值报警与功耗管理。技术价值体现在±0.5°C级精度、1μA级静态电流及SOT-563超小封装带来的系统集成优势。广泛应用于工业MCU热监控、电池物联网终端、医疗电子温度补偿及汽车ECU板级测温等场景。本文围绕TMP112/TMP102展开,深入解析寄存器协议、硬件接口约束、HAL驱动分层设计、FreeRTOS任务调度及生产级校准方法,覆盖从芯片

weixin_35756690的博客 674

PyTorch转TFLite动态形状处理技巧

在将PyTorch模型转换为TensorFlow Lite(TFLite)时,动态形状处理是一个关键挑战。本文提出了一套系统化的解决方案,通过PyTorch→ONNX→TensorFlow→TFLite的转换流程,结合动态轴指定、代表性数据集采样和运行时张量调整等技术,实现了对可变批量大小和序列长度的支持。

独坐一隅,凝神遐想,是种幸福! —— 独隅 502

STM32F4驱动ADS1220高精度ADC:从SPI配置到数据校准的完整实战指南

本文详细介绍了如何使用STM32F4微控制器驱动ADS1220高精度ADC,涵盖从SPI接口配置、寄存器设置到数据采集与校准的全过程。通过实战代码示例和硬件设计要点,帮助开发者快速构建高精度数据采集系统,适用于工业测量和精密仪器等应用场景。

weixin_26918763的博客 224

手把手教你学simulink(90.1)--直流电动机实例:基于Simulink的基本模型的直流电动机(DC Motor)建模

直流电动机(DC Motor)因其结构简单、控制方便和良好的调速性能,广泛应用于各种工业自动化、机器人技术、家用电器以及航空航天等领域。为了更好地理解和应用直流电动机的工作原理及其控制系统,本项目旨在通过Simulink对直流电动机进行基本模型的建模与仿真。

MHD0815的博客 439

pytorch模型转tflite

pytorch模型转tflite 参考文档: 1.https://blog.youkuaiyun.com/computerme/article/details/84144930 2.https://blog.youkuaiyun.com/qq_40600539/article/details/123142541 配置环境: # tensorflow 2.4.0 # onnx 1.8.0 # onnx-tensorflow 1.8.0 [onnx-tf] # tf-nightly

weixin_52456426的博客 3122

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-DIO之高低电平输出-点亮LED灯(基于MCAL)

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-点亮LED灯(基于MCAL)

「汽车电子助手」的博客 1937

模型转换:pytorch模型转onnx, onnx转tensorflow, tensorflow转tflite

pass

Hello Word! 4391

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

PyTorch转TFLite动态形状量化指南

本文介绍了PyTorch模型转换为TFLite格式并进行动态形状量化的完整流程。主要内容包括:1)转换路径(PyTorch→ONNX→TensorFlow→TFLite);2)representative_dataset在INT8量化校准中的核心作用,特别是覆盖不同batch size和输入分辨率;3)提供了单输入、多输入以及使用真实数据的representative_dataset实现示例;4)完整的转换代码示例,从PyTorch导出ONNX模型到最终生成支持动态形状的量化TFLite模型。

独坐一隅,凝神遐想,是种幸福! —— 独隅 623

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

YOLO模型pt格式转换tflite格式

❌onnx2tf依赖,但该模块在 PyPI 上,导致 TFLite 导出失败。

weixin_43741408的博客 184

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

yolo标注(labelme)、训练、模型转换(pt转tflite)

个人情况 训练集 / 验证集 / 测试集 刚入门,不确定 70% / 15% / 15% 数据很少(<500张) 80% / 20%(不设测试集) 数据充足(>5000张) 80% / 10% / 10% 研究/比赛需要严格评估 60% / 20% / 20% 验证集:训练过程中反复使用,用于调整超参数、选择最佳模型 测试集:仅在模型完全确定后使用一次,用于评估最终性能 文件内容 数据标注看二、标注数据yolo训练 进入 下,即有路径下,运行下面的命令 4.训练结果训练

2301_79114816的博客 293

Oumi模型转换:TFLite格式全流程导出指南

你是否在将Oumi训练的大模型部署到移动端时遇到过这些问题?模型体积过大导致安装包臃肿、推理速度慢影响用户体验、设备内存不足频繁崩溃?TFLite(TensorFlow Lite)作为轻量级推理框架,专为移动设备和嵌入式系统优化,能有效解决这些问题。本文将系统讲解如何将Oumi训练的模型转换为TFLite格式,实现模型体积减少70%+、推理速度提升3-5倍的移动端部署效果。 读完本文你将掌握: ...

gitblog_01008的博客 1084

TTS_TFLite:文本转语音模型的轻量化解决方案

TTS_TFLite:文本转语音模型的轻量化解决方案 项目介绍 TTS_TFLite 是一个开源项目,它提供了多个流行的文本转语音(Text-to-Speech, TTS)模型,这些模型基于 TensorFlow Lite (TFLite) 实现。项目汇集了来自两个知名仓库——Mozilla 的 TTS 和 TensorSpeech 的 TensorFlowTTS——的模型,并提供了完整的端到端 ...

gitblog_00166的博客 1167

Llama-Factory是否支持移动端导出?ONNX转TFLite链路打通

本文探讨Llama-Factory是否支持移动端模型导出,重点分析PyTorch→ONNX→TFLite转换链路的技术可行性。尽管平台未内置一键导出功能,但通过合并LoRA权重、ONNX导出及onnx-tf转换等步骤,已可实现大模型向移动端部署的闭环,为本地化AI应用提供落地路径。

weixin_42124497的博客 593

将PyTorch模型转换成TFLite格式教程

模型转换

v15220的博客 1136
上一篇: 在tensorfow lite中对各op进行单元测试
下一篇: opencv+libjpeg-turbo交叉编译
IT修道者
IT修道者 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄17年 326粉丝 95原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值