我在设置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模型根据输出层名称设置输出名称,这些名称与摘要中显示的名称相同。
lambda
层来包装逻辑:tf.keras.layers.Lambda(lambda x: tf.math.log(x), name="my_output_0")(x)
- AloneTogether