自定义数据集二分类Quasi-SVM报RandomFourierFeatures层维度错误
问题复现
在自定义数据集上实现二分类Quasi-SVM模型时,参考Quasi-SVM示例编写的Keras模型代码如下,运行时触发维度不兼容报错:
model = keras.Sequential( [ keras.Input(shape=(50176,)), keras.layers.experimental.RandomFourierFeatures( output_dim=4096, scale=10.0, kernel_initializer="gaussian"), keras.layers.Dense(units=10), ] )
触发的完整报错信息:
层"random_fourier_features"的第0位输入与该层不兼容,期望输入维度数ndim=2,实际接收到的输入维度数ndim=4,收到的完整输入形状为(None, None, None, None)。
报错根因
RandomFourierFeatures层仅接受形状为(样本批量大小, 特征维度)的二维张量输入,报错说明实际传入模型的是4维张量(典型为未做展平的图像类数据,形状格式为(批量大小, 高度, 宽度, 通道数)),和keras.Input中声明的(50176,)二维输入形状完全不匹配,输入层声明和实际喂入数据的形状脱节。
修复方案
- 若原始输入本身是4维结构(比如尺寸为224224的单通道图像,展平后特征数恰好为224224*1=50176,和预设的特征维度匹配),直接在输入层后、
RandomFourierFeatures层前添加Flatten层做维度转换,同时修正二分类任务对应的输出层配置,参考代码如下:
model = keras.Sequential( [ # 替换为你实际的原始4维输入形状 keras.Input(shape=(224, 224, 1)), # 新增展平层,将4维输入转为(批量大小, 特征总数)的二维张量 keras.layers.Flatten(), keras.layers.experimental.RandomFourierFeatures( output_dim=4096, scale=10.0, kernel_initializer="gaussian"), # 二分类任务输出单元设为1,搭配hinge损失即可实现Quasi-SVM keras.layers.Dense(units=1), ] )
- 若你原本计划直接输入展平后的50176维特征,检查数据集预处理、加载逻辑,确保传入
model.fit()的训练、验证特征数组形状为(样本总数, 50176)的二维数组,不要保留原始数据的4维结构。 - 额外配置提醒:原代码中
Dense(units=10)是10分类任务的输出配置,做二分类Quasi-SVM时需要将输出单元数改为1,搭配合页损失(hinge loss)训练即可。
内容的提问来源于stack exchange,提问作者RamiDhouib1998
相关产品推荐
相关产品推荐

