使用Theano后端的Keras添加Dense层时触发ValueError错误求助
解决Theano后端下Keras添加Dense层的ValueError问题
你遇到的问题核心是Theano与TensorFlow的图像数据格式不兼容!Theano默认采用channels_first(通道在前)的数据格式,而你的代码里用的是TensorFlow风格的channels_last(通道在后)输入形状,这会导致Flatten后的张量维度不符合Dense层的预期,进而抛出ValueError。
具体原因
Theano后端要求输入图像的形状为(通道数, 高度, 宽度),也就是(3, 64, 64);但你代码里写的input_shape=(64, 64, 3)是TensorFlow的channels_last格式,两者不匹配会让后续Flatten后的特征维度计算出错,无法和Dense层正常对接。
解决方案
有两种简单的修复方式,任选其一即可:
方式1:修改input_shape适配Theano格式
直接把Conv2D的input_shape改成(3, 64, 64),贴合Theano的通道在前要求:
from keras.models import Sequential from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense classifier = Sequential() # 调整input_shape为Theano支持的通道在前格式 classifier.add(Conv2D(32, (3, 3), input_shape=(3, 64, 64), activation='relu')) classifier.add(Conv2D(32, (3, 3), activation='relu')) classifier.add(MaxPooling2D(pool_size=(2, 2))) classifier.add(Flatten()) classifier.add(Dense(units=128, activation='relu')) # 别忘了添加二分类所需的输出层 classifier.add(Dense(units=1, activation='sigmoid'))
方式2:强制Keras使用channels_last格式
在代码开头添加一行配置,让Keras强制采用通道在后的格式(需确保你的Theano版本支持该设置,新版本一般都兼容):
from keras import backend as K # 强制设置图像数据格式为channels_last K.set_image_data_format('channels_last') from keras.models import Sequential from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense classifier = Sequential() classifier.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3), activation='relu')) classifier.add(Conv2D(32, (3, 3), activation='relu')) classifier.add(MaxPooling2D(pool_size=(2, 2))) classifier.add(Flatten()) classifier.add(Dense(units=128, activation='relu')) classifier.add(Dense(units=1, activation='sigmoid'))
额外提示
你的模型目前缺少最后一层用于二分类的输出层(比如上面代码里的Dense(units=1, activation='sigmoid')),记得补上,否则模型无法完成最终的分类任务。
内容的提问来源于stack exchange,提问作者Jay Rodge
相关产品推荐
相关产品推荐

