python - 如何在 Keras 的函数式 API 中构建以嵌套模型的一层结尾的子模型

标签 python tensorflow keras

通常,当使用函数式 API 定义模型时,可以构建一个子模型,从任何原始模型层开始和结束。例如,考虑以下代码:

inp = tf.keras.Input((4,))
y = tf.keras.layers.Dense(4, name="od_1")(inp)
y = tf.keras.layers.Dense(2, name="od_2")(y)
y = tf.keras.layers.Dense(4, name="id_1")(y)
y = tf.keras.layers.Dense(10, name="od_3")(y)
y = tf.keras.layers.Dense(10, name="od_4")(y)
final_model = tf.keras.Model(inputs=[inp], outputs=[y])
final_model.summary()

sub_model = tf.keras.Model(inputs=[final_model.input], outputs=[final_model.get_layer("id_1").output])

但是,当模型变多变大时,将模型的某些部分封装成不同的python函数会变得非常方便。然后这些构建另一个模型,可以像层一样在功能 API 中使用。请参阅以下示例:

inp_1 = tf.keras.Input(shape=(2,))
x = tf.keras.layers.Dense(4, name="id_1")(inp_1)
inner_model = tf.keras.Model(inputs=[inp_1], outputs=[x], name="inner_model")

inp_outer = tf.keras.Input((4,))
y = tf.keras.layers.Dense(4, name="od_1")(inp_outer)
y = tf.keras.layers.Dense(2, name="od_2")(y)
y = inner_model(y)
y = tf.keras.layers.Dense(10, name="od_3")(y)
y = tf.keras.layers.Dense(10, name="od_4")(y)
final_model = tf.keras.Model(inputs=[inp_outer], outputs=[y])

这与第一个示例中的模型本质上是相同的模型,只是“id_1”层封装在 inner_model 中。由于额外的输入层,图形会有所不同,但计算是相同的。

现在假设我再次想要访问“id_1”的激活,并从此构建一个子模型如下:

sub_model = tf.keras.Model(inputs=[final_model.input], outputs=[final_model.get_layer("inner_model").get_layer("id_1").output])

这将抛出一个异常,表示嵌套模型和外部模型的层没有连接图:

Traceback (most recent call last):
  File "/home/***/test_submodel_acces.py", line 35, in <module>
    sub_model = tf.keras.Model(inputs=[final_model.input], outputs=[final_model.get_layer("inner_model").get_layer("id_1").output])
  File "/home/***/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 146, in __init__
    super(Model, self).__init__(*args, **kwargs)
  File "/home/***/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py", line 167, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/home/***/venv/lib/python3.6/site-packages/tensorflow_core/python/training/tracking/base.py", line 457, in _method_wrapper
    result = method(self, *args, **kwargs)
  File "/home/***/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py", line 320, in _init_graph_network
    self.inputs, self.outputs)
  File "/home/***/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py", line 1625, in _map_graph_network
    str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_2:0", shape=(None, 2), dtype=float32) at layer "input_2". The following previous layers were accessed without issue: []

所以基本上我想知道如何基于具有嵌套模型的模型构建子模型,它的输出以前是嵌套模型的层。

最佳答案

根据 answers to a similar question ,你应该更换

get_layer("id_1").output

通过

get_layer("id_1").get_output_at(0)

我对 keras 不够流利,无法解释原因,但这行得通,至少在我的用例中......

关于python - 如何在 Keras 的函数式 API 中构建以嵌套模型的一层结尾的子模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59191855/

相关文章:

python - 亚马逊产品广告 API(ItemSearch 和 ItemPage)

tensorflow - 如何在spyder上使用tensorflow?

python - 如何在 Tensorflow 训练之间进行评估

python - 在 Golang 的 Tensorflow 中打开带有嵌入层的 Keras 模型

python - 使用 python/django 安装 lxml 时出现问题

python - 使用python脚本telnet登录

python - 在opencv-python中更改视频源时图像检测不佳

python - 这个特征列是什么,它如何影响训练?

python - Keras 评估给出的结果与历史不同。哪一个是准确的

python - 属性错误 : 'Sequential' object has no attribute 'output_names'