本文的目的是在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)