keras 在Tensorflow 2.x中保存Frozen EfficientNetB0失败,原因是自定义渐变

1hdlvixo  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(166)

我很好EfficientNetB 0模型(来自TF 2.9.2中的Keras Applications),我希望尽可能优化最终模型,以便通过Tensorflow C++ API进行推断。在tensorflow.python.framework.convert_to_constants.convert_variables_to_constants_v2之后应用tf.saved_model.save对于MobileNet或ResNet 50等几种架构都很好,但对于EfficientNetBX系列则失败了。
作为说明所描述问题的最小代码,以下代码产生了预期的结果:

import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2

input_shape = (224, 224, 3)

model = tf.keras.applications.ResNet50(weights='imagenet', include_top=True, input_shape=input_shape)
#model = tf.keras.applications.EfficientNetB0(weights='imagenet', include_top=True, input_shape=input_shape)

full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(tf.TensorSpec(model.inputs[0].shape,
                                                            model.inputs[0].dtype,
                                                            name='yourInputName'))
frozen_func = convert_variables_to_constants_v2(full_model)

tf.saved_model.save(frozen_func, 'saved_model')

...但在切换到EfficientNetB 0时失败。更准确地说,它会抛出以下错误:
ValueError: Found invalid capture Tensor("efficientnetb0/stem_activation/beta:0", shape=(), dtype=float32) when saving custom gradients.
我想知道我是否错过了EfficientNetB 0所需的任何特定步骤,或者它是否是keras/tensorflow错误。在后一种情况下,是否有我可以应用的变通方法?

n6lpvg4x

n6lpvg4x1#

这是一个在TF 2.10中出现的bug,到TF 2.12为止还没有解决。
值得一提的是,EfficientNetV2没有这个问题(在TF 2.12上测试)。

相关问题