Cómo iniciar la entrada desde la capa intermedia del modelo tf.keras

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.

Supongo que te gusta

Origin blog.csdn.net/qq_19313495/article/details/113885848
Recomendado
Clasificación