You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在自定义服务签名中使用Keras后端函数报错:Tensor无numpy属性

解决TensorFlow自定义服务签名保存失败问题

问题根源

你遇到的AttributeError: 'Tensor' object has no attribute 'numpy'错误,本质是K.function和tf.function的执行模式冲突:

  • K.function是为Eager模式设计的工具,它会试图将输入的Tensor转换为numpy数组进行计算;
  • 但被tf.function包装的代码运行在图模式下,传入的是图张量而非Eager张量,无法直接调用.numpy(),因此触发错误。

可行解决方案

核心是去掉K.function,改用纯TensorFlow图模式的操作来获取模型层输出,以下是两种可靠实现方式:

方式1:预先构建子模型(推荐)

在tf.function外部提前定义好包含目标层的子模型,避免在图模式中重复创建模型结构:

# 预先从原模型中提取目标子模型
input_layer = model.get_layer('input_f')
probs_layer = model.get_layer('probs')
sub_model = tf.keras.Model(inputs=input_layer.input, outputs=probs_layer.output)

# 定义符合服务签名要求的函数
@tf.function(input_signature=[tf.TensorSpec([None, 27], dtype=tf.float32, name='inputs')])
def predict_output(x):
    proba = sub_model(x)
    return {'scores': proba}

# 保存模型(带自定义签名)
model.save("saved_model", signatures={"serving_default": predict_output})

方式2:直接调用模型层的前向传播

如果子模型构建不方便,可直接在tf.function内部按层的调用顺序计算输出:

@tf.function(input_signature=[tf.TensorSpec([None, 27], dtype=tf.float32, name='inputs')])
def predict_output(x):
    # 按原模型中从input_f到probs的层顺序依次调用
    # 示例:假设中间层为dense1、dense2,需替换为你实际的层名称
    x = model.get_layer('dense1')(x)
    x = model.get_layer('dense2')(x)
    proba = model.get_layer('probs')(x)
    return {'scores': proba}

# 保存模型
model.save("saved_model", signatures={"serving_default": predict_output})

验证要点

  • 确保所有操作都是TensorFlow的图模式兼容操作,避免在tf.function内部使用任何依赖Eager模式的工具(如K.function、.numpy()直接调用);
  • 测试时可先单独调用predict_output传入Tensor(而非numpy数组),确认无错误后再保存模型。

内容的提问来源于stack exchange,提问作者John Dirak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:27:44