Tensorflow:如何使用其他Tensorflow模型的输入来获得经过预训练的Keras模型的正确输出

时间:2020-10-20 04:15:36

标签: python tensorflow keras

我有一个Keras预训练模型“ model_keras”,我想在损失函数中使用它。模型“ model_keras”的输入是另一个Tensorflow模型“ model_tf”(生成模型)的输出。我正在尝试通过最大程度地减少损失来更新“ model_tf”的权重。在优化过程中,“ model_kears”仅用于推断,不会被更新。我的问题是,由于此问题,我无法从“ model_keras”获得正确的推断结果,因此我无法正确更新“ model_tf”。代码如下所示:

    loss_func(input, target, model_keras): # the input is an output of another Tensorflow model.
      inference_res = model_keras(input)
      loss = tf.reduce_mean(inference_res-target)
    return loss
    train_phase = tf.placeholder(tf.bool)
    z = tf.placeholder(tf.float32, [None, 128])
    y = tf.placeholder(tf.int32, [None])
    t = tf.placeholder(tf.float32, [None, 10])
    model_tf = Generator("generator") # Building the Tensorflow model "model_tf"
    fake_img = model_tf(z, train_phase, y, NUMS_CLASS) # fake_img is the output of "model_tf" and will be served as the input of "model_keras"
    model_keras = MyKerasModel("Vgg19") # Loading the pretrained Keras model
    G_loss = loss_func(fake_img, t, model_keras)
    G_opt = tf.train.AdamOptimizer(4e-4, beta1=0., beta2=0.9).minimize(G_loss, var_list=model_tf.var_list())
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    sess.run(G_opt, feed_dict={z: Z, train_phase: True, y: Y, t: target}) # Z, Y and target are numpy arrays.


我也尝试使用model.predict(input),但是得到了ValueError:“当将符号张量馈送到模型时,我们期望这些张量具有静态批处理大小”。其背后的原因是model.predict()期望输入为实际数据张量,而不是符号张量。但是,由于我想更新“ model_tf”的权重,因此需要使损失函数可微,并计算梯度。因此,我不能只是将一个numpy数组传递给“ model_keras”。

在这种情况下,如何获得“ model_keras”的正确输出(inference_res)?我正在使用的Tensorflow和Keras版本分别是1.15和2.2.5。

1 个答案:

答案 0 :(得分:0)

如果我理解您的问题,这里有个主意。您可以将输入传递到model_keras,然后将输出命名为keras_y。然后冻结model_keras并将模型添加到model_tf的末尾,这样您将得到一个较大的model,该序列依次为model_tfmodel_keras(第二部分已冻结)。接下来,将输入提供给您的model,并将输出命名为model_y。现在您可以将损失计算为loss_func(keras_y, model_y)