如何在Tensorflow输入管道中根据训练有素的模型进行预测?

时间:2018-11-06 16:27:10

标签: python tensorflow keras

我正在尝试训练一种用于情感识别的模型,该模型使用VGG图层的输出之一作为输入。

我可以通过第一步运行预测,保存提取的特征,然后将其用作网络的输入来管理我想要的东西,但是我正在寻找一种可以立即完成整个过程的方法。

第二个模型使用要素映射的级联数组作为输入(我正在处理视频数据),因此无法简单地将其连接到VGG的输出。

我尝试以这种方式使用tf.data.dataset API文档中所述的映射操作:

def trimmed_vgg16():
  vgg16 = tf.keras.applications.vgg16.VGG16(input_shape=(224,224,3))
  trimmed = tf.keras.models.Model(inputs=vgg16.get_input_at(0),
                                  outputs=vgg16.layers[-3].get_output_at(0))
  return trimmed

vgg16 = trimmed_vgg16()

def _extract_vgg_features(images, labels):
    pred = vgg16_model.predict(images, batch_size=batch_size, steps=1)
    return pred, labels

dataset = #load the dataset (image, label) as usual
dataset = dataset.map(_extract_vgg_features)

但是我遇到了这个错误:Tensor Tensor("fc1/Relu:0", shape=(?, 4096), dtype=float32) is not an element of this graph,这很明显。我被困在这里,因为我看不到将训练好的模型插入同一张图中并“即时”获得预测的好方法。

是否有一种干净的方法可以做到这一点或类似的方法?

编辑:错过了一行。
Edit2:添加了详细信息

1 个答案:

答案 0 :(得分:0)

您应该能够通过首先创建vgg16并随后检索模型的输出来连接各层,然后再将该张量用作您自己的网络的输入。

vgg16 = tf.keras.applications.vgg16.VGG16(input_shape=(224,224,3))

network_input = vgg16.get_input_at(0)
vgg16_out = vgg16.layers[-3].get_output_at(0) # use this tensor as input to your own network