通常,当使用函数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])
这将引发一个异常,即Graph未连接到嵌套模型和外部模型的层:
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: []
因此,本质上我想知道如何基于具有嵌套模型的模型来构建子模型,该子模型具有先前是嵌套模型的层的输出。
1条答案
按热度按时间g6ll5ycj1#
根据answers to a similar question,您应该替换
由
我的keras不够流利,无法解释原因,但这是可行的,至少在我的用例中是这样...