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

解决TensorFlow报错:AttributeError: 'function'对象无'summary'属性

报错原因
  • 你当前定义的model是普通Python函数,不是TensorFlow/Keras的Model类实例,summary()是tf.keras.Model类的专属方法,普通函数没有该属性。你在函数内部调用model.summary()相当于直接调用该函数对象本身的summary属性,自然会触发AttributeError。
解决方法

分两种方案适配不同使用场景:

方案1:改用Keras Functional API重构(适配TF2/TF1兼容模式,可直接调用summary)

将原函数修改为返回Keras Model实例的构造函数,代码修改如下:

import tensorflow as tf
from tensorflow import keras

def build_model():
    # 定义输入层
    inputs = keras.Input(shape=config.IMAGE_SHAPE, batch_size=config.BATCH_SIZE)
    
    with slim.arg_scope(resnet_v2.resnet_arg_scope()):
        net, end_points = resnet_v2.resnet_v2_152(inputs,
                                                  2048,
                                                  is_training=True,
                                                  global_pool=False,
                                                  reuse=tf.AUTO_REUSE,
                                                  output_stride=config.OUTPUT_STRIDE)
    
    kp_maps = tf.contrib.layers.conv2d(net,num_outputs = config.NUM_KP,
                                             kernel_size=(1,1),activation_fn=tf.nn.sigmoid,stride=1,scope='kp_maps',reuse=tf.AUTO_REUSE)
    short_offsets = tf.contrib.layers.conv2d(net,num_outputs = 2*config.NUM_KP,
                                             kernel_size=(1,1),activation_fn=None,stride=1,scope='short_offsets',reuse=tf.AUTO_REUSE)
    mid_offsets = tf.contrib.layers.conv2d(net,num_outputs = 4*config.NUM_EDGES,
                                             kernel_size=(1,1),activation_fn=None,stride=1,scope='mid_offsets',reuse=tf.AUTO_REUSE)
    long_offsets = tf.contrib.layers.conv2d(net,num_outputs = 2*config.NUM_KP,
                                             kernel_size=(1,1),activation_fn=None,stride=1,scope='long_offsets',reuse=tf.AUTO_REUSE)
    seg_mask = tf.contrib.layers.conv2d(net,num_outputs = 1,
                                             kernel_size=(1,1),activation_fn=tf.nn.sigmoid,stride=1,scope='seg_mask',reuse=tf.AUTO_REUSE)
    
    # 构建Keras Model实例,指定输入输出
    model = keras.Model(inputs=inputs, outputs=[kp_maps, short_offsets, mid_offsets, long_offsets, seg_mask])
    return model

# 外部实例化模型后调用summary
model = build_model()
model.summary()

方案2:TF1.x静态图场景不修改原有模型定义,打印可训练参数查看结构

如果不想调整原有函数写法,可以直接构建静态图后打印所有参数信息:

# 先定义输入占位符
inputs = tf.placeholder(tf.float32, shape=(config.BATCH_SIZE, config.IMAGE_SHAPE[0], config.IMAGE_SHAPE[1], 3))
# 调用原model函数得到输出
outputs = model(inputs)
# 遍历打印所有可训练参数的名称和形状
for var in tf.trainable_variables():
    print(var.name, var.shape)
注意事项
  • 不要在模型构造函数内部调用summary(),必须先实例化得到tf.keras.Model实例后再调用该方法。
  • 用slim定义的层默认会被Keras Model自动追踪,无需额外配置。

内容的提问来源于stack exchange,提问作者Ni Az

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:45:02