当使用tf操作作为输出时,Keras的输出名称不正确。

3

我在设置Keras模型的输出名称时遇到了问题。

这里的使用情况是Tensorflow Serving模型,根据层的名称命名输入和输出。

命名输入很容易。但是,如果输出不是keras.Layer的实例,则似乎无法将它们的名称正确设置为模型中的输出名称。

请参见以下示例:

import tensorflow as tf
import tensorflow.keras as keras

input_0 = tf.keras.Input(shape=(10,), name="my_input_0")
x = keras.layers.Dense(units=1)(input_0)
output_0 = tf.math.log(x, name="my_output_0")
output_1 = tf.math.exp(x, name="my_output_1")

inputs = {
    "my_input_0": input_0
}

outputs = {
    "my_output_0": output_0,
    "my_output_1": output_1
}

model = keras.Model(inputs, outputs)

model.summary()

模型概述中输入层名称正确,但输出层名称不正确,尽管在输出字典键和层名称本身中都指定了名称。

Model: "model_1"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 my_input_0 (InputLayer)        [(None, 10)]         0           []                               
                                                                                                  
 dense_1 (Dense)                (None, 1)            11          ['my_input_0[0][0]']             
                                                                                                  
 tf.math.log_1 (TFOpLambda)     (None, 1)            0           ['dense_1[0][0]']                
                                                                                                  
 tf.math.exp_1 (TFOpLambda)     (None, 1)            0           ['dense_1[0][0]']                
                                                                                                  
==================================================================================================
Total params: 11
Trainable params: 11
Non-trainable params: 0
__________________________________________________________________________________________________

您可以通过将输出包装在keras.Layer()中来解决此问题:

output_0 = keras.layers.Layer(name="my_output_0")(tf.math.log(x))
output_1 = keras.layers.Layer(name="my_output_1")(tf.math.exp(x))

但是这会给模型增加额外的层次;我想运行时成本可以忽略不计,但它看起来很丑,并且会使模型摘要变得混乱。
有更好的方法来实现这种输出命名吗?请记住,核心问题是Tensorflow Serving模型根据输出层名称设置输出名称,这些名称与摘要中显示的名称相同。

1
使用 lambda 层来包装逻辑:tf.keras.layers.Lambda(lambda x: tf.math.log(x), name="my_output_0")(x) - AloneTogether
1个回答

0
一个解决方案是对于每个要重命名的层使用model.layers._name。例如:
model.layers[2]._name="my_output_0"
model.summary()

这应该会输出: {{link1:输入图像描述}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接