Objetivo
Si desea dividir un modelo, utilice directamente el método tf.keras.Model(inputs=...,outs=...).Solo la entrada establecida por el propio modelo se puede utilizar como entrada del nuevo modelo.
Si desea comenzar a ingresar desde la capa intermedia, encapsular un nuevo modelo requiere operaciones más problemáticas.
Principio de implementación
Configure manualmente una entrada, luego llame funcionalmente a cada capa y finalmente llame a tf.keras.Model(inputs=……, outputs=……) para encapsular el modelo.
ejemplo
Estoy usando tensorflow2.4.
Tomando mobilenetv3 sin módulo SE como ejemplo, necesitamos guardar la salida de cada capa y sus nombres para resolver el problema de que el módulo res tiene dos entradas.
Aquí, comenzamos a escribir después del primer módulo agregado. El código específico es el siguiente:
import tensorflow as tf
# 原模型
mobilenetv3_model = tf.keras.applications.MobileNetV3Large(include_top=False, alpha=1.0, minimalistic=True, input_shape=None, weights=weights)
converter = tf.lite.TFLiteConverter.from_keras_model(mobilenetv3_model)
tflite_model = converter.convert()
open("./org_model.tflite", "wb").write(tflite_model)
# 新模型
test_model = split_model_by_layer_name(mobilenetv3_model, 'expanded_conv_1/expand')
converter = tf.lite.TFLiteConverter.from_keras_model(test_model)
tflite_model = converter.convert()
open("./new_model.tflite", "wb").write(tflite_model)
def split_model_by_layer_name(model, name):
layers = model.layers
layers_output_saver = dict()
input = tf.keras.layers.Input(shape=(224, 224, model.get_layer(name).input.shape[-1]))
output = None
start = False
i = 0
for layer in layers:
if layer.name == name:
start = True
if not start:
continue
layer_input = []
if isinstance(layer.input, list) and len(layer.input)>1: # 对于有多输入的节点
for input_temp in layer.input:
layer_input.append(layers_output_saver.get(input_temp.name))
else:
if i == 0:
layer_input = input
else:
layer_input = output
output = layer(layer_input)
layers_output_saver[layer.output.name] = output
i += 1
new_model = tf.keras.Model(inputs=input, outputs=output)
return new_model
Puede ver que el modelo guardado es el mismo que se esperaba.
en conclusión
El principio de implementación es muy simple: simplemente llame nuevamente a la capa del modelo original de acuerdo con la estructura del modelo. Los diferentes métodos de implementación del modelo serán diferentes y dominar los principios es lo más importante.