用Keras搭建CNN图像分类模型需三步:1. 数据准备——加载MNIST并归一化、扩维、one-hot编码;2. 模型定义——Sequential堆叠Conv2D、MaxPooling2D、Flatten和Dense层;3. 编译训练——选Adam优化器、categorical_crossentropy损失及accuracy指标,再评估预测。

用Keras构建深度学习模型并不难,关键在于理解数据、模型、训练三者的衔接逻辑。下面以图像分类任务为例,带你从零搭建一个可运行的CNN模型,不绕弯子,直击实操要点。
准备数据:加载+预处理一步到位
Keras内置了常用数据集(如MNIST、CIFAR-10),适合快速验证模型结构。以MNIST为例:
- 直接调用keras.datasets.mnist.load_data()获取训练/测试图像与标签
- 图像像素值默认是0–255的整数,需归一化为0–1的float32:用x_train.astype('float32') / 255
- 灰度图需增加通道维度:用x_train[..., tf.newaxis]或np.expand_dims(x_train, -1)
- 标签转为one-hot编码(适用于多分类):tf.keras.utils.to_categorical(y_train, 10)
定义模型:用Sequential还是Functional?
新手推荐Sequential——结构清晰、代码简洁;遇到多输入、多输出或共享层时再切到Functional API。
- 基础CNN示例:
model = Sequential([ Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)), MaxPooling2D(), Conv2D(64, (3,3), activation='relu'), MaxPooling2D(), Flatten(), Dense(64, activation='relu'), Dense(10, activation='softmax') ]) - 每层输出形状会自动推导,但建议在input_shape处明确写清(含batch维度以外的尺寸)
- 最后一层神经元数=类别数,激活函数选softmax(多分类)或sigmoid(二分类)
编译与训练:参数别硬套,看任务选指标
编译阶段决定“怎么学”,训练阶段控制“学多久”:
立即学习“Python免费学习笔记(深入)”;
- optimizer:初学用Adam(自适应学习率,收敛稳)
- loss:多分类+one-hot标签 → 'categorical_crossentropy';多分类+整数标签 → 'sparse_categorical_crossentropy'
- metrics:至少加['accuracy'],便于观察训练效果
- model.fit()中设置validation_split=0.2可自动划分验证集,省去手动切分
评估与预测:别只看准确率
训练完要真正检验模型是否学到了泛化能力:
- 用model.evaluate(x_test, y_test)得到测试集上的loss和accuracy
- 用model.predict(x_test[:5])查看前5个样本的预测概率分布,配合np.argmax()还原类别索引
- 画混淆矩阵、查准率/查全率?用sklearn.metrics.classification_report和confusion_matrix即可
不复杂但容易忽略:每次改模型结构后记得重新编译(model.compile()),否则训练用的仍是旧配置。跑通第一个模型后,再逐步加Dropout、BatchNorm、数据增强,迭代优化。










