TensorFlow/Keras入门:用手写数字识别体验深度学习

 

一、为什么选手写数字识别?

• 经典入门案例:MNIST数据集包含6万张0-9的手写数字图片,相当于机器学习的“Hello World”,模型易理解且效果直观。

• 类比场景:就像教孩子认数字,模型通过学习大量手写体,能识别不同风格的笔迹(连笔、潦草字等)。

二、5分钟环境准备

1. 安装TensorFlow:在命令行输入pip install tensorflow(建议用Python 3.7-3.9)。

2. 导入核心库:在Jupyter Notebook中输入:
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
3. 确认版本:print(tf.__version__),确保版本≥2.0(Keras已集成在TensorFlow中)。

三、核心代码解析:15行实现识别模型
# 1. 加载MNIST数据(内置数据集)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2. 数据预处理:归一化像素值到0-1
x_train = x_train / 255.0
x_test = x_test / 255.0

# 3. 构建神经网络模型
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),  # 把28×28图片展平成784维向量
    keras.layers.Dense(128, activation='relu'),  # 128个神经元,relu激活函数
    keras.layers.Dense(10, activation='softmax')  # 10个输出(对应0-9),softmax转概率
])

# 4. 编译模型(指定优化器、损失函数、评估指标)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 5. 训练模型(迭代5次)
model.fit(x_train, y_train, epochs=5)

# 6. 评估模型在测试集上的表现
test_loss, test_acc = model.evaluate(x_test, y_test)
print('测试准确率:', test_acc)

# 7. 预测一张新图片(比如第0张测试图片)
plt.imshow(x_test[0], cmap='gray')
pred = model.predict(x_test[0:1])  # 输入需是四维张量,[0:1]表示取第0张
print('预测数字:', pred.argmax(axis=1))  # 取概率最大的类别
四、代码逐模块拆解(非编程新手也能懂)

1. 数据加载与预处理:

◦ MNIST图片是28×28的灰度图,像素值0-255,除以255后转为0-1的浮点数(方便模型计算)。

◦ 类比:把不同亮度的图片统一调至标准亮度,让模型更容易学习。

2. 模型架构解析:

◦ Flatten层:把28×28的图片“拍扁”成784个数字,就像把一幅画拆成784个像素点。

◦ Dense层(全连接层):

◦ 第一层128个神经元,用relu函数激活(类似“只传递正数信号”),提取笔画特征(如横线、竖线)。

◦ 第二层10个神经元,用softmax函数输出每个数字的概率(如“数字5的概率90%”)。

3. 训练过程:

◦ epochs=5表示让模型学习5轮,每轮用6万张图片反复“刷题”,调整神经元的连接权重(类似学生刷题调整解题思路)。

◦ 损失函数sparse_categorical_crossentropy衡量预测概率与真实标签的差距,优化器adam自动调整参数让损失最小。

五、运行结果与可视化

• 测试准确率:通常在98%以上,即100张新手写数字图中,模型能认对98张。

• 可视化预测过程:
    左图是真实手写数字“7”,右图显示模型预测为“7”的概率达99.2%。

六、新手必懂的深度学习核心概念

1. 神经元与权重:

◦ 每个神经元接收前一层的输入,乘以权重(类似“重要程度”)后求和,再通过激活函数输出。

◦ 类比:认数字时,神经元对“竖线特征”的权重高,遇到竖线多的图片会倾向于判断为“1”或“7”。

2. 反向传播:

◦ 训练时,模型先预测,再根据损失函数计算“哪里错了”,然后从输出层倒推,调整每一层的权重(如增加“竖线特征”的权重)。

◦ 类比:学生做完题对答案,发现“把7写成9”,下次会刻意加强“竖线”的书写记忆。

七、扩展玩法:自定义手写数字测试

1. 用画图软件写数字:

◦ 画28×28的黑白图(黑底白字),保存为png,读取后预处理:
from PIL import Image
img = Image.open('my_digit.png').convert('L')  # 转灰度图
img = img.resize((28, 28), Image.LANCZOS)
img_array = np.array(img) / 255.0
pred = model.predict(img_array.reshape(1, 28, 28))
2. 调参优化:

◦ 增加隐藏层数量(如加一层Dense(64)),或调整学习率(optimizer=keras.optimizers.Adam(learning_rate=0.001)),观察准确率变化。

八、实战口诀(深度学习四步走)

1. 数据处理:归一化、分训练集和测试集;

2. 搭积木式建模:用Keras.layers堆叠层(Flatten→Dense→Dense);

3. 编译训练:选对损失函数(分类用交叉熵,回归用MSE);

4. 评估预测:用真实数据验证,可视化结果。

结语:手写数字识别是深度学习的“敲门砖”,掌握它后,你可以尝试用CNN(卷积神经网络)提升准确率,或挑战CIFAR-10(彩色图片分类)等更复杂任务~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值