在Tensorflow图中使用预训练的Keras模型

时间:2019-05-24 15:23:14

标签: python tensorflow machine-learning keras deep-learning

我有一个预先训练的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图中并将其连接到任意输入张量?

0 个答案:

没有答案