有什么方法可以访问tensorflow_hub.KerasLayer对象中的图层吗?

时间:2020-05-25 05:56:28

标签: tensorflow keras tensorflow-hub

我正在尝试使用从Tensorflow Hub到我的对象检测模型的预训练模型。按照官方的说明,我将中心模型包装为KerasLayer对象。然后,我意识到我无法访问此预训练模型中的图层。但是我需要使用某些特定层的输出来构建模型。有什么方法可以访问tensorflow_hub.KerasLayer对象中的图层?

3 个答案:

答案 0 :(得分:0)

要想轻松做到这一点,预训练模型的创建者需要准备好访问该输出。例如。具有额外的功能或额外的签名,可以输出您要使用的激活。

答案 1 :(得分:0)

有一种未公开的方法可以从TF-Slim导出的某些TF2 SavedModel中获取中间层,例如https://tfhub.dev/google/imagenet/inception_v1/feature_vector/4:将return_endpoints=True传递到SavedModel的__call__函数会将输出更改为dict

注意:此界面可能会更改或删除,并且存在已知问题。

model = tfhub.KerasLayer('https://tfhub.dev/google/imagenet/inception_v1/feature_vector/4', trainable=False, arguments=dict(return_endpoints=True))
input = tf.keras.layers.Input((224, 224, 3))
outputs = model(input)
for k, v in sorted(outputs.items()):
  print(k, v.shape)

此示例的输出:

InceptionV1/Conv2d_1a_7x7 (None, 112, 112, 64)
InceptionV1/Conv2d_2b_1x1 (None, 56, 56, 64)
InceptionV1/Conv2d_2c_3x3 (None, 56, 56, 192)
InceptionV1/MaxPool_2a_3x3 (None, 56, 56, 64)
InceptionV1/MaxPool_3a_3x3 (None, 28, 28, 192)
InceptionV1/MaxPool_4a_3x3 (None, 14, 14, 480)
InceptionV1/MaxPool_5a_2x2 (None, 7, 7, 832)
InceptionV1/Mixed_3b (None, 28, 28, 256)
InceptionV1/Mixed_3c (None, 28, 28, 480)
InceptionV1/Mixed_4b (None, 14, 14, 512)
InceptionV1/Mixed_4c (None, 14, 14, 512)
InceptionV1/Mixed_4d (None, 14, 14, 512)
InceptionV1/Mixed_4e (None, 14, 14, 528)
InceptionV1/Mixed_4f (None, 14, 14, 832)
InceptionV1/Mixed_5b (None, 7, 7, 832)
InceptionV1/Mixed_5c (None, 7, 7, 1024)
InceptionV1/global_pool (None, 1, 1, 1024)
default (None, 1024)

需要注意的问题:

  • 未记录,可能会更改或删除,无法持续提供。
  • __call__计算所有输出(并在训练期间应用所有更新操作),而与以后使用的输出无关。

来源:https://github.com/tensorflow/hub/issues/453

答案 2 :(得分:0)

不幸的是,这仍然是不可能的。我已经在 this official forum 上发表了一些关于它的观点。如果有志同道合的人参与 TensorFlow 论坛上的讨论,将会大有帮助。