我刚刚开始使用 Keras/Tensorflow,我正在尝试重新训练和量化为 int8 MobileNetV2,但我收到此错误:
ValueError: Quantizing a tf.keras Model inside another tf.keras Model is not supported.
我遵循这个指南来绕过量化步骤,但我不太确定我到底在做什么不同。
IMG_SHAPE = (224, 224, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
base_model.trainable = False
model = tf.keras.Sequential([
base_model,
tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(units=2, activation='softmax')
])
quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model)
堆栈跟踪:
ValueError Traceback (most recent call last)
<ipython-input-34-b724ad4872a5> in <module>()
9
10 quantize_model = tfmot.quantization.keras.quantize_model
---> 11 q_aware_model = quantize_model(model)
4 frames
/usr/local/lib/python3.7/dist-packages/tensorflow_model_optimization/python/core/quantization/keras/quantize.py in _add_quant_wrapper(layer)
217 if isinstance(layer, tf.keras.Model):
218 raise ValueError(
--> 219 'Quantizing a tf.keras Model inside another tf.keras Model is not supported.'
220 )
221
在这种情况下,您的
base_model
的行为就好像它是一个图层。为了扩展它,您需要使用Functional API,而不是Sequential API:
IMG_SHAPE = (224, 224, 3)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
base_model.trainable = False
x = tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu')(base_model.output)
x = tf.keras.layers.Dropout(0.5)(x)
x = tf.keras.layers.MaxPool2D(pool_size=(2, 2))(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(units=2, activation='softmax')(x)
model = tf.keras.Model(base_model.input, x)
model.summary()
请注意,模型摘要显示了所有层,包括
base_model's
。然后您就可以申请:
quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model)
我正在使用一个存储库https://github.com/wangermeng2021/EfficientDet-tensorflow2其中模型是由
创建的model = get_model(args,training=True)
get_model 代表以下内容。
def get_model(args, training=True):
model_args = efficientdet_config.get_struct_args(args)
if training:
cur_num_classes = model_args.num_classes
model_args.num_classes = 90
model_pretrain = EfficientDetNet(model_args)
model_inputs_pretrain = tf.keras.layers.Input(shape=(model_args.image_size, model_args.image_size, 3))
model_outputs_pretrain = model_pretrain(model_inputs_pretrain,training=True)
model_pretrain = tf.keras.Model(inputs=model_inputs_pretrain, outputs=model_outputs_pretrain)
model_args.num_classes = cur_num_classes
if args.use_pretrain:
try:
model_pretrained_weights = "./pretrain/efficientdet-{}/model".format(args.model_type)
model_pretrain.load_weights(model_pretrained_weights).expect_partial()
except:
raise ValueError('weight file {} is invalid!'.format(model_pretrained_weights))
model = EfficientDetNet(model_args)
model_inputs = tf.keras.layers.Input(shape=(model_args.image_size, model_args.image_size, 3))
model_outputs = model(model_inputs)
num_level = model_args.max_level-model_args.min_level+1
level_cls_outputs = [tf.keras.layers.Lambda(lambda x: x, name='level_{}_cls'.format(level))(model_outputs[0][level]) for level in range(num_level)]
level_box_outputs = [tf.keras.layers.Lambda(lambda x: x, name='level_{}_box'.format(level))(model_outputs[1][level]) for level in range(num_level)]
model = tf.keras.Model(inputs=model_inputs, outputs=(level_cls_outputs,level_box_outputs))
for layer in model_pretrain.layers[-1].layers:
if layer.name!='class_net':
model.layers[-11].get_layer(layer.name).set_weights(model_pretrain.layers[-1].get_layer(layer.name).get_weights())
return model
在这种情况下我也会遇到同样的错误。我需要在这里更改什么?