CNN模型训练报错TypeError: 'str' object is not callable求助
解决胸部X光肺结核检测CNN训练时的TypeError问题
错误原因分析
报错TypeError: 'str' object is not callable的核心是代码中尝试调用一个字符串对象。结合你的模型结构,最可能的问题是resize_and_rescale不是可调用的Keras层/预处理函数,而是一个字符串变量——Sequential模型的列表元素必须是可调用的层对象,当它是字符串时,训练时会尝试调用这个字符串,从而触发错误。
解决方案
1. 正确定义resize_and_rescale为可调用预处理组件
你需要将resize_and_rescale替换为实际的Keras预处理层或包装后的函数,以下是两种常见实现方式:
方式一:使用内置层组合
如果你的需求是调整图像尺寸并归一化,可以直接用TensorFlow内置的Resizing和Rescaling层组合:
import tensorflow as tf from tensorflow.keras import layers, models # 注意:input_shape不需要包含batch维度,仅需指定图像的(height, width, channels) input_shape = (256, 256, 3) # 正确定义可调用的预处理层 resize_and_rescale = tf.keras.Sequential([ layers.Resizing(256, 256), # 若输入图像尺寸不一致,调整到目标尺寸 layers.Rescaling(1.0 / 255) # 将像素值归一化到0-1区间 ]) model = models.Sequential([ resize_and_rescale, layers.Conv2D(32, (3,3), activation='relu', input_shape=input_shape), layers.MaxPooling2D((2,2)), layers.Conv2D(64, (3,3), activation='relu'), layers.MaxPooling2D((2,2)), layers.Conv2D(64, (3,3), activation='relu'), layers.MaxPooling2D((2,2)), layers.Flatten(), layers.Dense(100, activation='relu'), layers.Dense(50, activation='relu'), layers.Dense(2, activation='softmax') ]) # model.build的input_shape需要包含batch维度,若Conv2D已指定input_shape,也可省略此步骤 model.build(input_shape=(32, 256, 256, 3)) model.summary()
方式二:自定义预处理函数(用Lambda层包装)
如果需要自定义预处理逻辑,必须用Lambda层将函数包装为可调用的层:
def resize_and_rescale_func(image): image = tf.image.resize(image, (256, 256)) return image / 255.0 # 用Lambda层包装成可调用的层 resize_and_rescale = layers.Lambda(resize_and_rescale_func)
2. 额外排查点
- 检查数据集格式:确保
train_ds和val_ds输出的是(图像张量, 标签)的元组,且图像张量的形状与模型输入(256,256,3)匹配 - 排查变量名冲突:确认代码中没有将
resize_and_rescale意外赋值为字符串(比如resize_and_rescale = "some_string")
内容的提问来源于stack exchange,提问作者Leo Tang
相关产品推荐
相关产品推荐

