Tensorflow和Tensorflow.JS提供不同的预测

问题描述

我已经在Tensorflow中训练了一个模型并将该模型转换为tensorflow.js。我的模型基于mobilenet v2,其中一些最终层被删除并被反卷积层取代。

转换后,即使使用相同的数据,我的模型也预测与Python TF模型不同。

我在转换过程中注意到以下警告:

WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization/FusedBatchnormV3'
WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization_1/FusedBatchnormV3'
WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization_2/FusedBatchnormV3'

完整的转换日志为:

tensorflowjs_converter --input_format tf_saved_model \
                       ../models/keras_saved_model/pose_mobilenet_v2_075/1/ \
                       ../models/tfjs/pose_mobilenet_v2_075/1

2020-08-22 16:23:06.107303: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
2020-08-22 16:23:08.772664: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
2020-08-22 16:23:08.772794: W tensorflow/stream_executor/cuda/cuda_driver.cc:312] Failed call to cuInit: UNKNowN ERROR (303)
2020-08-22 16:23:08.772929: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (c316cecfe6ff): /proc/driver/nvidia/version does not exist
2020-08-22 16:23:08.773528: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (onednN)to use the following cpu instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations,rebuild TensorFlow with the appropriate compiler flags.
2020-08-22 16:23:08.795662: I tensorflow/core/platform/profile_utils/cpu_utils.cc:104] cpu Frequency: 2304000000 Hz
2020-08-22 16:23:08.796681: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x556c9c823e90 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-08-22 16:23:08.796749: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host,Default Version
2020-08-22 16:23:18.570250: I tensorflow/core/grappler/devices.cc:69] Number of eligible GPUs (core count >= 8,compute capability >= 0.0): 0
2020-08-22 16:23:18.571471: I tensorflow/core/grappler/clusters/single_machine.cc:356] Starting new session
2020-08-22 16:23:18.650737: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:816] Optimization results for grappler item: graph_to_optimize
2020-08-22 16:23:18.650819: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   function_optimizer: Graph size after: 1062 nodes (787),1040 edges (765),time = 33.855ms.
2020-08-22 16:23:18.650841: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   function_optimizer: function_optimizer did nothing. time = 0.605ms.
2020-08-22 16:23:20.298407: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:816] Optimization results for grappler item: graph_to_optimize
2020-08-22 16:23:20.298481: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   debug_stripper: debug_stripper did nothing. time = 0.831ms.
2020-08-22 16:23:20.298502: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   model_pruner: Graph size after: 468 nodes (-548),480 edges (-548),time = 5.86ms.
2020-08-22 16:23:20.298519: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 468 nodes (0),480 edges (0),time = 32.234ms.
2020-08-22 16:23:20.298533: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 468 nodes (0),time = 27.212ms.
2020-08-22 16:23:20.298565: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 468 nodes (0),time = 5.536ms.
2020-08-22 16:23:20.298604: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   model_pruner: Graph size after: 468 nodes (0),time = 3.384ms.
2020-08-22 16:23:20.298621: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 468 nodes (0),time = 14.581ms.
2020-08-22 16:23:20.298641: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 468 nodes (0),time = 37.403ms.
2020-08-22 16:23:20.298656: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 468 nodes (0),time = 6.571ms.
2020-08-22 16:23:20.298672: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   debug_stripper: debug_stripper did nothing. time = 0.547ms.
2020-08-22 16:23:20.298713: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   model_pruner: Graph size after: 468 nodes (0),time = 2.079ms.
2020-08-22 16:23:20.298733: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 468 nodes (0),time = 23.091ms.
2020-08-22 16:23:20.298794: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 468 nodes (0),time = 23.129ms.
2020-08-22 16:23:20.298812: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 468 nodes (0),time = 4.498ms.
2020-08-22 16:23:20.298825: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   model_pruner: Graph size after: 468 nodes (0),time = 2.181ms.
2020-08-22 16:23:20.298833: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 468 nodes (0),time = 22.593ms.
2020-08-22 16:23:20.298845: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 468 nodes (0),time = 21.459ms.
2020-08-22 16:23:20.298853: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 468 nodes (0),time = 4.195ms.
WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization/FusedBatchnormV3'
WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization_1/FusedBatchnormV3'
WARNING:tensorflow:Didn't find expected Conv2D or DepthwiseConv2dNative input to 'StatefulPartitionedCall/bremont_mobilenetv2_0.75/batch_normalization_2/FusedBatchnormV3'
2020-08-22 16:23:25.023423: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:816] Optimization results for grappler item: graph_to_optimize
2020-08-22 16:23:25.023493: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   remapper: Graph size after: 488 nodes (-31),299 edges (-28),time = 18.115ms.
2020-08-22 16:23:25.023513: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 260 nodes (-228),272 edges (-27),time = 25.169ms.
2020-08-22 16:23:25.023532: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 260 nodes (0),272 edges (0),time = 6.566ms.
2020-08-22 16:23:25.023552: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 260 nodes (0),time = 2.274ms.
2020-08-22 16:23:25.023591: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   remapper: Graph size after: 260 nodes (0),time = 1.215ms.
2020-08-22 16:23:25.023668: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   constant_folding: Graph size after: 260 nodes (0),time = 6.636ms.
2020-08-22 16:23:25.023740: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   arithmetic_optimizer: Graph size after: 260 nodes (0),time = 6.141ms.
2020-08-22 16:23:25.023838: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:818]   dependency_optimizer: Graph size after: 260 nodes (0),time = 2.42ms.
Writing weight file ../models/tfjs/pose_mobilenet_v2_075/1/model.json...

一个输出示例,它来自Python:

output[0,0]
    
array([ 0.00079024,-0.0020999,0.00075853,-0.00058321,0.00695629,0.00209076,0.00031798,-0.00092323,-0.00198799,-0.0020462,0.00417227],dtype=float32)

并从tensorflow.js获取相同的输入数据:

r.arraySync()[0][0][0]

[
  0.0010096959304064512,-0.0024646464735269547,0.0010527926497161388,0.0008166381157934666,0.005697209388017654,0.0010445881634950638,0.0010996845085173845,-0.0013098083436489105,-0.0022477181628346443,-0.002731590997427702,0.003211272181943059
]

我已将相关的模型创建和转换代码复制到了此仓库https://github.com/markstrefford/tf-to-tfjs

从环顾四周来看,此问题的大多数实例似乎是由于tf.js的早期版本引起的,但是我正在运行Tensorflow(2.3),Tensorflow JS转换器(2.3)和tensorflow.js(2.0 .1)。我也尝试过tf-node.js(2.3版),但仍然遇到相同的问题。

解决方法

好的,因此在与tf.js专家的讨论中,这些输出差异是可以预期的,并且警告似乎并未对我的模型准确性造成任何问题。