请参阅文章末尾的可能解决方案
我正在尝试完全量化rcmalli中的keras VGFace模型,以便在NPU上运行。该模型是一个Keras模型(不是tf.Keras)。
使用TF 1.15进行量化时:
print(tf.version.VERSION)
num_calibration_steps=5
converter = tf.lite.TFLiteConverter.from_keras_model_file('path_to_model.h5')
#converter.post_training_quantize = True # This only makes the weight in8 but does not initialize model quantization
def representative_dataset_gen():
for _ in range(num_calibration_steps):
pfad='path_to_image(s)'
img=cv2.imread(pfad)
# Get sample input data as a numpy array in a method of your choosing.
yield [img]
converter.representative_dataset = representative_dataset_gen
tflite_quant_model = converter.convert()
open("quantized_model", "wb").write(tflite_quant_model)
模型已转换,但由于我需要完整的int8量化,我添加:
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8 # or tf.uint8
converter.inference_output_type = tf.int8 # or tf.uint8
出现以下错误消息:
ValueError:无法设置tensor:获取的值类型为UINT8,但输入0的类型应为FLOAT32,名称:input_1
显然,模型的输入仍然需要Float32。
问题:
如果答案是1或2,你能给我一个最佳实践提示吗?
补充:
使用:
h5_path = 'my_model.h5'
model = keras.models.load_model(h5_path)
model.save(os.getcwd() +'/modelTF2')
将h5保存为pb与TF2.2,然后使用转换器=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
作为TF2。x tflite接受浮点数,并在内部将其转换为uint8s。我认为这可能是一个解决办法。很遗憾,出现以下错误消息:
tf.lite.TFLiteConverter.from_keras_model给予'str'对象没有属性'call'
显然是TF2。x无法处理纯keras模型。
使用tf。同胞。v1。清淡的。TFLiteConverter。从_keras_model_file()
要解决此错误,只需重复上面的错误,因为我们又回到了“TF 1.15”级别。
增补2
另一个解决方案是手动将keras模型转移到tf.keras。如果没有其他解决办法,我会调查的。
关于Meghna Natraj的评论
要重新创建模型(使用TF 1.13.x),只需执行以下操作:
pip安装githttps://github.com/rcmalli/keras-vggface.git
和
from keras_vggface.vggface import VGGFace
pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg') # pooling: None, avg or max
pretrained_model.summary()
pretrained_model.save("my_model.h5") #using h5 extension
可能的解决办法
使用TF1.15似乎是可行的。3我用了1.15。0。我会检查我是否意外地做了其他不同的事情。
失败的一个可能原因是模型的输入张量与输出张量没有连接,即它们可能未使用。
这是一个colab笔记本,我在这里复制了这个错误。将笔记本开头的io\u类型修改为
tf。uint8
查看与您遇到的错误类似的错误。
解决方案
您需要手动检查模型,查看是否有任何悬空/丢失/未连接到输出的输入,然后将其删除。
发布到模型的链接,我也可以尝试调试它。
我使用以下代码生成量化的tflite模型 但是根据训练后量化: 生成的模型将完全量化,但为了方便起见,仍然采用浮点输入和输出。 要为Google Coral Edge TPU编译tflite模型,我还需要量化输入和输出。 在模型中,我看到第一个网络层将浮点输入转换为,最后一个网络层将转换为浮点输出。如何编辑tflite模型以除去第一个和最后一个浮动层? 我知道我可以在转换期间将输入和输出类型设置为
可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,以及文件上传信息。 获取PARAM变量 PARAM变量是 TP5推荐的获取请求参数的方式 // 获取当前请求的id变量 $request->param('id'); // 获取当前请求的所有变量(已过
请参考:http://www.kancloud.cn/manual/thinkphp/1721
可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,以及文件上传信息。 获取PARAM变量 PARAM变量是 TP6.0推荐的获取请求参数的方式 // 获取当前请求的id变量 $request->param('id'); // 获取当前请求的所有变量(
可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_ENV等系统变量,以及文件上传信息。 为了方便说明,本篇内容的所有示例代码均使用Facade方式,因此需要首先引入 use think\facade\Request; 如果你使用的是依赖注入,请自行调整代码为动态调用即可
问题内容: 我正在尝试创建一个基本菜单,以检查输入的变量是否与定义的变量匹配。如果定义了变量,则获取已定义变量的数据。 例。 我输入 应该相等 问题答案: 这似乎是您要找的东西: 但是,这可能不是最好的策略,因为错字或恶意用户很容易使您的代码崩溃,系统过载或执行他们喜欢的任何其他讨厌的事情。对于这种特殊情况,更好的方法可能是