究极转换:pth转换kmodel

这篇博客记录了从PyTorch的.pth模型转换为ONNX,再通过ONNX转换成TensorFlow的.pb模型,然后进一步转为TFLite的.tflite模型,最后成功转化为KModel的全过程。博主遇到了一些挑战,特别是在维度转换上,但最终通过代码实现了完整的转换流程。此外,还提到了NNCase工具箱在tflite到kmodel转换中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

究极折磨王

提示:这个是自己的笔记,后悔当时为了偷懒,而先学习pytorch后学tensorflow了



前言

提示:这篇文章引用了大家的思路进行设计,找了网上好多篇文章最后的总结。


提示:以下是本篇文章正文内容,下面案例可供参考

一、pth文件转换onnx

这步没啥可说的,直接上传代码:

import torch
import torch.onnx
from tinynet import tinynet
from conf import settings
import os

def pth_to_onnx(input, checkpoint, onnx_path, input_names=['input'], output_names=['output'], device='cpu'):
    if not onnx_path.endswith('.onnx'):
        print('Warning! The onnx model name is not correct,\
              please give a name that ends with \'.onnx\'!')
        return 0

    model = tinynet()
    model.load_state_dict(torch.load(checkpoint))
    model.eval()
    # model.to(device)
    
    torch.onnx.export(model, input, onnx_path, verbose=True, input_names=input_names, output_names=output_names)
    print("Exporting .pth model to onnx model has been successful!")

if __name__ == '__main__':
    os.environ['CUDA_VISIBLE_DEVICES']='2'
    checkpoint = './xiaoan.pth'
    onnx_path = './xiaoan.onnx'
    input = torch.randn(-1, 3, 32, 32)  #这里用的是自己的模型,数据需要根据自己的模型进行更改。
    # device = torch.device("cuda:2" if torch.cuda.is_available() else 'cpu')
    pth_to_onnx(input, checkpoint, onnx_path)


二、onnx转换pb

这步可是老折磨王了,废话不多说,直接上代码:
这步一定一定要注意维度的转换。

pip install -e.
pip install tensorflow-addons


onnx-tf convert -i /xiaoan.onnx -o /xiaoan.pb

代码转换
import onnx
from onnx_tf.backend import prepare
import os

def onnx2pb(onnx_input_path, pb_output_path):
    onnx_model = onnx.load(onnx_input_path)  # load onnx model
    tf_exp = prepare(onnx_model)  # prepare tf representation
    tf_exp.export_graph(pb_output_path)  # export the model


if __name__ == "__main__":
    os.makedirs("tensorflow", exist_ok=True)
    onnx_input_path = './onnx/xiaoan.onnx'
    pb_output_path = './onnx/xiaoan.pb'

    onnx2pb(onnx_input_path, pb_output_path)

pb转换tflite

这步就可以了,毕竟tensorflow内部的程序,就比较好转换。

import tensorflow as tf
 
in_path=r'D:\zhuanhuan\xiaoan.pb'
out_path=r'D:\zhuanhuan\xiaoan.tflite'
 
input_tensor_name=['train']
input_tensor_shape={'xiaoan':[-1,32,32,3]}
 
class_tensor_name=['heisibing','heixingbing','xiubing','jiankang']
 
 
convertr=tf.lite.TFLiteConverter.from_frozen_graph(in_path,input_arrays=input_tensor_name
                                                   ,output_arrays=class_tensor_name
                                                   ,input_shapes=input_tensor_shape)
 
# convertr=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=in_path,input_arrays=[input_tensor_name],output_arrays=[class_tensor_name])
tflite_model=convertr.convert()
 
 
with open(out_path,'wb') as f:
    f.write(tflite_model)

tflite转换kmodel

下载工具NNCase工具箱
创建一个文件夹,将下载好的ncc.exe,.tflite文件,训练模型时的图片(5张即可)放入文件夹内
然后直接跑代码:

ncc compile xiaoan.tflite xiaoan.kmodel -i tflite -o kmodel --dataset 'D/zhuanhuan/train'
将PT模型转换为Keras模型并导出为KModel模型需要进行以下步骤: 1. 安装Keras和tensorflow2 2. 加载PT模型并将其转换为Keras模型 3. 保存Keras模型并将其导出为KModel模型 下面是一个示例代码: ```python # 安装Keras和tensorflow2 !pip install keras==2.4.3 tensorflow==2.4.1 import torch from transformers import GPT2Tokenizer, TFGPT2LMHeadModel import tensorflow as tf from tensorflow import keras # 加载PT模型并将其转换为Keras模型 tokenizer = GPT2Tokenizer.from_pretrained('distilgpt2') model_pt = TFGPT2LMHeadModel.from_pretrained('distilgpt2', pad_token_id=tokenizer.eos_token_id) model_pt.eval() input_shape = model_pt.input_shape[1:] inputs = keras.layers.Input(shape=input_shape, batch_size=1, dtype='int32', name='inputs') outputs = model_pt(inputs)[0] model_keras = keras.models.Model(inputs, outputs) # 保存Keras模型并将其导出为KModel模型 model_keras.save('keras_model.h5') converter = tf.lite.TFLiteConverter.from_keras_model(model_keras) tflite_model = converter.convert() open("kmodel_model.tflite", "wb").write(tflite_model) ``` 在上面的代码中,我们首先加载了PT模型并将其转换为Keras模型。我们使用TFGPT2LMHeadModel类从Hugging Face Transformers库中加载预训练的GPT2模型。然后,我们定义了一个新的Keras模型,该模型具有与PT模型相同的输入和输出。我们使用Keras的Model类将输入和输出组合在一起。接下来,我们将Keras模型保存为HDF5文件,然后使用TensorFlow Lite转换器将其转换KModel模型。 请注意,这只是一个示例代码,你需要根据你的模型和需求进行相应的修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值