tensorflow2.3+多任务学习MTL保存多个模型方案

esmm模块

以下代码是一个简单的esmm的模型,当我们想保存多个模型的时候,而且线上预测的时候,不想传两个label(label1,label2)进去的时候,处理方式如下

def base_model(inputs,output, variable_scope):
    with tf.compat.v1.variable_scope(variable_scope):
        base_model = tf.keras.Model(
            inputs=inputs,
            outputs=output, name=variable_scope)
    return base_model
# 模型
def gen_model():
    input1 = tf.keras.layers.Input(shape=(2,), dtype=tf.float32, name='ty')
 	
   
    input_layers= Dense(units=16,activation='relu')(input1)
    
    a_preds = tf.keras.layers.Dense(units=1, activation='sigmoid')(input_layers)
    c_preds = tf.keras.layers.Dense(units=1, activation='sigmoid')(input_layers)
    a_model=base_model(inputs=input1 ,output=a_preds , variable_scope='a_model')
     c_model=base_model(inputs=input1 ,output=a_preds , variable_scope='c_model')


    # output layer
    a_preds = tf.keras.layers.Lambda(lambda x: x, name='a')(a_preds)
    b_preds = tf.keras.layers.Multiply(name='b')([a_preds, c_preds])
    b_model=base_model(inputs=input1 ,output=a_preds , variable_scope='b_model')

 	a_label = tf.keras.layers.Input(shape=(1,), dtype=tf.float32, name='a_label')
    b_label = tf.keras.layers.Input(shape=(1,), dtype=tf.float32, name='b_label')
    loss_inputs = [a_label, a_preds, b_label, b_preds]

    def sum_loss(inputs):
        a_true, a_pred, b_true, b_pred = inputs
        a_loss = tf.keras.losses.binary_crossentropy(y_true=a_true, y_pred=a_pred)
        b_loss = tf.keras.losses.binary_crossentropy(y_true=b_true, y_pred=b_pred)
        loss = a_loss + b_loss
        return loss

    # loss layer
    loss_layer = tf.keras.layers.Lambda(lambda x: sum_loss(x), name='loss')(loss_inputs)
    outputs = [a_preds, b_preds, loss_layer]
    loss = [lambda y_true, y_pred: tf.keras.losses.binary_crossentropy(y_true, y_pred),
            lambda y_true, y_pred: tf.keras.losses.binary_crossentropy(y_true, y_pred),
            lambda y_true, y_pred: tf.math.reduce_mean(y_pred)]

    metrics = {'a': tf.keras.metrics.AUC(),
               'b': tf.keras.metrics.AUC()}

    model = tf.keras.Model(inputs=[input1,a_label,b_label],
                           outputs=outputs,
                           name="model")
    initial_learning_rate = 0.15
    lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
        initial_learning_rate,
        decay_steps=100000,
        decay_rate=0.8,
        staircase=True)

    model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=lr_schedule),
                  loss=loss,
                  loss_weights=[0, 0, 1], metrics=metrics)

    return  a_model,b_model,c_model,model

save model

save model的时候直接调用上述模块
直接

a_model.save('a') 
b_model.save('b')
c_model.save('c')

注意,这样保存的模型,当a_model预测的时候不用输入(a_label,b_label),b_model、c_model也同理,但是model进行预测的时候,需要灌