一、第一层卷积 + 池化
less
// 第1层卷积:学边缘
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1], // 输入是28×28的灰度图
filters: 32, // 提取32种特征
kernelSize: 3, // 卷积核大小3×3
activation: 'relu' // 激活函数:非线性
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2]}));
作用:
- 卷积核(3×3)会扫描图片,学习到"局部边缘特征"(比如横线、竖线、斜线)。
- 32 个 filters 就相当于 32 双不同的"眼睛",每个眼睛关注不同方向的边缘。
relu
保证输出非线性,否则网络只能学直线关系。MaxPooling(2×2)
把特征图缩小一半,减少计算,同时保留"最显著"的特征(增强平移不变性)。
二、第二层卷积 + 池化
less
// 第2层卷积:学纹理
model.add(tf.layers.conv2d({
filters: 64,
kernelSize: 3,
activation: 'relu'
}));
model.add(tf.layers.maxPooling2d({poolSize: [2, 2]}));
作用:
- 在第一层学到"边缘"的基础上,这一层能把边缘组合成"纹理、角点、曲线"。
64 filters
= 64 种更复杂的特征检测器。- 再次
MaxPooling
→ 缩小尺寸,避免特征图过大。
三、第三层卷积
less
// 第3层卷积:学更复杂的形状
model.add(tf.layers.conv2d({
filters: 128,
kernelSize: 3,
activation: 'relu'
}));
model.add(tf.layers.flatten());
作用:
- 继续在"纹理"基础上,学习更高级的形状,比如:圈、数字结构、局部物体。
128 filters
= 学习更多样的复杂特征。Flatten
:把二维的特征图摊平成一维向量,方便后面的全连接层做分类。
四、全连接层
less
// 全连接层:组合特征
model.add(tf.layers.dense({units: 128, activation: 'relu'}));
作用:
- Dense 层相当于"大脑整合":把所有局部特征(边缘、纹理、形状)组合在一起。
units: 128
表示有 128 个神经元,每个神经元会学习一种组合方式。relu
继续保持非线性,增强表达能力。
五、输出层
less
// 输出层:分类 0-9
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
作用:
-
最终分类层,把上一步的综合特征转化为"属于每个类别的概率"。
-
units: 10
= 10 个类别(数字 0--9)。 -
softmax
会把输出变成概率分布,比如:csharp[0.01, 0.02, 0.05, 0.80, 0.02, 0.05, 0.01, 0.02, 0.01, 0.01]
→ 表示模型认为这张图是"3"的概率最高(80%)。