python - tensorflow lite 转换更改模型权重
问题描述
我有一个保存在 .pb 文件中的模型,它工作正常,但是当我使用命令 tflite_convert 或 python api 将其转换为 tflite 模型时,结果是错误的。而且我发现转换后权重发生了变化。.pb 文件中第一个卷积层的权重如下:
shape -
(3, 3, 1, 8)
Value -
[[[[-0.09953183 0.11656161 0.1101007 -0.02618909 -0.21355744
-0.05877252 0.11881053 -0.17588891]]
[[-0.16565287 0.16550814 0.02200373 0.0987333 0.0194475
-0.12387082 -0.06090429 -0.19122925]]
[[-0.19570269 0.11854213 -0.14988026 -0.01476914 0.12554781
-0.1324673 -0.04035608 -0.05299769]]]
[[[ 0.08548407 -0.09644134 0.24321978 0.15008359 -0.2591259
0.2421266 0.02051029 -0.05138292]]
[[ 0.04847065 -0.22357103 -0.00074622 0.19842042 0.00228794
0.13352048 -0.24048899 -0.00679056]]
[[-0.01857976 -0.09324262 -0.19632849 0.02247559 0.18489467
-0.07365554 -0.39479995 0.0622104 ]]]
[[[ 0.13633308 0.04041797 0.10581032 -0.13119537 0.01122213
0.15191257 0.03097369 0.07342041]]
[[ 0.16241515 -0.04534301 -0.06334146 -0.19276966 -0.03890191
0.08520683 -0.0117504 0.14705475]]
[[ 0.07332639 -0.00533756 -0.06285968 -0.12631118 0.09094885
-0.09658462 -0.04983746 0.13325559]]]]
.tflite 文件中第一个卷积层的权重如下:
shape -
(1, 3, 3, 8)
Value -
[[[[ -31.412575 42.14294 36.269154 -8.724394
-67.77634 -12.249788 43.18692 -76.762474 ]
[ -52.280594 59.839592 7.248423 32.89111
6.1720166 -25.818043 -22.138346 -83.4574 ]
[ -61.764416 42.858997 -49.373257 -4.9200554
39.844883 -27.609783 -14.669194 -23.129562 ]]
[[ 26.979053 -34.86844 80.12097 49.997475
-82.23831 50.46576 7.4553676 -22.424837 ]
[ 15.297499 -80.832275 -0.24581672 66.09997
0.7261198 27.829294 -87.41631 -2.963576 ]
[ -5.8638325 -33.71194 -64.67414 7.487314
58.679688 -15.351814 -143.50742 27.15023 ]]
[[ 43.02717 14.613146 34.855824 -43.705227
3.561546 31.662704 11.25875 32.04257 ]
[ 51.258755 -16.393799 -20.865818 -64.21752
-12.346229 17.759417 -4.2712016 64.1785 ]
[ 23.14205 -1.929798 -20.70711 -42.07815
28.864273 -20.130857 -18.115618 58.15619 ]]]]
好像有些关系。
张量流版本是 1.12。
命令是
tflite_convert --output_file=graph_net_half.tflite --graph_def_file=graph_net_half.pb --input_arrays=input_image --output_arrays=output_landmark
还有另一个类似的问题没有答案:tflite weights
解决方案
tflite_convert
由于以下几个原因,预计运行时权重会发生变化:
- TensorFlow Conv2D 使用 HWIO 权重(filter_height、filter_weight、input_channels、output_channels)。TensorFlow Lite Conv2D 出于优化原因使用 IHWO 权重。权重轴必须重新排序。
tflite_convert
进行诸如常量折叠之类的优化,这也会改变权重。
看到不同的权重并不意味着转换是错误的。
推荐阅读
- java - 数据流中的动态目标问题
- api - 使用 v2 OAuth 2.0 Linkedin API 点赞帖子/评论
- javascript - JavaScript calc 函数 - 切换到 Bootstrap4 后不再起作用
- angular - Angular 单元测试启动日历
- java - 如何通过批处理脚本下载 JRE 包
- java - 如何在 android 中使用 webView 获取 Auth 令牌?
- javascript - 通过 Javascript/jQuery 在智能手机上以全屏模式打开 MP4 视频
- java - 谷歌地图不显示位置按钮
- ms-access - 根据另一个表和条件删除记录
- javascript - 状态改变而不调用 setState