keras使用已训练好的模型作为其他模型的一个layer

本文的目的是在tensorflow keras中利用已训练好的模型trained_model作为另一个模型new_model的一个layer,即用trained_model去处理数据。

错误的方法

我在开始是这样做的:自己动手写了一个类继承keras.layers.Layer,在其中调用训练好的模型,用它去处理数据,但是一直报错RuntimeError: Cannot get session inside Tensorflow graph function.,所以查阅资料采用了另一种方法实现,即将训练好的模型作为参数传递,直接把它看作一个layer。
我最开始的代码这样写的:

class EncodingLayer(Layer):
    def __init__(self, train = False):
        super(EncodingLayer, self).__init__(trainable=train)
        
    def call(self, inputs):
        encoder_path = '/vae/'
        # 这里一直报错 RuntimeError: Cannot get session inside Tensorflow graph function
        encoder_model=keras.models.load_model(encoder_path, compile=False) 
        return encoder_model(inputs)[2]
def create_module(l2, inputs):
    z = EncodingLayer()(inputs)
    out = Dense(32, activation="relu", kernel_regularizer=regularizers.l2(l2))(z)
    model = Model(inputs, out)
    return model

inputs = keras.Input(shape=(84, 84, 4))
create_module(1e-3, inputs)

正确的方法

  • 将训练好的模型作为参数传递,直接把它看作一个layer
def create_module(l2, inputs, encoder_model):
    z = encoder_model()(inputs)
    out = Dense(32, activation="relu", kernel_regularizer=regularizers.l2(l2))(z)
    model = Model(inputs, out)
    return model

encoder_path = '/vae/'
encoder_model=keras.models.load_model(encoder_path, compile=False)
encoder_model.trainable = False # 这个模型只作数据处理用,不进行训练

inputs = keras.Input(shape=(84, 84, 4))
create_module(1e-3, inputs, encoder_model)

猜你喜欢

转载自blog.csdn.net/m0_59019651/article/details/124617741