Keras Sequential模型调用compile()报缺少self参数TypeError排查
问题现象
跟随TensorFlow教程构建卷积神经网络时遇到编译报错,线上检索未找到匹配解决方案。
原错误代码如下:
cnn = keras.Sequential ([ # 卷积层部分 layers.Conv2D(filters=32, kernel_size=(3,3), activation="relu", input_shape=(32,32,3)), layers.MaxPooling2D((2,2)), layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu"), layers.MaxPooling2D((2,2)), # 全连接层部分 layers.Flatten(), layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax") ]) cnn.compile( optimizer = "adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )
代码运行到cnn.compile(行时抛出错误:
TypeError: Model.compile() missing 1 required positional argument: 'self'
排查过程中替换了其他项目中已验证可正常运行的compile配置代码,仍然抛出相同错误;调试时可识别到cnn变量存在.compile方法,因此排除compile参数配置错误,定位问题出在cnn变量的实例化环节。
根因分析
Python语法规则下,类名/函数名和后续表示调用的左括号(之间如果直接换行,会被解析为两条独立的语句:
- 第一条语句
cnn = keras.Sequential:将Sequential类本身赋值给cnn变量,而非类初始化后生成的模型实例对象 - 第二条语句
([...层列表...]):只是一个独立定义的列表,既没有作为参数传入Sequential的初始化方法,也没有赋值给任何变量
此时调用cnn.compile()本质是直接通过类调用实例方法,没有传入绑定的实例对象作为self参数,因此触发参数缺失报错。
修复方法
将keras.Sequential和后续的调用左括号放在同一行,保证类被正确初始化即可修复问题,修正后的代码如下:
cnn = keras.Sequential([ # 卷积层部分 layers.Conv2D(filters=32, kernel_size=(3,3), activation="relu", input_shape=(32,32,3)), layers.MaxPooling2D((2,2)), layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu"), layers.MaxPooling2D((2,2)), # 全连接层部分 layers.Flatten(), layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax") ]) cnn.compile( optimizer = "adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )
补充:如果有换行排版需求,也可以在keras.Sequential行末尾加反斜杠\做续行标记,但更推荐类名和调用左括号同行的写法,可读性更强,也能避免这类低级语法错误。
内容的提问来源于stack exchange,提问作者Lorvarz
相关产品推荐
相关产品推荐

