Jupyter Notebook中调用model.summary()报Undefined shapes are not supported错误求助
解决方案:Sequential模型调用model.summary()报Undefined shapes错误
核心原因
Keras 3.x中,Sequential模型如果无法自动推断各层的输入/输出形状,调用model.summary()就会触发该错误。Jupyter Notebook环境的默认配置和Colab存在差异,导致Colab能自动处理的形状推断在本地Notebook中失效。
具体解决方法
1. 显式指定模型输入形状
这是最直接的解决方案,在模型第一层明确input_shape参数,或者添加Input层作为起始层:
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, Input # 方式一:在第一层设置input_shape model = Sequential([ Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)), Dense(10, activation='softmax') ]) # 方式二:用Input层定义输入形状 model = Sequential([ Input(shape=(28,28,1)), Conv2D(32, (3,3), activation='relu'), Dense(10, activation='softmax') ]) model.summary() # 此时可正常执行
2. 修复动态形状层的形状推断
如果模型中包含Lambda、自定义层等无法自动推断输出形状的组件,需要显式指定output_shape:
from tensorflow.keras.layers import Lambda import tensorflow as tf model = Sequential([ Input(shape=(28,28)), # 明确Lambda层的输出形状 Lambda(lambda x: tf.expand_dims(x, axis=-1), output_shape=(28,28,1)), Conv2D(32, (3,3), activation='relu') ])
3. 手动触发形状推断
如果不想提前指定输入形状,可以先给模型喂入一个符合格式的dummy样本,让模型自动推断各层形状后再调用summary:
import numpy as np model = Sequential([ Conv2D(32, (3,3), activation='relu'), Dense(10, activation='softmax') ]) # 喂入一个批量为1的dummy输入 dummy_input = np.random.rand(1, 28, 28, 1) model(dummy_input) # 此时可正常生成summary model.summary()
4. 环境兼容性调整
Python 3.12属于较新版本,TensorFlow 2.17对其的适配可能存在局部问题,可尝试:
- 降级Python到3.11版本,这是当前深度学习生态兼容性更好的版本
- 验证Jupyter Notebook的内核是否绑定了正确的虚拟环境(在Notebook中执行
!python --version和!pip list确认版本匹配)
关于Colab训练慢的补充
Colab默认可能使用CPU运行,可通过以下步骤切换到加速硬件:
- 点击顶部菜单栏的
Runtime->Change runtime type - 在
Hardware accelerator下拉菜单中选择GPU或TPU,保存后重新运行代码
内容的提问来源于stack exchange,提问作者teikson tan
相关产品推荐
相关产品推荐

