【问题标题】:Trying to get tflite weights as a c variable试图将 tflite 权重作为 c 变量
【发布时间】:2021-11-15 18:14:48
【问题描述】:

我正在将 stm32 用于 AI,使用 X Cube AI 库,并且我正在尝试通过 UART 将给定​​模型的网络权重发送到我的微控制器。 为此,我需要使用一个 python 脚本,它可以将我的 tflite 模型的权重作为 c 变量,就像它在 stm32 上一样: How the model is stored on the stm32

我尝试过转换工具,例如xxd -i 命令或convert_bytes_to_c_source 函数,但它总是转换整个 tflite 文件,而我只需要权重。

【问题讨论】:

  • 请不要将代码 sn-ps 作为屏幕截图放在这里(而是选择相关部分并将它们作为格式化的内联代码嵌入到您的问题中,以便可以搜索和引用其中的部分内容)。跨度>

标签: python c tensorflow stm32 tensorflow-lite


【解决方案1】:

简单

  1. 编写一个从 UART 读取此数据的函数。
  2. 叫它
ai_handle ai_network...get(void)
{
    static ai_u8 s_network_weights[6720];
    uart_read_data(s_network_weights, sizeof(s_network_weights));

    /*...*/
}

【讨论】:

  • 感谢您的 awnser,但我正在寻求一种在 pyhton 上以 c 文件形式获取 tflite 重量的方法。我想我的问题用错了对不起。
  • @littleLad 您无法通过 UART 将.c 文件发送到 uC 并使用它。 C 是已编译 语言,您需要先使用其他(普通-大型计算机)编译和链接源代码,然后对闪存进行编程。如果不学习 C,您将与 uCs 斗争。 Python 远远不够。
【解决方案2】:

我找到了解决问题的方法。 X cube AI 库只是使用 IEEE 754 标准将模型的权重从有符号浮点数转换为十六进制数。 我们可以通过使用这个网站来做到这一点:https://gregstoll.com/~gregstoll/floattohex/(他们甚至有一个 python 代码)

我们可以看到第一个权重和网络数据的值之间的比较: 这是模型的前两个权重,以浮点数和十六进制表示(使用网站方法转换):

The first two weights of the model in float and hex

The weights as they are stored on the STM32

如果我们将其与存储在 STM32 上的权重值进行比较,它们确实与值的前 8 个字节的值相同。

【讨论】:

  • 它与UART传输到uC有什么关系?
  • 这是因为我需要将权重作为变量获取,以便通过 uart 发送它们。
  • 你想如何在正在运行的uC程序上使用这个C代码?
  • 我想通过uart发送喜欢的文件,不可以吗?
  • 您要发送文本 .c 文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多