Conv2D下采样致维度≤0的ValueError问题求助
解决Keras Tuner中Conv2D层输出维度≤0的ValueError
错误根源分析
- 超参数名称冲突:第一个Conv2D的
kernel_size误用了与filters相同的超参数名conv_1_filter,导致kernel_size被赋值为32/48等大数值(而非预期的3/5)。当卷积核尺寸大于输入特征图尺寸时,输出维度直接变为负数。 - 数据格式不匹配:指定
data_format='channels_first'但输入形状是(28,28,1)(channels_last格式),导致维度顺序混乱,加剧尺寸计算错误。 - 潜在尺寸缩小风险:第二个Conv2D未明确padding策略,连续使用valid卷积可能在极端组合下导致特征图尺寸过小。
- 损失函数名称错误:原代码中
'Sparse_Categorical_Crossentropy'的下划线位置错误,正确名称应为'SparseCategoricalCrossentropy'。
修正后的代码
def build_model(hp): model = keras.Sequential() # 修正1:为kernel_size设置独立超参数名,避免与filters冲突 model.add(layers.Conv2D( filters=hp.Int('conv_1_filter', min_value=32, max_value=128, step=16), kernel_size=hp.Choice('conv_1_kernel', values=[3,5]), activation='relu', input_shape=(28,28,1), padding='valid', # 修正2:对齐数据格式,输入为channels_last格式 data_format='channels_last' )) # 修正3:同样为第二个Conv2D的kernel_size设置独立超参数名 model.add(layers.Conv2D( filters=hp.Int('conv_2_filter', min_value=32, max_value=64, step=16), kernel_size=hp.Choice('conv_2_kernel', values=[3,5]), activation='relu', # 可选:添加same padding避免特征图尺寸过度缩小 padding='same' )) model.add(layers.Flatten()) model.add(layers.Dense( units=hp.Int('dense_1_units', min_value=32, max_value=128, step=16), activation='relu' )) model.add(layers.Dense(10, activation='softmax')) model.compile( optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2,1e-3])), # 修正4:修正损失函数名称 loss='SparseCategoricalCrossentropy', metrics=['accuracy'] ) return model tuner_search=keras_tuner.RandomSearch( build_model, objective='val_accuracy', max_trials=5 )
关键修改说明
- 超参数命名:将Conv2D的kernel_size超参数分别命名为
conv_1_kernel和conv_2_kernel,确保取值为预期的3或5。 - 数据格式对齐:输入形状
(28,28,1)对应channels_last格式,与Keras默认格式一致,避免维度解析错误。 - Padding策略:添加
padding='same'可保证卷积后特征图尺寸不变,彻底规避维度为负的问题。 - 损失函数修正:修正名称拼写错误,确保模型正常编译。
内容的提问来源于stack exchange,提问作者Anna Zhu
相关产品推荐
相关产品推荐

