简单的卷积神经网络识别数字
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
1. 加载数据集 (MNIST 手写数字)
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
2. 数据预处理
x_train = x_train.reshape((-1, 28, 28, 1)).astype("float32") / 255.0 # 加通道维度 & 归一化
x_test = x_test.reshape((-1, 28, 28, 1)).astype("float32") / 255.0
3. 建立 CNN 模型
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), # 卷积层
layers.MaxPooling2D((2, 2)), # 池化层
layers.Conv2D(64, (3, 3), activation='relu'), # 再来一层卷积
layers.MaxPooling2D((2, 2)),
layers.Flatten(), # 拉平成一维
layers.Dense(64, activation='relu'), # 全连接层
layers.Dense(10, activation='softmax') # 输出10类(0-9)
])
4. 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
5. 训练模型
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
6. 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"测试集准确率: {test_acc:.4f}")
7. 预测
import numpy as np
import matplotlib.pyplot as plt
sample = x_test[0] # 取一张图片
plt.imshow(sample.reshape(28,28), cmap="gray")
plt.show()
pred = model.predict(np.expand_dims(sample, axis=0))
print("预测结果:", pred.argmax())
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
👉 请来帮手:
tensorflow:深度学习的“大脑框架”。datasets:自带一些常用数据集(比如手写数字)。layers:神经网络的“积木块”(卷积层、池化层、全连接层等)。models:用来把积木块拼成完整的网络。
# 1. 加载数据集 (MNIST 手写数字)
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
👉 从 datasets 里拿出 MNIST 数据集:
x_train:训练图片(60000 张,28×28 灰度图)。y_train:训练标签(每张图对应的数字 0–9)。x_test:测试图片(10000 张)。y_test:测试标签。
就像拿到一本“手写数字练习册”,前面用来教 AI,后面用来考试。
# 2. 数据预处理
x_train = x_train.reshape((-1, 28, 28, 1)).astype("float32") / 255.0
x_test = x_test.reshape((-1, 28, 28, 1)).astype("float32") / 255.0
👉 数据加工:
.reshape((-1, 28, 28, 1)):给图片加一个“通道维度”(最后的 1 表示灰度图像)。.astype("float32"):把数据转成浮点数,方便计算。/ 255.0:把像素从0~255压缩到0~1,让模型更容易学。
就好比给学生先把图片剪好、排好格式。
# 3. 建立 CNN 模型
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), # 卷积层
layers.MaxPooling2D((2, 2)), # 池化层
layers.Conv2D(64, (3, 3), activation='relu'), # 再来一层卷积
layers.MaxPooling2D((2, 2)),
layers.Flatten(), # 拉平成一维
layers.Dense(64, activation='relu'), # 全连接层
layers.Dense(10, activation='softmax') # 输出10类(0-9)
])
👉 搭建大脑:
Sequential:一层层往下堆,像乐高积木。Conv2D(32, (3,3), ...):卷积层,32 个小滤镜,每个滤镜大小 3×3,用来找图片里的小特征(边、角)。MaxPooling2D((2,2)):池化层,把图缩小一半,减少计算。- 再加一层卷积 + 池化:让模型学更复杂的形状。
Flatten():把二维图片摊平成一维数组,方便送到全连接层。Dense(64, activation='relu'):全连接层,64 个神经元,负责综合特征。Dense(10, activation='softmax'):输出层,10 个结果,对应数字 0–9,每个数是概率。
# 4. 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
👉 告诉模型怎么玩:
optimizer='adam':聪明的调参工人,自动调整学习速度。loss='sparse_categorical_crossentropy':计算预测和正确答案差多少,专门用于“分类问题”。metrics=['accuracy']:额外统计准确率。
# 5. 训练模型
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
👉 开始上课:
fit就是“训练”。epochs=3:重复学三遍。validation_data=(x_test, y_test):边学边拿测试集考一考,防止死记硬背。
# 6. 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"测试集准确率: {test_acc:.4f}")
👉 期末考试:
evaluate:用测试集打分。test_acc:就是最终的考试分数(准确率)。
# 7. 预测
import numpy as np
import matplotlib.pyplot as plt
sample = x_test[0] # 取一张图片
plt.imshow(sample.reshape(28,28), cmap="gray")
plt.show()
pred = model.predict(np.expand_dims(sample, axis=0))
print("预测结果:", pred.argmax())
👉 随机考一道题:
x_test[0]:拿第一张测试图片。plt.imshow(...):显示出来。np.expand_dims(sample, axis=0):加一个“批次维度”,因为模型习惯一批一批算。model.predict(...):让模型算答案。pred.argmax():找出概率最大的数字,就是预测结果。
✅ 总结:
这段代码就是一个“AI 学生学数学”的故事:
- 给它看很多手写数字(教材)。
- 搭建一个“眼睛+大脑”的结构(CNN)。
- 训练它,让它学会区分数字。
- 考试看看成绩。
- 随便抽一张图,让它答题。
更多推荐


所有评论(0)