keras 如何保存虚拟tensorflow 模型以供使用?

uz75evzq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(164)

我想保存虚拟的tensorflow模型,以便稍后在tensorflow服务中使用。我尝试使用以下代码段准备这样的模型:

import tensorflow as tf

input0 = tf.keras.Input(shape=[2], name="input_0", dtype="int32")
input1 = tf.keras.Input(shape=[2], name="input_1", dtype="int32")
output = tf.keras.layers.Add()([input0, input1])

model = tf.keras.Model(inputs=[input0, input1], outputs=output)

predict_function = tf.function(
    func=model.call,
    input_signature=[input0.type_spec, input1.type_spec],
)

signatures = {
    "predict": predict_function.get_concrete_function(
        [input0.get_shape(), input1.get_shape()],
    ),
}

model.save(
    filepath="some/dummy/path",
    signatures=signatures,
)

运行代码以保存模型,最后出现以下错误:

AssertionError: Could not compute output KerasTensor(type_spec=TensorSpec(shape=(None, 2), dtype=tf.int32, name=None), name='add/add:0', description="created by layer 'add'")

我应该怎么做才能保存带有签名的虚拟模型,以便稍后在tensorflow服务中使用它?

wfauudbj

wfauudbj1#

根据model.call文档,您应该始终使用__call__
打电话给我
不应直接调用此方法。仅当对tf.keras.Model进行子类化时才应重写此方法。若要对输入调用模型,请始终使用__call__()方法,即model(inputs),它依赖于基础call()方法。
然后,我不确定应该如何处理列表中的几个输入,所以我只使用lambda:

func = lambda x, y: model.__call__([x, y]),

当我改变签名使它们匹配时,模型可以被保存。不知道tensorflow 服务。

import tensorflow as tf

input0 = tf.keras.Input(shape=[2], name="input_0", dtype="int32")
input1 = tf.keras.Input(shape=[2], name="input_1", dtype="int32")
output = tf.keras.layers.Add()([input0, input1])

model = tf.keras.Model(inputs=[input0, input1], outputs=output)

predict_function = tf.function(
    func = lambda x, y: model.__call__([x,y]),
    input_signature=[input0.type_spec, input1.type_spec],
)

signatures = {
    "predict": predict_function.get_concrete_function(
        input0.type_spec, input1.type_spec,
    ),
}

model.save(
    filepath="some/dummy/path",
    signatures=signatures,
)

加载后,模型似乎工作正常:

print(model([[5], [6]]))
tf.Tensor(11, shape=(), dtype=int32)

相关问题