tensorflow2.0 - TensorFlow 量化在转换期间崩溃
问题描述
我正在尝试使用 TensorFlow 2.3.0 量化模型。我在保存最终结果时遇到了一些麻烦,我不清楚确切的问题是什么。这是我的代码
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
import tensorflow as tf
saved_model_dir = "quantization/recognizer/"
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
tflite_model_quant_file = "quantization/recognizer_quant.tflite"
tflite_model_quant_file.write_bytes(tflite_model)
当我运行上面的代码时,它开始吐出无穷无尽的字节流,最终导致我的终端崩溃。我在下面捕获了部分输出:
loc(callsite(callsite(callsite(unknown at "functional_9/lstm_10/PartitionedCall@__inference__wrapped_model_37849") at "StatefulPartitionedCall@__inference_signature_wrapper_51309") at "StatefulPartitionedCall")): error: We cannot duplicate the value since it's not constant.
error: Failed to duplicate values for the stateful op
ExceptionTraceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow/lite/python/convert.py in toco_convert_protos(model_flags_str, toco_flags_str, input_data_str, debug_info_str, enable_mlir_converter)
198 debug_info_str,
--> 199 enable_mlir_converter)
200 return model_str
/usr/local/lib/python3.6/dist-packages/tensorflow/lite/python/wrap_toco.py in wrapped_toco_convert(model_flags_str, toco_flags_str, input_data_str, debug_info_str, enable_mlir_converter)
37 debug_info_str,
---> 38 enable_mlir_converter)
39
Exception: <unknown>:0: error: loc(callsite(callsite(callsite(unknown at "functional_9/lstm_10/PartitionedCall@__inference__wrapped_model_37849") at "StatefulPartitionedCall@__inference_signature_wrapper_51309") at "StatefulPartitionedCall")): We cannot duplicate the value since it's not constant.
<unknown>:0: note: loc("StatefulPartitionedCall"): called from
<unknown>:0: note: loc(callsite(callsite(callsite(unknown at "functional_9/lstm_10/PartitionedCall@__inference__wrapped_model_37849") at "StatefulPartitionedCall@__inference_signature_wrapper_51309") at "StatefulPartitionedCall")): see current operation: %123 = "tfl.unidirectional_sequence_lstm"(%118, %cst_55, %cst_56, %cst_57, %cst_58, %cst_47, %cst_48, %cst_49, %cst_50, %cst_111, %cst_111, %cst_111, %cst_51, %cst_52, %cst_53, %cst_54, %cst_111, %cst_111, %122, %122, %cst_111, %cst_111, %cst_111, %cst_111) {cell_clip = 1.000000e+01 : f32, fused_activation_function = "TANH", proj_clip = 0.000000e+00 : f32, time_major = false} : (tensor<?x?x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, tensor<128x128xf32>, none, none, none, tensor<128xf32>, tensor<128xf32>, tensor<128xf32>, tensor<128xf32>, none, none, tensor<?x128xf32>, tensor<?x128xf32>, none, none, none, none) -> tensor<?x?x128xf32>
<unknown>:0: error: Failed to duplicate values for the stateful op
<unknown>:0: note: see current operation: "func"() ( {
^bb0(%arg0: tensor<?x31x200x1xf32>): // no predecessors
%cst = "std.constant"() {value = dense<"0x24DCBABB3DE4A1BD88A370BDEA32E63DEE6B0ABCDA88983A0DCF663DA68FA2B90BE8013E52E7A3BD37CDFCBC3CDC4FBD480C3E3EA53BB1BB87379A3E62D1A4BC29FA0CBC35494ABBE4EE9FBBF45DDE3DA6FE86BBE4734D3D50DC40BEE242BA3D1E02EFBB72AFF8BD7AA8ED3DFCD65CBDB8C6D1BAA2E480BC89914CBDE92E023E60F8D03D4C0C423EDD5CA53EDE6E9DBD09E075BD0FAE6CBCFCA8863C6916DCBC94D941BCC93EDD3D5767883B8C3FA53DFB53953D3CE828BB70A3ADBD29ED9BBC56E6E8BCEA7839BD71EDA13DD5917D3EEBCAC43D047498BBCF196FBC2EF2473E0C1412BDCF8BCABB608C87BDD8AB993EB3E52E3E5FCC68BCBBD3043DE0D5BD3DD12282BB6B4B543E52333BBD87E2A8BD1DEAA0BDC36B7ABAF1D85DBDADF5B2BB109CA2BB3CC67B3CF53198BBB0BA8D3D73935D3CAE532B3AE236C83E144DBDBB623E383E8692683CC4E59E3E251AEABB65EC8EBD7CBD0DBDB40BA4BC45A8383ED9668EBC4253D0BC727D3EBC10CEAEBBEAB3D0BB6917FA3D77650E3DE5289ABB02AF85BD96AA80BC8FC2DDBCB30484BD6F0ECBBBFF91C43DAC484EBD5DB9093E78F846BD91F06FBBD6B3893EEAF42D3CD62BC0BD84C5873D6A2887BB0F372EBE0AFDC7BBD4F1ABBC03B57A3E66E245BD723BB2BDA2CE223D1CEA
从上面可以看出量化过程中是否真的存在错误?我无法弄清楚为什么它仍在记录模型字节(最后一部分0x24DCBABB3DE4A1BD88A370BD...
最终压倒了终端),尽管我试图禁用 tensorflow 的日志记录选项。
解决方案
尝试保存转换后的模型
open(tflite_model_quant_file).write(tflite_model)
推荐阅读
- h2 - 如何像 sql server 一样在 h2 中使用 getDate()
- rtsp - 从 ffmpeg 到 rtsp 格式的 Mp4 视频
- java - 如何使用带有 Java 的 chrome 选项在 Selenoid 中下载文件
- php - 如何在 4 列中显示查询结果并在 4 列之后移动到另一行?
- java - 在 javax.annotation.processing.Processor 中获取 VariableElement 的封闭类名
- dart - Dart,Flutter:将 .jpg 文件上传到 Google Drive
- laravel - 如何在 Laravel 查询生成器中使用 WITH 子句
- php - 如何根据该数据将数据从 php 发送到 R 脚本以进行某些预测?
- android - 无法显示从存储在 SQLite 数据库中的列表中提取的数据
- android - Android - 是什么决定了我的手机可以投射到哪些设备?