我有一个预先训练的Keras模型,该模型接受任意维度的输入并输出单个分类结果。我不需要进一步训练模型,因此我很乐意将其所有可训练变量转换为常量。但是,在进行其他模型的训练时,我确实需要在Tensorflow图内使用该模型。
本质上,我希望预先训练的Keras模型充当输入-输出操作,而不应用任何渐变。我在h5文件中保存了预先保存的Keras模型权重,可以毫无问题地加载它们,然后使用它们来初始化模型中的图层。
我当前正在做的事情如下:
class myKerasModel(Model):
def __init__(self, shape, trainable=True):
self.layers = [
Dense(100, activation='relu', kernel_initializer='random_uniform', bias_initializer='zeros', trainable=trainable)
]
inputs = Input(shape)
Model.__init__(self, inputs=inputs, outputs=outputs)
def apply_model_to_tensor(self, tensor):
model = Sequential()
model.add(InputLayer(input_tensor=tensor))
for layer in self.layers:
model.add(layer)
model.trainable = False
return model
训练模型并将权重保存在weights.h5
中之后,我加载模型权重,然后尝试在Tensorflow会话中将具有加载权重的模型应用于Tensor:
test_input_tensor = ... # Some Tensorflow tensor of a specified shape (a variable)
mod = myKerasModel(shape, trainable=False)
mod.load_weights('weights.h5')
model = mod.apply_model_to_tensor(test_input_tensor)
# Now use model.output
问题是,即使图层是实例变量,因此它们实际上是同一对象,我认为model
的权重与mod
的权重并不相同。我对此感到困惑。另外,即使在Tensorboard中检查了model
,它也被附加到gradient
上,即使我将可训练性设置为False。我认为这可能只是因为Keras创建模型的方式,但是如果我错了,请纠正我。
是否有一种方法可以将model
以正确的权重加载到Tensorflow图中并将其连接到任意输入张量?