解决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
相关产品推荐
相关产品推荐

