Skip to main content
 首页 » 编程设计

python之tensorflow lite 转换改变模型权重

2024年12月31日31落叶无声

我有一个模型保存在 .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   ]]]] 

似乎有些关系。

tensorflow 版本是 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 进行常量折叠等优化,这也会改变权重。

看到不同的权重并不意味着转换是错误的。