gpt4 book ai didi

python - 无法用tf2.0/keras获取中间子模型层的输出

转载 作者:行者123 更新时间:2023-12-04 04:23:26 27 4
gpt4 key购买 nike

假设我们使用 TensorFlow r2.0 并说我们想在 Keras 中使用子模型,所以我们有一个像这样的模型 A:

def create_model_A(in_num_units, name):
x = tf.keras.Input(shape=(in_num_units))
y = tf.keras.layers.Dense(in_num_units, activation='relu')(x)
y = tf.keras.layers.BatchNormalization()(y)
y = tf.keras.layers.Dense(in_num_units, activation='relu')(y)
y = tf.keras.layers.BatchNormalization()(y)
y = x + y
return tf.keras.Model(x, y, name=name)

和使用模型A的模型B:

def create_model_B(in_num_units):
x = tf.keras.Input(shape=(in_num_units))
y = create_model_A(x.shape[-1], name='A_1')(x)
y = tf.keras.layers.Dense(in_num_units // 2, name='downsize_1')(y)
y = tf.keras.layers.BatchNormalization()(y)
y = create_model_A(y.shape[-1], name='A_2')(y)
y = tf.keras.layers.Dense(in_num_units // 2, name='downsize_2')(y)
y = tf.keras.layers.BatchNormalization()(y)
y = create_model_A(y.shape[-1], name='A_3')(y)
y = tf.keras.layers.Dense(in_num_units // 2, name='downsize_3')(y)
y = tf.keras.layers.BatchNormalization()(y)
y = create_model_A(y.shape[-1], name='A_4')(y)
return tf.keras.Model(x, y)

这就像一个魅力。我们可以像这样实例化一个模型B:

num_in_units = 500
model = create_model_B(num_in_units) # Works!

并受益于 tf.keras.Model 的所有优势。但是,当我们想要获得子模型A的中间层的结果时,问题就出现了。如果该层是模型 B 的一部分,则一切正常:

inter_model_1 = tf.keras.Model(
model.input, model.get_layer('downsize_1').output) # Works!

但是如果层是子模型 A,它会崩溃并返回 ValueError。这个命令:

inter_model_2 = tf.keras.Model(
model.input, model.get_layer('A_3').output) # Does not work!

给予:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_4:0", shape=(None, 250), dtype=float32) at layer "input_4". The following previous layers were accessed without issue: [] 

我不确定我是否了解 keras 的所有内部机制。但是,当我深入研究源代码时,我了解到,以这种方式使用的子模型创建了两个输入张量对象。它们可以这样打印:

print([n.input_tensors.name for n in model.get_layer('A_3').inbound_nodes])
['input_4:0', 'batch_normalization_5/Identity:0']

一个是子模型 tf.keras.Input,另一个是链接到顶层模型的输入。

从顶级模型 B 输入张量到顶级模型 B 输出张量构建新模型时,图中的路径似乎正确地通过了'batch_normalization_5' 输入和两个张量在图中正确连接。

但是,当尝试将顶级模型 B 输入张量链接到子模型 A 输出张量时,输出张量似乎连接到子模型模型 tf.keras.Input 并且两个张量都断开连接。

我目前找到的一个解决方案是使用张量的顶层模型版本model.get_layer('A_3').output:

model.get_layer('A_3')._outbound_nodes[0].input_tensors

但这似乎过于复杂且不清晰...此外,它不允许我们使用模型 A 中的层。

我想知道是否有人可以为我提供有关此特定 tf.keras 行为的一些精确信息。我这样做对吗?这是预期的行为吗?这是一个错误吗?非常感谢!

最佳答案

只需将 output 更改为 get_output_at(0)

inter_model_2 = tf.keras.Model(
model.input, model.get_layer('A_3').get_output_at(0))

关于python - 无法用tf2.0/keras获取中间子模型层的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com