为何添加Keras的Dense层后模型准确率从36%提升至86%?
为什么添加Dense隐藏层后模型准确率大幅提升?
哈哈,这个现象太经典了,我来给你掰扯清楚为啥加了这么一层之后效果直接起飞:
1. 原模型是个“能力有限”的线性分类器
你之前的模型应该是直接把13维的输入特征连到3分类的输出层,相当于一个多分类逻辑回归模型——这是个纯线性模型,只能学习特征和类别之间的线性关系。但红酒数据集的特征和类别之间根本不是简单的线性映射:比如酒精含量、苹果酸含量这些特征,单独看和类别没啥直接线性关联,得组合起来(比如“高酒精+低苹果酸”)才能有效区分不同红酒类别。线性模型没法捕捉这种复杂的交互模式,所以准确率才会低到36%,基本和随机猜差不多(3分类随机猜的准确率约33%)。
2. 新增的Dense层给模型加了“特征提炼”的能力
你加的model.add(Dense(6, activation='relu'))是一个带ReLU激活的全连接隐藏层,它的核心作用有两个:
- 特征组合:6个神经元相当于让模型自动学习6种不同的高级复合特征——把原始的13个特征进行加权组合,生成更有区分度的中间特征(比如“酸度0.5 + 酒精含量0.8”这类模式);
- 非线性映射:ReLU激活函数打破了线性限制,让模型能拟合数据里的非线性关系。没有激活函数的话,就算加了隐藏层,整个模型还是线性的(因为线性变换的叠加还是线性变换),ReLU的存在才真正让模型拥有了处理复杂数据的能力。
3. 结合红酒数据集的具体表现
红酒数据的类别区分本来就依赖多个特征的复杂交互,新增的隐藏层相当于给模型加了一步“思考”:先把原始的零散特征加工成能精准区分类别的高级特征,再用这些特征去做分类,自然就能把准确率从接近瞎蒙的水平拉到86%。
前后模型代码对比
原模型(线性分类器):
model = Sequential() # 直接从输入层到输出层,无隐藏层 model.add(Dense(3, activation='softmax', input_shape=(13,)))
添加隐藏层后的模型(非线性模型):
model = Sequential() # 新增的非线性隐藏层 model.add(Dense(6, activation='relu', input_shape=(13,))) model.add(Dense(3, activation='softmax'))
内容的提问来源于stack exchange,提问作者Official Y.G.K
相关产品推荐
相关产品推荐

