TensorFlow Lite二进制文件大小约为900KB,对我来说仍然很大。我想知道如何只使用支持模型所需的运算符来缩小尺寸?
答案 0 :(得分:1)
如果您使用的是Tensorflow Lite,the only solution I have found将在Interpreter
级别工作并自定义内核库(OpResolver
)。我不认为有这样做的自动方式,the available only example (here the header)并不是那么容易理解恕我直言。我认为下一版本中将包含有关此主题的更多改进。另外,我不确定这会减少最终库的大小。在API说明中,此方法被认为等同于选择性注册,这在Tensorflow Mobile的答案的下一部分中进行了解释。
作为问题的答案"我如何只启用我的模型"使用的操作,答案在Tensorflow Mobile Documentation(在二进制大小子部分)。
Tensorflow Mobile的通常大小似乎是12MB,但可以通过仅包含模型所需的操作来减少它。显然,这需要使用Bazel将Tensorflow Lite构建为框架。
您可以使用ops_to_register.h
工具here创建所需操作的标头(print_selective_registration_header.py
)。生成的标头应放在Tensorflow源目录的根目录中。
您现在已准备好编译库,将SELECTIVE_REGISTRATION
定义传递给编译器(使用Bazel构建,您应该添加选项:--copts=”-DSELECTIVE_REGISTRATION”
)。
我认为这个程序会为库提供最少的操作。其他一些编译器优化标志可能会帮助您确定大小(有时会影响性能)。
我实际上并不知道你是如何编译你的代码(静态库或动态库),这是你在性能方面的需求,以及Tensorflow bazelfile中的默认选项,但你可以试试:< / p>
-O1
或-Os
(有时会对二进制文件大小有所帮助,我认为Tensorflow的默认值为框架-O2
和-O3
单个内核,虽然我不知道Lite版本。-fdata-section
和--gc-sections
:引用gcc
文档:&#34; [-fdata-sections
]与链接器垃圾收集(链接器--gc-sections
一起使用选项)这些选项可能会导致较小的静态链接可执行文件(剥离后)。&#34; (似乎linker options for Raspberry Pi)--gc-sections
-fvisibility-inlines-hidden
应该影响内联函数的性能,但会减小共享对象的导出表的大小。此选项可能打破库。可以阅读一些解释here。-fvisibility=hidden
。看看它here。